javascript - 谷歌工作表脚本超时错误
问题描述
我正在尝试从图像中获取文件名和 ID,并且有 3000 多张图像,而且数量还会不断增加。
我在网上有这段代码,效果很好。但是问题是脚本在完成获取所有图像之前总是会超时。
所以我想知道是否有办法从上次会议的地方继续。我知道有很多解决会话超时问题的答案,但我的 javascript 不够熟练,无法弄清楚如何编写它们。
谢谢
这是我的代码
function listFilesInFolder(folderName) {
var sheet = SpreadsheetApp.getActiveSheet();
sheet.appendRow(["Name", "File-Id"]);
//change the folder ID below to reflect your folder's ID (look in the URL when you're in your folder)
var folder = DriveApp.getFolderById("ID");
var contents = folder.getFiles();
var cnt = 0;
var file;
while (contents.hasNext()) {
var file = contents.next();
cnt++;
data = [
file.getName(),
file.getId(),
];
sheet.appendRow(data);
};
};
解决方案
当我看到你的问题时,我想象了两种模式。但我认为您的情况有几个答案。因此,请将此视为其中两个。
模式1:
- 使用
setValues()
而不是appendRow()
.- 数据是在 while 循环中创建的。并使用 . 将数据放入电子表格
setValues()
。
- 数据是在 while 循环中创建的。并使用 . 将数据放入电子表格
修改后的脚本:
function listFilesInFolder(folderName) {
var data = [["Name", "File-Id"]];
var folder = DriveApp.getFolderById("ID"); // Please set this.
var contents = folder.getFiles();
while (contents.hasNext()) {
var file = contents.next();
data.push([file.getName(), file.getId()]);
};
var sheet = SpreadsheetApp.getActiveSheet();
sheet.getRange(sheet.getLastRow() + 1, 1, data.length, data[0].length).setValues(data); // Modified
};
模式 2:
- 使用云端硬盘 API。
- 使用 Drive API 检索数据。并使用 . 将数据放入电子表格
setValues()
。
- 使用 Drive API 检索数据。并使用 . 将数据放入电子表格
要使用此示例脚本,请在高级 Google 服务和 API 控制台中启用 Drive API。你可以在这里看到这个流程。
修改后的脚本:
function listFilesInFolder2(folderName) {
var folderId = "ID"; // Please set this.
var data = [["Name", "File-Id"]];
var params = {
'pageSize': 1000,
'q': "'" + folderId + "' in parents and mimeType!='" + MimeType.FOLDER + "'",
'fields': "nextPageToken,items(id,title)"
};
do {
var r = Drive.Files.list(params);
params["pageToken"] = r.nextPageToken;
r.items.forEach(function(e) {data.push([e.title, e.id])});
} while(r.nextPageToken);
var sheet = SpreadsheetApp.getActiveSheet();
sheet.getRange(sheet.getLastRow() + 1, 1, data.length, data[0].length).setValues(data); // Modified
};
参考 :
如果这些不是你想要的,我很抱歉。
添加 :
根据@Steve Gon why do you think SetValue is better than AppendRow?
的评论,我添加了我提议的原因,setValues()
而不是appendRow()
.
在这个问题中,当一个文件夹中的许多文件(超过 3000 个)被检索并放入电子表格时,处理时间超过 6 分钟,这是限制。如果我的理解是正确的,我认为 OP 想要解决这个问题。尽管我建议使用“setValues()”,因为我知道可以将 10000 行和 2 列的值放入一张表中而不会出现错误,但我没有在我的回答中显示处理时间的差异。我真的很抱歉。所以我添加了这个。
我为这种情况准备了 2 个示例脚本。主要工作是将 10,000 行 2 列放到一张纸上。这是大于 3,000 的问题。当时,它测量 和 的处理setValues()
时间appendRow()
。
使用 setValues() 的示例脚本
var label = "sampleLabel"
console.time(label);
var rows = 10000;
var values = [];
for (var i = 0; i < rows; i++){
values.push(["Name", "File-Id"]);
}
var ss = SpreadsheetApp.getActiveSheet();
ss.getRange(ss.getLastRow() + 1, 1, values.length, values[0].length).setValues(values);
console.timeEnd(label);
使用 appendRow() 的示例脚本
var label = "sampleLabel"
console.time(label);
var rows = 10000;
var ss = SpreadsheetApp.getActiveSheet();
for (var i = 0; i < rows; i++){
ss.appendRow(["Name", "File-Id"]);
}
console.timeEnd(label);
结果 :
- 使用
setValues()
时,处理时间为 2 s - 3 s。并且没有错误。 - 使用
appendRow()
时,将值设置为 1400 - 1500 行时,执行时间超过 6 分钟。虽然试了好几次,还是放不下3000行。
这就是我提出的原因setValues()
。
推荐阅读
- typo3 - QueryBuilder lastInsertId()
- python - 如何修复浮点对象不能解释为整数python
- javascript - 从 Angular 7 组件中检索本地 XML 文件
- mysql - How to Sum Value's of a column in a Table using Lookup function
- asp.net-core - 如何解决 ASP.NET Core 2.0 应用程序 EF Core 使用中的大量内存分配问题?
- sql - 使用 Spark SQL 引擎为自定义库解析 SQL 所需的建议
- java - 我可以配置 Java 日志记录以使用 Spring Boot 日志记录吗?
- php - 无法使用 $GLOBALS 数组将变量从一个文件传递到另一个文件
- c - 无法弄清楚为什么我没有从一个线程获取作为输入的数组并尝试使用另一个线程打印它
- c++ - 如何在来自另一个 DLL 的 DLL 上使用`/DELAYLOAD`