应用程序脚本-自动从谷歌驱动器删除超过3天的文件-获取文件列表



我正在使用Google Drive存储家中IP摄像头的运动检测记录。我正在运行以下脚本(略有修改),以自动从我的谷歌驱动器中删除超过3天的文件:

自动删除谷歌驱动器中的文件

剧本定于每天早上5点左右播出。我遇到的问题是,当有太多的文件要删除时,我会收到一个错误,说我已经超过了最大写入速率。这是因为set trash命令包含在for循环中。如果我添加睡眠来减缓循环,那么我会收到另一个错误,说脚本没有在允许的时间内完成。

我可能只跑两三次,但那太笨重了。

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

此代码将返回超过30天的文件的所有文件ID。它与其他帖子中引用的代码非常不同。您正在使用的代码中有一个不推荐使用的类。DocsList现在不推荐使用。我给您的代码使用DriveApp,并使用searchFiles()方法。

谷歌文档-搜索文件

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()语句的注释,运行代码,并查看代码返回的内容。以下Logger.log()语句:

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

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

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

因此,删除或丢弃文件的函数可以首先调用该函数,并获得所有要处理的文件ID的列表

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

如果您想删除文件而不首先将其设置为垃圾,那是可以做到的。

下面的示例使用高级谷歌硬盘服务。有关启用高级驱动器服务的当前方式,请参阅文档。

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

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

我想出了另一个解决方案。只有当你的谷歌硬盘文件同步到你的硬盘时,这才有效。

如果你的Google Drive文件同步到你的硬盘,那么如果你在本地硬盘文件夹中删除它们,它们也会从Google Drive中删除。因此,任务变成了如何从你的谷歌文件夹中自动删除超过X天的文件。

这是一个Windows Powershell脚本,它将允许您执行以下操作:https://gallery.technet.microsoft.com/scriptcenter/Delete-files-older-than-x-13b29c09

使用以下配置运行脚本:

powershell -file c:usersownerdocumentswindowsdeleteolddeleteold.ps1 -FolderPath "C:UsersownerGoogle DriveiSpyvideoBedroom" -FileAge 30 -logfile c:usersownerdocumentswindowsdeleteoldlogsBedroom.log -CreateTime -NoFolder

我可以从同步的谷歌硬盘"卧室"文件夹中删除所有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任务计划程序自动运行脚本。

问题解决了。

最新更新