Javascript 谷歌工作表脚本超时错误
我正在尝试从图像中获取文件名和ID,有3000多个图像,这个数字将继续增加 我在网上有一段代码,运行得很好。但是,问题是脚本在完成获取所有图像之前总是会超时 所以我想知道是否有一种方法可以从上一节课的地方继续下去。 我知道有很多解决会话超时问题的答案,但我的javascript不够熟练,不知道如何编写它们 谢谢 这是我的密码Javascript 谷歌工作表脚本超时错误,javascript,google-apps-script,google-sheets,google-drive-api,Javascript,Google Apps Script,Google Sheets,Google Drive Api,我正在尝试从图像中获取文件名和ID,有3000多个图像,这个数字将继续增加 我在网上有一段代码,运行得很好。但是,问题是脚本在完成获取所有图像之前总是会超时 所以我想知道是否有一种方法可以从上一节课的地方继续下去。 我知道有很多解决会话超时问题的答案,但我的javascript不够熟练,不知道如何编写它们 谢谢 这是我的密码 function listFilesInFolder(folderName) { var sheet = SpreadsheetApp.getActiveSheet
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循环中创建的。并使用
- 使用驱动API。
- 使用驱动器API检索数据。并使用
将数据放入电子表格setValues()
- 使用驱动器API检索数据。并使用
为什么您认为SetValue比AppendRow好?
的评论,我添加了我建议setValues()
而不是AppendRow()
的原因
在本期中,当检索文件夹中的多个文件(超过3000个)并将其放入电子表格时,处理时间超过6分钟,这是限制。如果我的理解是正确的,我认为OP想要解决这个问题。虽然我建议使用“setValues()”,因为我知道使用它可以将包含2列的10000行的值放在一个工作表中而不会出错,但我在回答中没有说明处理时间的差异。对此我真的很抱歉。所以我加了这个
我为这种情况准备了两个示例脚本。主要工作是将10000行2列放入一张工作表。这是超过3000的问题。此时,它测量setValues()
和appendRow()
的处理时间
使用setValues()的示例脚本
var label=“sampleLabel”
控制台。时间(标签);
var行=10000;
var值=[];
对于(变量i=0;i
使用appendRow()的示例脚本
var label=“sampleLabel”
控制台。时间(标签);
var行=10000;
var ss=SpreadsheetApp.getActiveSheet();
对于(变量i=0;i
结果:
- 使用
时,处理时间为2秒-3秒。而且没有错误setValues()
- 使用
时,当该值设置为1400-1500行时,执行时间超过6分钟。虽然我试了好几次,但还是放不下3000行appendRow()
setValues()
如果(cnt%500==0){SpreadsheetApp.flush();}
在使用大型电子表格时,我注意到了很多问题。我现在在谷歌做一个项目,听说他们正在重新编写解释器/编译器的运行方式。@SteveGon appendRow一次只能添加一行,而setValues可以一次添加多行。@Steve Gon感谢您的建议。根据你的建议,我可以更新我的答案。你能确认一下吗?我的两个变通方法是几个答案中的两个。因此,我认为您的变通方法也很重要。@Steve Gon顺便说一句,在您关于的评论中,我对大型电子表格上的SetValue比AppendRow有更多的问题。
,我对此很感兴趣。因为我认为这些信息对于使用setValues()
的用户很有用。因此,能否请您提供大量问题的详细信息,以及一个示例情况,包括复制问题的脚本?我想你说的是关于setValues()
的重要问题。如果您的回答是,setValues()
不能用于OP的情况,我想提出使用Sheets API的方法。@Rubén感谢您的支持。我这样提议是因为我和你有相同的意见。因为我在回答中没有说明setValues()
和appendRow()
的处理时间的差异,所以我补充了这一点。你能确认一下吗?我想要强调的特点是,SpreadsheetApp方法比JavaScript方法慢一点,appendRow应该为每一行使用一次,而SetValue可以为数千行使用一次。我更新了我的答案,因为我没有说明我的答案中setValues()
和appendRow()
的处理时间。所以我补充了这一点。你能确认一下吗?
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
};
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
};
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);
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);
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);
if (cnt % 500 ===0){
SpreadsheetApp.flush();
}
};
};