0

我正在尝试运行一个谷歌电子表格宏(macro.gs),它必须下载大量属于某个域的谷歌站点链接,但执行需要很长时间,因此脚本结束并且尚未完成。我已经读到这就是这样设计的(限时执行),所以我在那里无能为力。

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

到目前为止,我所阅读的所有内容都没有提供有关如何执行此操作的任何信息。

4

1 回答 1

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 协作平台 - 无法访问使用新版本制作的代码:

Sites 的重建版本于 2016 年 11 月 22 日推出。Apps 脚本目前无法访问或修改使用此版本创建的站点,但脚本仍然可以访问经典站点。

参考

于 2018-07-13T11:28:04.463 回答