我正在尝试从图像中获取文件名和ID,并且有3000多个图像,而且数量还会不断增加。
我在线上有这段代码,效果很好。但是问题在于,脚本在完成获取所有图像之前将始终超时。
所以我想知道是否有一种方法可以从上一个会话开始。 我知道有很多答案可以解决会话超时问题,但是我的JavaScript不够熟练,无法弄清楚如何编写它们。
谢谢
这是我的代码
Select eid
from employee
where ename= "Vikram";
答案 0 :(得分:3)
当我看到您的问题时,我拍摄了2种图案。但我认为您的情况有几个答案。因此,请考虑其中的两个。
setValues()
代替appendRow()
。
setValues()
将数据放入电子表格。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
};
setValues()
将数据放入电子表格。要使用此示例脚本,请在高级Google服务和API控制台中启用Drive API。您可以在here上看到此流程。
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个示例脚本。主要工作是在一张纸上放置10,000行2列。这大于问题的3,000。那时,它测量setValues()
和appendRow()
的处理时间。
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);
setValues()
时,处理时间为2 s-3 s。而且没有错误。appendRow()
时,将值设置为1400-1500行时,执行时间超过6分钟。尽管我尝试了几次,但无法放置3000行。这就是我提出setValues()
的原因。
答案 1 :(得分:0)
尝试添加: if(cnt%500 === 0){SpreadsheetApp.flush();}
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();
}
};
};
使用大型电子表格时,我注意到很多问题。我现在正在Google从事一个项目,听说他们正在重新编写解释器/编译器的运行方式。