【问题标题】:Google drive spreadsheet exceeded maximum excution timeGoogle 云端硬盘电子表格超出了最长执行时间
【发布时间】:2021-04-18 13:11:18
【问题描述】:

我在 Gdrive 上的电子表格中的脚本,用于在文件夹中插入文件的链接 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);
         };
         
     }

 }

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

【问题讨论】:

    标签: javascript google-apps-script google-sheets google-drive-api


    【解决方案1】:

    我相信你的目标如下。

    • 您想使用 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

    参考资料:

    补充:

    关于您的以下回复,

    我想知道这个文件属于我驱动器上的哪个文件夹。 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);
    }
    

    【讨论】:

    • 感谢您的回答,最后一个问题:如何通过这种方法在电子表格中添加文件夹名称列?
    • @Mahdi Yousef 感谢您的回复。我很高兴你的问题得到了解决。关于您对how to add FolderName column in spreadsheet by this method? 的附加问题,我在这两个脚本之上进行了修改。你能确认一下吗?如果我误解了您的附加问题,我深表歉意。
    • 我想知道这个文件属于我驱动器上的哪个文件夹。 ` const getAllFolders = (folderName,id, list = [["FolderName","Name", "FileId"]] `
    • @Mahdi Yousef 感谢您的回复。对于给您带来的不便和我糟糕的英语水平,我深表歉意。关于您对I want to know which folder on my drive this file belonged to. const getAllFolders = (folderName,id, list = [["FolderName","Name", "FileId"]] 的附加问题,很遗憾,我无法理解您想要做什么。但我愿意支持你。那么,我可以问你关于你的新问题的细节吗?由此,我想试着去理解它。例如,您能否提供您期望的样本输出值?
    • 非常感谢,太好了。
    【解决方案2】:

    这个小修改对我来说运行正常:

    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

    【讨论】:

      猜你喜欢
      • 2015-09-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多