22

如何编写删除文件的 Google Apps 脚本?

这会找到文件:

var ExistingFiles = DocsList.find(fileName);

DocsList.deleteFile不存在删除文件。

有没有办法将这些文件移动到另一个文件夹或垃圾箱?

我会考虑的另一个解决方法是能够覆盖具有相同名称的现有文件。

目前,当我想创建一个名称已在 MyDrive 中使用的文件时,它会创建另一个同名的文件。我想保留 1 个文件(新文件被保留,旧文件丢失)。

4

5 回答 5

26

有 3 种服务可用于删除文件。

  • DriveApp - 内置于 Apps 脚本
  • 高级驱动器服务 - 内置于 Apps 脚本,但必须启用。比 DriveApp 有更多的功能
  • Google Drive API - 不是内置于 Apps 脚本,但可以通过使用 Drive REST API 的 Apps 脚本与UrlFetchApp.fetch(url,options)

DocsList服务现已弃用。

高级驱动器服务可用于删除文件而不将其发送到垃圾箱。认真考虑无法找回已删除文件的风险。高级驱动器服务有一种remove方法可以删除文件而不将其发送到垃圾文件夹。高级服务具有许多与 API 相同的功能,无需发出 HTTPS GET 或 POST 请求,也不需要 OAuth 库。

function delteFile(myFileName) {
  var allFiles, idToDLET, myFolder, rtrnFromDLET, thisFile;

  myFolder = DriveApp.getFolderById('Put_The_Folder_ID_Here');

  allFiles = myFolder.getFilesByName(myFileName);

  while (allFiles.hasNext()) {//If there is another element in the iterator
    thisFile = allFiles.next();
    idToDLET = thisFile.getId();
    //Logger.log('idToDLET: ' + idToDLET);

    rtrnFromDLET = Drive.Files.remove(idToDLET);
  };
};

这结合了 DriveApp 服务和 Drive API 来删除文件而不将其发送到垃圾箱。Drive API 方法.remove(id)需要文件 ID。如果文件ID不可用,但文件名有,则可以先按名称查找文件,然后获取文件ID。

为了使用 DriveAPI,您需要通过Resources , Advanced Google Services菜单添加它。将 Drive API 设置为ON确保在您的 Google Cloud Platform 中启用 Drive API。如果在这两个地方都没有打开它,它将不可用。

于 2014-06-15T05:52:10.073 回答
15

现在,如果文件是电子表格、文档等,您可以使用以下内容:

 DriveApp.getFileById(spreadsheet.getId()).setTrashed(true);

或者如果您已经有了文件而不是电子表格、文档等,您可以使用:

file.setTrashed(true);
于 2016-12-25T05:54:11.873 回答
9

此代码使用DocsList现在已弃用的类。

尝试这个 :

function test(){
deleteDocByName('Name-of-the-file-to-delete')
}

function deleteDocByName(fileName){
  var docs=DocsList.find(fileName)
    for(n=0;n<docs.length;++n){
     if(docs[n].getName() == fileName){
      var ID = docs[n].getId()
      DocsList.getFileById(ID).setTrashed(true)
      }
     }
    }

因为您可以拥有许多具有相同名称的文档,所以我使用了一个 for 循环来获取文档数组中的所有文档,并在必要时将它们一一删除。

我使用了一个以文件名作为参数的函数来简化它在脚本中的使用,使用测试函数来尝试它。

注意:请注意,所有具有此名称的文件都将被丢弃(并且可恢复;-)

关于您关于保留最新文件和删除旧文件的问题的最后一部分,这是可行的(通过读取上次访问的日期和时间),但我认为在创建新文件之前删除旧文件是一个更好的主意同名...更加合乎逻辑和安全!

于 2013-01-09T16:13:25.270 回答
3

虽然服务 DocsList 现在已被弃用,但从类文件夹引用中,settrashed 方法仍然有效:

https://developers.google.com/apps-script/reference/drive/folder#settrashedtrashed

所以应该这样工作:

ExistingFiles.settrashed(true);
于 2016-05-06T18:22:16.013 回答
2

这是另一种不需要 Drive API 的方法。(基于艾伦的回应)。

function deleteFile(fileName, folderName) {
  var  myFolder, allFiles, file;
  myFolder = DriveApp.getFoldersByName(folderName).next();

  allFiles = myFolder.getFilesByName(fileName);

  while (allFiles.hasNext()) {
    file = allFiles.next();
    file.getParents().next().removeFile(file);
  }
}
于 2019-05-08T17:46:11.627 回答