如何使用 Google 脚本在多个子文件夹的 Google Drive 文件夹中一起搜索特定文件名和文件类型

How to search a Specific File Name and File Type together in Google Drive folder from multiple sub folders using Google Script

在 Google 驱动器中,我正在搜索一个 特定文件 ,其中包含单词 “验证访问”"completed" 其中 文件类型 需要是 电子表格 (.xlsx) 类型的文件。搜索将通过父文件夹,然后进入子文件夹。因此特定文件将存储在某些子文件夹中(Google Drive -> Parent folder -> Sub folders)。

代码如下:

function getChildFolders(parentName, parent, sheet, voidFolder, excluded) {
  var childFolders = parent.getFolders();
  var folder = childFolders.next();
  var failIter = folder.searchFiles('title contains "completed"');
  while (failIter.hasNext()) {
    var fail = failIter.next();
    var failWithTitle = fail.getName();
    var files = folder.getFilesByType(MimeType.MICROSOFT_EXCEL);
    var output = [];
    var path;
    var Url;
    var fileID;
    while (files.hasNext()) {
      var childFile = files.next();
      var fileName = childFile.getName();
      path = parentName + ' |--> ' + fileName;
      fileID = childFile.getId();
      Url = 'https://drive.google.com/open?id=' + fileID;
      output.push([fileID, fileName, path, Url]);
    }
    if (output.length) {
      var last_row = sheet.getLastRow();
      sheet.getRange(last_row + 1, 1, output.length, 4).setValues(output);
    }
    getChildFolders(
      parentName + ' |--> ' + fileName,
      folder,
      sheet,
      voidFolder,
      excluded
    );
  }
}

我已经在此函数中成功实现了两个条件(包含特定名称 的文件以及文件类型)。这里的问题是子文件夹中文件的搜索过程只对第一个子文件夹进行,而不会继续搜索到下一个子文件夹。它只列出第一个子文件夹中的文件,而不列出其他子文件夹中的文件。

我收到一条错误消息,告诉我 “异常:无法检索下一个对象:迭代器已到达末尾。”

问题:

  • 您没有检查 parent.getFolders() returns any folder, so when you reach the end of the hiearchy and there are no further subfolders on that level, childFolders.next(); 是否因您收到的错误而失败。
  • 您没有遍历 FolderIterator(例如,使用 while (folderIter.hasNext()) {),因此您只会得到迭代器中的第一个文件夹。
  • 您正在遍历包含 completed 的文件,但在每个文件迭代中您再次使用 folder.getFilesByType 进行迭代以检查 MIME 类型(检查可用的 search query terms)。也就是说,您正在对该文件夹中的文件进行两次迭代,这很可能会 return 重复结果。

建议的工作流程:

  • 对于每个文件夹,使用您想要的两个条件(标题包含 completed 并且 mime 类型对应于 MS Excel)查找带有 Folder.searchFiles 的所需文件并遍历结果 FileIterator.hasNext()while 循环中。
  • 对于每个文件夹,通过 Folder.getFolders() 查找相应的子文件夹,并使用 FolderIterator.hasNext()while 循环遍历结果。对于这些子文件夹中的每一个,递归调用您的函数。
  • 使用 SpreadsheetApp.flush 确保每次使用 setValues 时 sheet 得到更新,这样以前的数据就不会被覆盖。

代码示例:

function getChildFiles(folderName, folder, sheet) {
  var fileIter = folder.searchFiles("title contains 'completed' and mimeType='application/vnd.openxmlformats-officedocument.spreadsheetml.sheet'");
  var folderId = folder.getId();
  var output = [];
  while (fileIter.hasNext()) { // Iterate through files in folder
    var file = fileIter.next();
    var fileName = file.getName();
    var path = folderName + ' |--> ' + fileName;
    var fileID = file.getId();
    var Url = 'https://drive.google.com/open?id=' + fileID;
    output.push([fileID, fileName, path, Url, folderId]);
  }
  if (output.length) {
    var last_row = sheet.getLastRow();
    sheet.getRange(last_row + 1, 1, output.length, output[0].length).setValues(output);
    SpreadsheetApp.flush();
  }
  var childFolders = folder.getFolders();
  while (childFolders.hasNext()) { // Iterate through folders in folder
    var childFolder = childFolders.next();
    var childFolderName = childFolder.getName();
     getChildFiles(
      folderName + ' |--> ' + childFolderName,
      childFolder,
      sheet
    );   
  }
}