应用脚本 - 自动从Google云端硬盘删除文件超过3天 - 获取文件列表

时间:2015-02-19 23:23:54

标签: javascript file date google-apps-script google-drive-api

我正在使用我的Google云端硬盘来存储家中IP摄像机的动态侦测录像。我正在运行以下脚本(稍加修改)以自动从Google云端硬盘中删除超过3天的文件:

Automatically delete files in google drive

脚本设置为每天凌晨5点左右运行。我遇到的问题是,当有太多文件需要删除时,我收到错误消息,说我已经超过了最大写入速率。这是因为set trashed命令包含在for循环中。如果我添加一个睡眠来减慢循环,那么我得到另一个错误,说脚本没有在允许的时间内完成。

我可能只跑2到3次,但那很笨重。

如何修改此脚本以使其创建要删除的文件的临时列表,当它最终退出循环时,执行删除?我对GAS语言和语法没有太多经验,所以细节真的很棒。

3 个答案:

答案 0 :(得分:3)

此代码将返回超过30天的所有文件ID。它与另一篇文章中引用的代码非常不同。您正在使用的代码中包含一个已弃用的类。 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()语句,运行代码,并根据需要查看代码返回的内容。有一个Logger.log()声明:

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

这将打印检索到的文件的日期。所以你可以在删除任何文件之前查看它。

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

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

如果您想删除文件而不先将其设置为已删除,则可以这样做。

您需要在开发人员控制台中的Apps脚本项目 AND 中明确启用高级Google服务。如果你不做这两件事,它就不会工作。

//This requires the Drive API To be turned on in the Advanced Google Services
//Under the RESOURCES menu, choose ADVANCED GOOGLE SERVICES
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]);
  }
};

答案 1 :(得分:1)

我提出了另一个解决方案。这仅适用于您的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云端硬盘&#34;卧室&#34;删除所有超过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任务计划程序自动运行脚本。

问题解决了。

答案 2 :(得分:0)

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

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