【问题标题】:How to Make a list on Google SpreadSheet of all files in a Google Drive folder如何在 Google 电子表格上列出 Google Drive 文件夹中的所有文件
【发布时间】:2014-10-30 07:15:08
【问题描述】:

我有一个包含 2000 多个文件的文件夹。我需要在 google 电子表格上列出所有这些文件。我在网上找到了一些脚本。但它们并没有完全正常工作。 当我点击“RUN”时,我只会得到一个包含 250 个文件的列表。

在阅读 Google Developers 页面时,我发现了一些有关启用 Google Drive 高级服务的信息(我做到了).. 而且我认为我可以使用名为“令牌”的东西来解决这个问题??

我不知道..我不是程序员,我几乎不会英语.. 我尝试编辑此脚本,将我在网上找到的内容融合在一起。但一切正常。我只是得到了我什至无法理解的错误。

所以.. 有没有人可以解决它?

function listFilesInFolder() {
  var folder = DocsList.getFolder("Film");
  var contents = folder.getFiles();
  var file;
  var data;

  var sheet = SpreadsheetApp.getActiveSheet();
  sheet.clear();

  sheet.appendRow(["Nome", "Data", "Dimensione"]);

  for (var i = 0; i < contents.length; i++) {
    file = contents[i];

    if (file.getFileType() == "SPREADSHEET") {
      continue;
    }

    data = [ 
      file.getName(),
      file.getDateCreated(),
      file.getSize(),
    ];

    sheet.appendRow(data);
  }
};

