如何在谷歌电子表格上列出谷歌硬盘文件夹中的所有文件

How to Make a list on Google SpreadSheet of all files in a Google Drive folder

本文关键字:谷歌 文件夹 硬盘 文件 电子表格      更新时间:2023-09-26

我有一个文件夹,里面有2000多个文件。。我需要在谷歌电子表格上列出所有这些文件。。我在网上找到了一些脚本。。但它们并没有完全起作用。当我点击"RUN"时,我只得到一个250个文件的列表。

在谷歌开发者页面上阅读时,我发现了一些关于启用谷歌硬盘高级服务的内容(我做到了)。。我想我可以用一种名为"代币"的东西来解决这个问题??

我不知道。。我不是程序员,而且我几乎不懂英语。。我试着编辑这个剧本,把我在网上找到的东西融合在一起。。但任何事情都有效。。我只是犯了一些我甚至无法理解的错误。。

所以。。有人能修好吗?

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

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

上面的答案在每次迭代中都会附加一行,这一行特别慢,而且有可能超过最大执行时间(请参阅最佳实践),因此这里有一个版本使用数组收集数据,并使用单个setValues()写入数组。

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

因此,下面的版本可以获取而不是谷歌文档的所有文件,即只计算占用空间的文件(图像、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);   
}

分页是您想要的。当您有大量结果(如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)进行交换

我采用了乔纳森·利文斯顿建议的脚本并进行了一些编辑。

现在:

  • 可以采用具有未来报告的工作表的名称。如果它不存在,它可以制作一张新的纸
  • 提供了更多参数,包括编辑器列表(电子邮件)

这是代码:

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