'Automatically Delete Files from Google Drive Older than n days - "getFolderById" issue

I'm trying to delete files and folders older than 7 days in a specific Team Drive (not in the whole Google Drive).

To accomplish this I tried to merge what I read here: Apps Script - Automatically Delete Files from Google Drive Older than 3 Days - Get List of Files

I don't have enough rep to add a comment there so that's why I'm opening a new thread. Here you can find my ripoff from user1588938:

function getOldFileIDs() {
  var fileIDs = [];
  // Old date is 30 days
  var oldDate = new Date().getTime() - 3600*1000*24*30;
  var cutOffDate = Utilities.formatDate(new Date(oldDate), "GMT", "yyyy-MM-dd");

  // Get folderID using the URL on google drive
  var folder = DriveApp.getFolderById('XXXXXXX');
  var files = folder.searchFiles('modifiedDate < "' + cutOffDate + '"');

  while (files.hasNext()) {
    var file = files.next();
    fileIDs.push(file.getId());
    Logger.log('ID: ' + file.getId() + ', Name: ' + file.getName());
  }
  return fileIDs;
};

function deleteFiles() {
  var fileIDs = getOldFileIDs();
  fileIDs.forEach(function(fileID) {
    DriveApp.getFileById(fileID).setTrashed(true);
  });
};

I'm stuck with 'getFolderById' function because I suppose it doesn't apply to a Team Drive root but only works for folders inside of it. Indeed, when I look at the logs I can see that the output for:

  var folder = DriveApp.getFolderById('this-is-my-team-drive-id');  

is a generic: [18-07-30 06:34:49:146 PDT] Team Drive and not the name of the Team Drive I chose.

I can't go any further with the script because of this.

Any hint on how to list every file and subfolder in a Team Drive using searchFiles?

This solution might apply but it works for a folder inside a Team Drive and not on the root of the Team Drive: browse files in google team drive

Thanks!



Solution 1:[1]

If someone out there is trying to achieve the same result, this is how you do it.

function deleteOldFiles() {
  var Folders = new Array(
    'YOUR-TEAM-DRIVE-ID' //you can find this in the team drive url
  );
  var DaysRetentionNumber = 15; //how many days old your files and folders must be before getting deleted?
  var RetentionPeriod = DaysRetentionNumber * 24 * 60 * 60 * 1000;

  Logger.clear();

  for each (var FolderID in Folders) {
    folder = DriveApp.getFolderById(FolderID);
    processFolder(folder);
  }

  function processFolder(folder){
    Logger.log('Folder: ' + folder.getName());
    var files = folder.getFiles();
    while (files.hasNext()) {
      var file = files.next();
      Logger.log('File: ' + file.getName());
      if (new Date() - file.getLastUpdated() > RetentionPeriod) {
        //file.setTrashed(true); //uncomment this line to put them in the trash
        //Drive.Files.remove(file.getId()); //uncomment this line to delete them immediately; CAREFUL!
        Logger.log('File '+ file.getName() + ' trashed');
      }
    }
    var subfolders = folder.getFolders();
    while (subfolders.hasNext()) {
      subfolder = subfolders.next();
      processFolder(subfolder);
    }
    checkEmptyFolder(folder);
  }

  function checkEmptyFolder(folder){
    if(!folder.getFiles().hasNext() && !folder.getFolders().hasNext()){
      Logger.log('Empty folder: '+ folder.getName());
      folder.setTrashed(true); // put them in the trash
    }
  }

  if(Logger.getLog() != '')
     MailApp.sendEmail('youremailaddresshere', 'Team Drive weekly cleanup report', Logger.getLog()); //get a log in your email so that you can see what will be deleted; try this before uncommenting the trash/delete lines!
}

Solution 2:[2]

@Daniele INeDiA's script is broken due to various reasons:

  1. The script fails withReferenceError: "Drive" is not defined. (line 24, file "Code"), which refers to //uncomment this line to delete them immediately;
  2. The script also fails because of Access denied: DriveApp. (line 39, file "Code"), in case the root folder is empty. It's because it doesn't differentiate between the root folder and its sub folders.

I've fixed #1 by simply leaving it commented out, but here's a fixed version for #2.

While at it, I've also added a feature to always delete (always_delete on/off). That way you can schedule it to run every night to make sure you start the day with an empty folder.
Also while at it, I've added an on/off switch to send a log by e-mail.

P.S. I did see tehhowch's comment that "for each (... in ...) is deprecated", so feel free to add an alternative and I'll use it instead.

function deleteOldFiles() {
  var sendlog = false, Folders = new Array(
    'YOUR-TEAM-DRIVE-ID' //you can find this in the team drive url
  );
  var DaysRetentionNumber = 15; //how many days old your files and folders must be before getting deleted?
  var RetentionPeriod = DaysRetentionNumber * 24 * 60 * 60 * 1000;
  var always_delete = true;

  Logger.clear();

  for each (var FolderID in Folders) {
    folder = DriveApp.getFolderById(FolderID);
    processFolder(folder, FolderID);
  }

  function processFolder(folder, FolderID){
    Logger.log('Folder: ' + folder.getName());
    var files = folder.getFiles();
    while (files.hasNext()) {
      var file = files.next();
      if (!always_delete)
        Logger.log('File: ' + file.getName());
      if (always_delete || new Date() - file.getLastUpdated() > RetentionPeriod) {
        file.setTrashed(true); //uncomment this line to put them in the trash
        // Don't uncomment the following because it breaks the script!
        //Drive.Files.remove(file.getId()); //uncomment this line to delete them immediately; CAREFUL!
        Logger.log('File '+ file.getName() + ' trashed');
      }
    }
    var subfolders = folder.getFolders();
    while (subfolders.hasNext()) {
      subfolder = subfolders.next();
      processFolder(subfolder);
    }
    if(Folders.indexOf(FolderID) == -1)
      checkEmptyFolder(folder);
  }

  function checkEmptyFolder(folder){
    if(!folder.getFiles().hasNext() && !folder.getFolders().hasNext()){
      Logger.log('Empty folder: '+ folder.getName());
      folder.setTrashed(true); // put them in the trash
    }
  }

  if(sendlog && Logger.getLog() != '')
     MailApp.sendEmail('youremailaddresshere', 'Team Drive cleanup report', Logger.getLog()); //get a log in your email so that you can see what will be deleted; try this before uncommenting the trash/delete lines!
}

Sources

This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.

Source: Stack Overflow

Solution Source
Solution 1 Daniele INeDiA
Solution 2