【问题讨论】:

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


    【解决方案1】:

    此脚本适用于至少 2200 个文件 :)

    function listFilesInFolder(id) {
      var folder = DriveApp.getFolderById('MyFolderID');
      var contents = folder.getFiles();
      var file;
      var name;
      var sheet = SpreadsheetApp.getActiveSheet();
      var date;
      var size;
    
      sheet.clear();
      sheet.appendRow(["Nome", "Data", "Dimensione"]);
    
    
      while(contents.hasNext()) {
        file = contents.next();
        name = file.getName();
        date = file.getDateCreated()
        size = file.getSize()
    
        data = [name, date, size]
        sheet.appendRow(data);
      }
    };
    

    【讨论】:

      【解决方案2】:

      上面的答案在每次迭代中附加一行,这特别慢,并且有可能超过最大执行时间(请参阅best practices))所以这是一个使用数组收集数据并写入的版本使用单个 setValues() 的数组。

      另一个问题是它获取驱动器中的所有文件,而不是您选择的文件夹中...

      所以下面的版本可以获取所有非 Google 文档的文件,即它只计算占用空间的文件(图像、pdf...),最多 4000 个文件。 p>

      完整代码如下:

      function listFilesInFolder() {
        var folder = DocsList.getFolderById('0B3qSFd3iikE3MS0yMzU4YjQ4NC04NjQxLTQyYmEtYTExNC1lMWVhNTZiMjlhMmI');
        var file;
        var sheet = SpreadsheetApp.getActiveSheet();
        sheet.clear();
        var data = [];
        data.push(["Name", "Data", "Size", "url"]);
        var filesresult = folder.getFilesByTypeForPaging(DocsList.FileType.OTHER, 4000);
        var files = filesresult.getFiles();
        Logger.log(files.length);
        for (var i in files) {
          file = files[i];
          data.push([ 
            file.getName(),
            file.getDateCreated(),
            file.getSize(),
            file.getUrl()
          ]);
        }
        sheet.getRange(1,1,data.length,data[0].length).setValues(data);   
      }
      

      【讨论】:

      • Ty 伙计们,但以上脚本都不起作用.. 即使对第一个脚本稍作更改,我也只会得到一个 >3000 个文件的列表,其中包含前 250 个重复的文件。第二个效果更好,但是我只得到了 499 个文件的列表:-/ 无论如何,我找到了克服它的方法。 GoogleAppScripts 页面上有一个示例脚本可以执行此操作.. 但将所有内容保存在日志中.. 我只是稍微更改了一下:
      【解决方案3】:

      分页是您正在寻找的。当您有大量结果(例如 2000 个文件)时,您通常会将请求划分为“页面”,以便逐页显示用户,或者在这种情况下保持在 API 限制范围内。

      “令牌”没什么大不了的。它只是您的脚本在处理当前页面时记住页码的方式。

      所以这里有这方面的信息:https://developers.google.com/apps-script/reference/docs-list/files-result

      页面顶部的脚本非常适合您的情况。你的脚本变成...

      function listFilesInFolder() {
        var folder = DocsList.getFolder("Film");
        //var contents = folder.getFiles();
        var file;
        //var data;
      
        var sheet = SpreadsheetApp.getActiveSheet();
        sheet.clear();
      
        sheet.appendRow(["Nome", "Data", "Dimensione"]);
      
      
       var pageSize = 200;
       var files = null;
       var token = null; // use a null token for the first lookup
       do {
         var result = DocsList.getAllFilesForPaging(pageSize, token);
         files = result.getFiles();
         token = result.getToken();
         for (var i = 0; i < files.length; i++) {
          //Logger.log(files[i].getName());
          file = files[i];
          if (file.getFileType() == "SPREADSHEET") {
            continue;
          }
          data = [ 
            file.getName(),
            file.getDateCreated(),
            file.getSize(),
          ];
      
          sheet.appendRow(data);
         }
       } while (files.length >= pageSize);
      
      };
      

      我不保证这会奏效.. 但我相信你可以解决它。基本上,该页面上的“while 循环”替换了脚本中的“for 循环”。该页面上的循环仅调用 Logger.log(),因此您将其与 sheet.appendRow(data) 交换

      【讨论】:

      • 这是从整个驱动器中获取文件,而不是从特定文件夹中获取文件。
      【解决方案4】:

      我采用了 Jonathan Livingston 建议的脚本并进行了一些修改。

      现在:

      • 可以在未来报告中使用工作表的名称。如果它不存在,它可以创建一个新的工作表,
      • 提供更多参数,包括编辑者列表(电子邮件)

      代码如下:

      function TESTlistFilesInFolder() {
        listFilesInFolder("0B0pifCWzjn-ib0ZWT2x1ekNOWAY", "Files Report");
        //                 ^^^^^^^^ folder ID ^^^^^^^^^    ^sheet Name^
      
      }
      
      
      // original script: http://stackoverflow.com/a/25730522/5372400
      function listFilesInFolder(id, sheetName) {
      
        sheetName = sheetName || id;
        var sheet = createSheetIfNotExists(sheetName);
      
        var folder = DriveApp.getFolderById(id);
        var contents = folder.getFiles();
      
        sheet.clear();
        sheet.appendRow(["Name", "CreatedDate", "Last Updated", "Id", "Url", "Editors", "Viewers", "Owner", "Access", "Permission", "Size"]);
      
        var data = [];
        var file;
        var info = [];
      
        while(contents.hasNext()) {
          data = [];
          file = contents.next();
          data.push(file.getName());
          data.push(file.getDateCreated());
          data.push(file.getLastUpdated());
          data.push(file.getId());
          data.push(file.getUrl());
          // convert to string: http://www.w3schools.com/jsref/jsref_join.asp
          data.push(getEmails(file.getEditors()).join());
          data.push(getEmails(file.getViewers()).join());
          data.push(getEmails(file.getOwner()).join());
          data.push(file.getSharingAccess());
          data.push(file.getSharingPermission());
          data.push(file.getSize());        
      
          info.push(data);
        }
      
        var rows = info.length;
        var cols = info[0].length;
      
        var range = sheet.getRange(2,1,rows,cols);
      
        range.setValues(info);
      
      };
      
      
      
      function createSheetIfNotExists(name) { 
        var ss = SpreadsheetApp.getActiveSpreadsheet();
      
        try {ss.setActiveSheet(ss.getSheetByName(name));}
          catch (e) {ss.insertSheet(name);} 
      
        var sheet = ss.getSheetByName(name);
        return sheet;
      }
      
      // users: https://developers.google.com/apps-script/reference/base/user
      function getEmails(users) {
        var emails = [];
        var user;
        https://developer.mozilla.org/en/docs/Web/JavaScript/Reference/Global_Objects/Array/isArray
        if (!Array.isArray(users)) { users = [users]; }
      
        for (var i = 0; i < users.length; i++) {
          user = users[i];
          emails.push(user.getEmail());  
        }
      
        return emails;
      
      }
      

      【讨论】:

        猜你喜欢
        • 2020-12-06
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多