Google apps script 不受时间限制运行Google电子表格宏

Google apps script 不受时间限制运行Google电子表格宏,google-apps-script,google-sheets,google-sheets-macros,Google Apps Script,Google Sheets,Google Sheets Macros,我正在尝试运行一个google电子表格宏(macro.gs),该宏必须下载大量属于某个域的google站点链接,但执行该宏需要很长时间,因此脚本将结束,但尚未完成。我读到过这样的设计(有时间限制的执行),所以我在那里做不了什么 function listSites() { var domain="domain"; var PAGE_LENGTH=200; sheet = SpreadsheetApp.getActiveSheet(); var sites = SitesApp.g

我正在尝试运行一个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);
  }
};
函数列表站点(){
var domain=“domain”;
变量页长度=200;
sheet=SpreadsheetApp.getActiveSheet();
var sites=SitesApp.getAllSites(域,0,页面长度);
对于(变量i=0;sites.length!=0;i+=页面长度){

对于(var j=0;j而言,仅当工作表不稳定时才添加行,例如,您无法确定在计算最后一行和添加新数据之间是否添加了新数据

另一种方法是构建输出,然后在一次写入中使用带有矩形2d
数组的
setValues
对其进行序列化:

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站点的应用程序脚本代码都只处理“旧”版本的Google站点-使用新版本创建的应用程序脚本代码无法访问:

2016年11月22日发布了站点的重建版本。应用程序脚本当前无法访问或修改使用此版本创建的站点,但脚本仍可以访问经典站点

参考资料


许多宏任务只需一两秒钟,但如果执行不当(读取:按记录使用)可能需要更长的时间。有些示例可能会将值复制到不同的位置并更改格式。我建议您共享一个代码示例或描述一点宏正在执行的操作。此外:您应该提供执行研究的参考。应用程序脚本代码始终有时间限制,但持续时间会根据使用环境而变化t(从30秒到30米,通常是6米)。我添加了执行的脚本。我认为问题不在于实现,而在于有很多站点。创建一个输出数组,并使用
setValues()
而不是appendRow。共享您的执行记录以进一步优化。