首页 > 解决方案 > 将 Google Drive 上的重复文件与 GAS 进行比较时出现问题

问题描述

我希望下面的 GAS 删除给定文件夹中具有相同名称的文件。另一个循环内的循环应该将所有文件与所有文件进行比较,但事实并非如此。

由于文件夹中有 5 个文件,脚本应该进行 5x5 比较,但它只有 5 个。我的错在哪里?

代码:

function setTrashedDuplicatedFiles(){
  var folder = DriveApp.getFolderById("1FfbNvPQpg6Ilx-5VLuSIePvpl-FxewFl");
  var files = folder.getFiles();
  var files_ = folder.getFiles();

  while (files.hasNext())
  { 
    var file = files.next()
    while (files_.hasNext())
    {
      var file_ = files_.next()
      Logger.log("file: " + file + " = " + "file_: " + file_)
      Logger.log("file.getId(): " + file.getId() + " = " + "file_.getId(): " + file_.getId())
      if((file === file_) && (file.getId() != file_.getId()))
      {
        file.setTrashed(true)
      }
    }
  }
}

电流输出:

file: File1.pdf = file_: File1.pdf
file.getId(): 1yyFlRAGISjKstVxPRu8Eqi4iCIYJGDZA = file_.getId(): 1yyFlRAGISjKstVxPRu8Eqi4iCIYJGDZA
file: File1.pdf = file_: File2.pdf
file.getId(): 1yyFlRAGISjKstVxPRu8Eqi4iCIYJGDZA = file_.getId(): 1LY68d1aP9DLe5LqkzZyCJVdQIAm9XzzY
file: File1.pdf = file_: File2.pdf
file.getId(): 1yyFlRAGISjKstVxPRu8Eqi4iCIYJGDZA = file_.getId(): 19tKdBNt5bzxAOfcO1n14a_DbjWLb-LN-
file: File1.pdf = file_: File1.pdf
file.getId(): 1yyFlRAGISjKstVxPRu8Eqi4iCIYJGDZA = file_.getId(): 1Quwyi6WIP0dt3qgV4S5XJof1wMu9mRP1
file: File1.pdf = file_: File1.pdf
file.getId(): 1yyFlRAGISjKstVxPRu8Eqi4iCIYJGDZA = file_.getId(): 1fjMu1NEJu9ZI3aFhYpFyLkw_o79KiTQa

标签: javascriptgoogle-apps-scriptgoogle-drive-api

解决方案


  • 当文件名重复时,您想将文件移动到垃圾箱。
  • 您想使用 Google Apps 脚本实现此目的。

修改点:

  • 在您的脚本中,比较文件对象而不是文件名,如file === file_. 在这种情况下,if 语句总是false. 为了比较文件名,请使用(file.getName() === file_.getName()). TheMaster的评论已经提到了这一点。
  • getFiles()返回 FileIterator。在这种情况下,您的第二个 while 循环只是一个循环。这样,您的脚本无法删除重复文件名的文件。所以我想提出以下示例脚本。

示例脚本:

作为其他模式,下面的脚本怎么样?在这种情况下,使用一个循环。因此,与上述修改脚本相比,可以降低处理成本。

function setTrashedDuplicatedFiles(){
  var folder = DriveApp.getFolderById("1FfbNvPQpg6Ilx-5VLuSIePvpl-FxewFl");
  var files = folder.getFiles();

  let fileObj = {};
  while (files.hasNext()) {
    const file = files.next();
    const filename = file.getName();
    if (filename in fileObj) {
      file.setTrashed(true);
    } else {
      fileObj[filename] = file;
    }
  }
}

参考:


推荐阅读