我想自动一天抓取一个网站的数据。在Google Spreadsheets中,我使用=ImportHTML()
函数导入数据表,然后使用=query()
提取相关数据。每次打开电子表格时,这些功能都需要10到30秒才能完成计算。
我使用预定的Google Apps脚本,每天将数据复制到不同的工作表(存储位置,以便我可以运行统计信息)。
我的问题是,在复制数据之前,我无法让脚本等待计算完成。结果是我的脚本只复制错误消息“N / A”。
我尝试添加Utilities.sleep(60000);
,但它无效。
是否可以创建一个循环,检查计算完成?我试了这个没有成功:
function checkForError() {
var spreadsheet = SpreadsheetApp.getActive();
var source = spreadsheet.getRange ("Today!A1");
if (source = "N/A") {
Utilities.sleep(6000);
checkForError();
} else {
moveValuesOnly();
}
}
答案 0 :(得分:1)
锁就是为了这个。在文档中查找锁定服务。使用公共锁。
答案 1 :(得分:0)
以下是我如何使用Zig的建议(结合我自己的检查循环)来解决我的类似问题:
// Get lock for public shared resourse
var lock = LockService.getPublicLock();
// Wait for up to 120 seconds for other processes to finish.
lock.waitLock(120000);
// Load my values below
// something like sheet.getRange("A1").setFormula('= etc...
// Now force script to wait until cell D55 set to false (0) before
// performing copy / pastes
var current = SpreadsheetApp.setActiveSheet(sheet.getSheets()[1]);
var ready = 1;
var count = 0;
while (true) {
// break out of function if D55 value has changed to zero or counter
// has hit 250
if (count >= 250) break;
// otherwise keep counting...
ready = current.getRange("D55").getValue();
if (ready == 0) {count = 400;}
Utilities.sleep(100);
++count;
}
// wait for spreadsheet to finish... sigh...
Utilities.sleep(200);
// Do my copy and pastes stuff here
// for example sheet.getRange("a1:b1").copyTo(sheet.getRange("a3"), {contentsOnly:true});
// Key cells are updated so release the lock so that other processes can continue.
lock.releaseLock();
// end script
return;
}
这对我来说非常棒,阻止了Google的零星服务破坏了我的工作! 谢谢Zig的建议!