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

时间:2018-07-13 09:50:06

标签: 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.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脚本运行“任务队列”以在没有时间限制的情况下运行它,但是我不确定是否可以在任务内运行电子表格宏来规避该时间限制。

到目前为止,我所读的所有内容都没有提供有关操作方法的任何信息。

1 个答案:

答案 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当前无法访问或修改使用此版本创建的站点,但是脚本仍可以访问经典站点。

参考