如何在Google SpreadSheet上列出Google云端硬盘文件夹中所有文件的列表

时间:2014-09-05 10:45:10

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

我有一个超过2000个文件的文件夹..而且我需要在谷歌电子表格上列出所有这些文件..我在网上发现了一些脚本..但它们并没有完全正常工作。 当我点击“RUN”时,我只会得到250个文件列表。

在Google Developers页面上阅读我发现了一些关于启用Google Drive高级服务的事情(我做到了)。 而且我认为我可以使用名为“tokens”的东西解决这个问题??

我不知道..我不是程序员,我几乎不懂英语.. 我尝试编辑这个脚本融合了我在网上找到的东西..但是任何东西都有效......我只是得到了我甚至无法理解的错误..

那么..有人能够解决它吗?

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);
  }
};

4 个答案:

答案 0 :(得分:6)

此脚本适用于至少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);
  }
};

答案 1 :(得分:1)

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

&#39;令牌&#39;并不是什么大不了的...它只是你的脚本在处理当前页面时记住页码的方式。

这里有关于此的信息: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);

};

我不承诺这会有用......但我相信你可以解决它。基本上是&#34; while循环&#34;在该页面上替换&#34; for循环&#34;从你的脚本。该页面上的循环只调用Logger.log(),因此您将其与sheet.appendRow(数据)交换

答案 2 :(得分:1)

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

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

以下是获取 Google文档的所有文件的版本,即它仅计算占用空间(图片,pdf ...)且最多包含4000个文件的文件。

以下完整代码:

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);   
}

答案 3 :(得分:0)

我采用了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;

}