如何在Google Drive中删除文件?

24

我该如何编写一个删除文件的 Google Apps Script?

以下代码可用于查找文件:

var ExistingFiles = DocsList.find(fileName);

但是DocsList.deleteFile不存在用于删除文件的功能。

是否有一种方法可以将这些文件移动到其他文件夹或移到回收站?

另一个解决方法是能否覆盖具有相同名称的现有文件。

目前,当我想使用MyDrive中已经使用过的名称创建文件时,它会创建第二个与相同名称的文件。 我希望保留1个文件(保留新文件,旧文件丢失)。

7个回答

27

有三个可用的服务用于删除文件。

  • DriveApp - 内置于 Apps Script
  • Advanced Drive 服务 - 内置于 Apps Script,但必须启用。具有比 DriveApp 更多的功能
  • Google Drive API - 不内置于 Apps Script,但可以与 UrlFetchApp.fetch(url,options) 一起使用 Drive REST API 从 Apps Script 中使用

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,您需要通过资源高级Google服务菜单添加它。将Drive API设置为ON并且确保Drive API在您的Google Cloud平台上已打开。如果两个地方都没有打开,它将不可用。


你如何获取文件夹ID?在图形界面中是否可以获取它? - hhh
1
您可以从浏览器的地址栏中获取文件夹ID。在Google Drive中,双击文件夹,然后查看浏览器的地址栏。文件夹ID位于URL中。这是您想要的吗? - Alan Wells
1
您可以通过DriveApp服务中的文件.setTrashed()方法将文件移动到垃圾箱。thisFile.setTrashed(true); - robartsd

18

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

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

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

file.setTrashed(true);

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

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

我使用了一个带有文件名作为参数的函数来简化脚本中的使用,使用test函数进行尝试。

注意:请注意,所有具有此名称的文件都将被移到回收站(并可恢复;-)

关于您问题的最后一部分,保留最近的文件并删除旧文件是可以做到的(通过读取上次访问的日期和时间),但我认为在创建具有相同名称的新文件之前删除旧文件是更合理和安全的做法!


@Sergeinsas 我知道这是一个过时的问题,但我希望您仍然可以帮助我创建一个循环,以删除旧文件而不是新文件。我正在尝试找出如何查看文件夹中的所有文件,该文件夹始终有6个文件,其名称将保持一致,因此我只需要一个例行脚本,每24小时删除每个文件的旧版本。我知道这不是最安全的选项,但考虑到我的情况,这是最好的选择之一。特别是因为只有我管理这些文件,没有Drive共享。 - CaffeinatedMike
请发布一个新问题,您的请求与此帖子不同且已过时...谢谢。 - Serge insas

3

有没有办法在文件存在的情况下添加if语句,然后跳过或循环? - Alexasks

2
这里有另一种无需使用Drive API的方法来完成它(基于Allan的回答)。
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);
  }
}

你可以直接使用 file.setTrashed(true); 代替 file.getParents().next().removeFile(file); - robartsd

0

这是一个稍微修改过的版本,使用上述方法。它将备份指定文件指定文件夹,并删除任何旧的同名备份,以避免重复。

这里的想法是每天备份一次,并在您选择的备份文件夹中保留1个月的备份。请记得在Apps Script设置每日触发器

https://gist.github.com/fmarais/a962a8b54ce3f53f0ed57100112b453c

function archiveCopy() {
  var file = DriveApp.getFileById("original_file_id_to_backup");
  var destination = DriveApp.getFolderById("backup_folder_name");

  var timeZone = Session.getScriptTimeZone();
  var formattedDate = Utilities.formatDate(new Date(),timeZone,"dd"); // 1 month backup, one per day
  var name = SpreadsheetApp.getActiveSpreadsheet().getName()+"_"+formattedDate;

  // remove old backup
  var allFiles = destination.getFilesByName(name);
  while (allFiles.hasNext()) {
    var thisFile = allFiles.next();
    thisFile.setTrashed(true);
  };

  // make new backup
  file.makeCopy(name,destination); 
}

0

我参考了Riyafa的建议并使用以下内容修改了我的脚本:

  while (files.hasNext()){
     var file = files.next();
     if(file==pdfName+".pdf"){
         DriveApp.getFileById(file.getId()).setTrashed(true);
     }
  }

不再积累重复文件。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接