Google 驱动器电子表格超过最大执行时间

Google drive spreadsheet exceeded maximum excution time

我在 Gdrive 电子表格中的脚本,用于在这样的文件夹中插入 link 文件 ID:

function listFolders(folder) {
     var sheet = SpreadsheetApp.getActiveSheet();
     sheet.appendRow(["Name", "FileId"]); //writes the headers
     var folder = DriveApp.getFolderById("XXXXXXXXXX")

     var subfolders = folder.getFolders();

     while (subfolders.hasNext()) {
         var name = subfolders.next();

         var files = name.getFiles();

         var cnt = 0;
         var file;

         while (files.hasNext()) {
             var file = files.next();
             cnt++;

             data = [
                 file.getName(),
                 file.getId()
             ];
             sheet.appendRow(data);
         };
         
     }

 }

如何解决这个问题? 提前致谢。

这个小修改对我来说运行良好:

function listFolders() {
     var sh = SpreadsheetApp.getActiveSheet();
     sh.appendRow(["Name", "FileId","Count"]); 
     var folder = DriveApp.getFolderById("insert folder id")
     var subfolders = folder.getFolders();
     while (subfolders.hasNext()) {
         var fldr = subfolders.next();
         var files = fldr.getFiles();
         var cnt = 0;
         while (files.hasNext()) {
             var file = files.next();
             sh.appendRow([file.getName(),file.getId(),++cnt]);
         };
     }
 }

这是我的输出:

Name FileId Count
Slide22.png Redacted 1
Slide21.png Redacted 2
Slide20.png Redacted 3
Slide19.png Redacted 4
Slide18.png Redacted 5
Slide17.png Redacted 6
Slide16.png Redacted 7
Slide15.png Redacted 8
Slide14.png Redacted 9
Slide13.png Redacted 10

我相信你的目标如下。

  • 您想使用 Google Apps 脚本从特定文件夹下的子文件夹中检索文件列表。
  • 您想减少脚本的处理成本。
  • 作为附加目标,您希望将“FolderName”添加到列中。

修改点:

  • 在您的脚本中,appendRow 用于循环。在这种情况下,工艺成本变高。 Ref 你的情况,我以为当文件数量多的时候,进程开销会变高。在这个答案中,这是修改的。
  • 似乎没有使用参数folder

当以上几点反映到你的脚本中,就变成了下面这样。

修改后的脚本:

function listFolders() {
  var sheet = SpreadsheetApp.getActiveSheet();
  var folder = DriveApp.getFolderById("XXXXXXXXXX")
  var subfolders = folder.getFolders();
  var values = [["Name", "FileId", "FolderName"]]; // Modified
  while (subfolders.hasNext()) {
    var name = subfolders.next();
    var folderName = name.getName(); // Added
    var files = name.getFiles();
    while (files.hasNext()) {
      var file = files.next();
      data = [file.getName(), file.getId(), folderName]; // Modified
      values.push(data);
    }
  }
  var cnt = values.length;
  console.log(cnt);  // You can see the total number of files at the log.
  sheet.getRange(sheet.getLastRow() + 1, 1, values.length, values[0].length).setValues(values);
}
  • 在这个修改中,文件列表被放入一个数组,包含文件列表的数组被放入电子表格使用setValues

注:

  • 当你想从特定文件夹的子文件夹下的所有子文件夹中检索文件列表时,你也可以使用下面的脚本。

      function listFolders() {
        const getAllFolders = (id, list = [["Name", "FileId", "FolderName"]]) => { // Modified
          const fols = DriveApp.getFolderById(id).getFolders();
          let temp = [];
          while (fols.hasNext()) {
            const fol = fols.next();
            const folderName = fol.getName(); // Added
            temp.push(fol.getId());
            const files = fol.getFiles();
            while (files.hasNext()) {
              const file = files.next();
              list.push([file.getName(), file.getId(), folderName]); // Modified
            }
          }
          temp.forEach(id => getAllFolders(id, list));
          return list;
        }
    
        const id = "###"; // Please set the top folder ID.
        const values = getAllFolders(id);
        var cnt = values.length;
        console.log(cnt);  // You can see the total number of files at the log.
    
        var sheet = SpreadsheetApp.getActiveSheet();
        sheet.getRange(sheet.getLastRow() + 1, 1, values.length, values[0].length).setValues(values);
      }
    
  • 如果以上修改不能直接解决您的问题,我建议使用Drive API。在这种情况下,我认为这个 Google Apps Script 库也可以使用。 https://github.com/tanaikech/FilesApp

参考文献:

已添加:

关于您的后续回复,

I want to know which folder on my drive this file belonged to. const getAllFolders = (folderName,id, list = [["FolderName","Name", "FileId"]]

很遗憾,我不确定我是否能正确理解你的附加问题的输出值,下面的脚本是你想要的吗?

示例脚本:

function sample() {
  const getAllFolders = (id, list = [["FolderName", "Name", "FileId"]]) => {
    const folder = DriveApp.getFolderById(id);
    const folderName = folder.getName();
    const fols = folder.getFolders();
    let temp = [];
    while (fols.hasNext()) {
      const fol = fols.next();
      temp.push(fol.getId());
      const files = fol.getFiles();
      while (files.hasNext()) {
        const file = files.next();
        list.push([folderName, file.getName(), file.getId()]);
      }
    }
    temp.forEach(id => getAllFolders(id, list));
    return list;
  }

  const id = "###"; // Please set the top folder ID.
  const values = getAllFolders(id);
  var cnt = values.length;
  console.log(cnt);  // You can see the total number of files at the log.

  var sheet = SpreadsheetApp.getActiveSheet();
  sheet.getRange(sheet.getLastRow() + 1, 1, values.length, values[0].length).setValues(values);
}