如何在谷歌电子表格上列出谷歌硬盘文件夹中的所有文件
How to Make a list on Google SpreadSheet of all files in a Google Drive folder
我有一个文件夹,里面有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;
}
- 谷歌电子表格,脚本,备份文件,子文件夹
- 使文件夹共享谷歌驱动器api v3
- 获取谷歌硬盘文件夹中的最新文件
- 使用谷歌云端硬盘 API 导航到文件夹
- 按名称将文件移动到文件夹 - 谷歌应用脚本
- 谷歌应用脚本 - 迭代文件夹和子文件夹
- 我想让用户在谷歌硬盘上创建文件夹,而不需要任何进一步的签名
- 谷歌驱动器API应用程序数据文件夹,是真的那么困难
- 谷歌应用程序编写Web应用程序脚本以在用户's的myDrive文件夹仅将文件发送到MY Drive(应用程序的创
- 谷歌驱动器:使用javascript api获取(根)文件和文件夹(只获取驱动器上删除的文件)
- 谷歌文件下载分析未启动,位置问题
- 如何在我的网站中嵌入谷歌硬盘文件夹
- 谷歌驱动器选择器:只显示顶级文件夹
- 谷歌应用程序脚本集所有者在文件夹上它消失了
- 如何在谷歌电子表格上列出谷歌硬盘文件夹中的所有文件
- 如何在谷歌驱动器上托管的文件夹中启用CORS
- 图像库托管在谷歌驱动器文件夹
- Google Drive API;谷歌实时API -我可以把一个实时文件在应用程序文件夹
- 设置驱动器文件夹位置为动态创建的谷歌表单
- 我想插入一个预加载的图像到谷歌文件取决于结果