我正在尝试运行一个Google电子表格宏(macro.gs),该宏必须下载属于某个域的大量Google网站链接,但是执行时间很长,因此该脚本结束了,但不是尚未完成。我已经读到,这样做的目的是要像这样(时间有限的执行),所以我在那儿无能为力。
function listSites() {
var domain="domain";
var PAGE_LENGTH=200;
sheet = SpreadsheetApp.getActiveSheet();
var sites = SitesApp.getAllSites(domain,0,PAGE_LENGTH);
for(var i=0; sites.length != 0; i+=PAGE_LENGTH){
for (var j=0; j<sites.length; j++) {
sheet.appendRow([sites[j].getUrl()]);
}
sites = SitesApp.getAllSites(domain, i, PAGE_LENGTH);
}
};
但是,我也读到我可以尝试使用Google Apps脚本运行“任务队列”以在没有时间限制的情况下运行它,但是我不确定是否可以在任务内运行电子表格宏来规避该时间限制。
到目前为止,我所读的所有内容都没有提供有关操作方法的任何信息。
答案 0 :(得分:0)
仅当工作表易变时(例如,您不能确定在计算最后一行到添加新数据之间是否已添加新数据。
另一种方法是构建输出,然后使用setValues
和矩形2d Array
通过一次写入将其序列化:
function writeAllSiteUrls() {
const domain = "domain",
PAGE_LENGTH = 200,
output = [];
var i = 0;
do {
var search = SitesApp.getAllSites(domain, i * PAGE_LENGTH, PAGE_LENGTH);
var urls = search.map(function (site) {
return site.getUrl();
});
Array.prototype.push.apply(output, urls);
++i;
} while (search.length);
if (!output.length)
return;
const sheet = SpreadsheetApp.getActiveSheet();
sheet.getRange(sheet.getLastRow() +1, 1, output.length, output[0].length).setValues(output);
}
您当然可以构建一个更复杂的返回对象,而不仅仅是站点URL,但这并不是您真正的问题。还要注意,任何与Google协作平台有关的Apps脚本代码都只处理“旧”版本的Google协作平台-用新版本创建的代码无法访问:
2016年11月22日启动了重建版本的站点。AppsScript当前无法访问或修改使用此版本创建的站点,但是脚本仍可以访问经典站点。
参考