Apps 脚本 - 自动从 Google 驱动器中删除超过 3 天的文件 - 获取文件列表

Apps Script - Automatically Delete Files from Google Drive Older than 3 Days - Get List of Files

我正在使用我的 Google 驱动器来存储来自家中 IP 摄像机的运动检测记录。我正在 运行 使用以下脚本(稍作修改)自动从我的 Google 驱动器中删除超过 3 天的文件:

Automatically delete files in google drive

脚本设置为每天早上 5 点左右 运行。我 运行 遇到的问题是,当要删除的文件太多时,我收到一条错误消息,提示我已超出最大写入速率。这是因为 set trashed 命令包含在 for 循环中。如果我添加睡眠以减慢循环速度,则会收到另一个错误,指出脚本未在允许的时间内完成。

我可能只 运行 2 或 3 次,但这很笨重。

我如何修改这个脚本让它创建一个要删除的文件的临时列表,并在它最终跳出循环时执行删除?我对 GAS 语言和语法没有太多经验,所以具体细节会非常棒。

此代码将 return 所有超过 30 天的文件的文件 ID。它与另一个 post 中引用的代码非常不同。您正在使用的代码中有一个已弃用的 class 。 DocsList 现已弃用。我给你的代码使用 DriveApp,并使用 searchFiles() 方法。

Google Documentation - Search Files

gs 脚本

function getFilesByDate() {
  var arrayOfFileIDs = [];
  
  var ThirtyDaysBeforeNow = new Date().getTime()-3600*1000*24*30;
    // 30 is the number of days 
    //(3600 seconds = 1 hour, 1000 milliseconds = 1 second, 24 hours = 1 day and 30 days is the duration you wanted
    //needed in yr-month-day format
  
  var cutOffDate = new Date(ThirtyDaysBeforeNow);
  var cutOffDateAsString = Utilities.formatDate(cutOffDate, "GMT", "yyyy-MM-dd");
  //Logger.log(cutOffDateAsString);

  var theFileID = "";
  
  //Create an array of file ID's by date criteria
  var files = DriveApp.searchFiles(
     'modifiedDate < "' + cutOffDateAsString + '"');

  while (files.hasNext()) {
    var file = files.next();
    theFileID = file.getId();

    arrayOfFileIDs.push(theFileID);
    //Logger.log('theFileID: ' + theFileID);
    //Logger.log('date last updated: ' + file.getLastUpdated());
  }
  
  return arrayOfFileIDs;
  //Logger.log('arrayOfFileIDs: ' + arrayOfFileIDs);
};

您可以取消对 Logger.log() 语句、运行 代码的注释,并根据需要查看代码 return 的内容。以下 Logger.log() 语句:

//Logger.log('date last updated: ' + file.getLastUpdated());

将打印检索到的文件的日期。

以上代码不会删除任何文件,也不会将任何内容设置为已删除。它只是按日期搜索文件,并创建一个包含所有文件 ID 的数组。

所以删除或删除文件的函数可以首先调用该函数并获取要处理的所有文件 ID 的列表。

最好先测试代码而不删除任何文件,以确保代码在 运行 删除任何内容的版本之前获取正确的文件。

如果您想在不先将文件设置为 trashed 的情况下删除文件,可以这样做。

以下示例使用高级 Google 驱动器服务。请参阅文档了解当前启用高级驱动服务的方法。

//To delete a file without first sending it to the trash requires the Advanced Drive API to be enabled

function deleteFile(idToDLET) {
  idToDLET = 'the File ID';
  
  //This deletes a file without needing to move it to the trash
  var rtrnFromDLET = Drive.Files.remove(idToDLET);
}

要调用获取要删除的文件 ID 的函数,它看起来像这样:

警告!这会删除文件而不会将它们发送到垃圾箱! **** 确保您知道正在删除的内容!

function deleteFiles() {
  var arrayIDs = getFilesByDate();
  
  for (var i=0; i < arrayIDs.length; i++) {
    Logger.log('arrayIDs[i]: ' + arrayIDs[i]);
    //This deletes a file without needing to move it to the trash
    var rtrnFromDLET = Drive.Files.remove(arrayIDs[i]);
  }
};

我想到了另一个解决方案。仅当您的 Google 云端硬盘文件已同步到您的硬盘时才有效。

如果您的 Google 驱动器文件已同步到您的硬盘驱动器,那么如果您在本地硬盘驱动器文件夹中删除它们,它们也会从 Google 驱动器中删除。因此,接下来的任务就是如何从您的 Google 文件夹中自动删除超过 X 天的文件。

这是一个 Windows Powershell 脚本,可以让您做到这一点:https://gallery.technet.microsoft.com/scriptcenter/Delete-files-older-than-x-13b29c09

运行 具有此配置的脚本:

powershell -file c:\users\owner\documents\windows\deleteold\deleteold.ps1 -FolderPath "C:\Users\owner\Google Drive\iSpy\video\Bedroom" -FileAge 30 -logfile c:\users\owner\documents\windows\deleteold\logs\Bedroom.log -CreateTime -NoFolder

我可以从同步的 Google Drive "Bedroom" 文件夹中删除所有超过 30 天的 iSpy 文件。

遵循这些说明:

http://blogs.technet.com/b/heyscriptingguy/archive/2012/08/11/weekend-scripter-use-the-windows-task-scheduler-to-run-a-windows-powershell-script.aspx

我能够 运行 使用 Windows 任务计划程序自动执行脚本。

问题已解决。

使用 Sandy 上面发布的解决方案,我将其修改为特定于文件夹。

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);
  });
};