Google apps脚本:urlfetchapp - 服务调用次数过多

时间:2012-05-15 09:49:21

标签: google-apps-script google-sheets

我有一个谷歌电子表格,在许多单元格中调用用户特定的功能。此函数获取3-4个特定的相对较短的网页并对其进行解析。页面每天只更改一次,但我不能/不知道如何强制我的电子表格每天只获取一次页面并使用缓存副本。 我相信在20次提取后刷新时会发生urlfetchapp错误。 “服务调用次数太多”。

我尝试找到解决此问题的方法。我认为这个错误是因为许多URL提取(即使是相同的URL,内容不变),而不是因为许多解析。

如果这是真的,怎么可以减少提取次数?例如,我可以在某处下载页面并在本地解析它们吗?我可以在谷歌电子表格中对网页使用某种缓存吗?如果我将这些文件的副本保存到我的电子表格所在的Google驱动器中会有帮助吗? 我可以增加URLfetchapp的限制吗? 还有其他想法吗?

3 个答案:

答案 0 :(得分:2)

您应该考虑使用为此类用例创建的Cache serviceThis blog post介绍该服务会显示一些基本用法。

答案 1 :(得分:1)

为了避免类似的问题,我实施了一种解决方法。它不是很优雅,但它的工作原理。它在循环中使用 Utilities.sleep()

function urlFetchWihtoutError(url) {
  const NB_RETRY = 10;
  var nbSecPause = 1.5;
  var nbErr = 0;
  while (nbErr < NB_RETRY) {
    try {
      if (nbErr > 0) SpreadsheetApp.getActiveSpreadsheet().toast("Here we go again.");
      var res = UrlFetchApp.fetch(url).getContentText();
      return res;
    }
    catch (error) {
      nbErr++;
      SpreadsheetApp.getActiveSpreadsheet().toast("Let's pause the system during " + nbSecPause + " seconds. Loop number: " + nbErr);
      Utilities.sleep(nbSecPause * 1000)
      nbSecPause += 0.5;
    }
  }
}

答案 2 :(得分:0)

添加缓存正是我所需要的。因此,我实现了一个使用缓存的fetch(url)函数,从而避免了重复调用。

function fetch(url) {
  var cache = CacheService.getScriptCache();
  var result = cache.get(url);
  if(!result) {
    var response = UrlFetchApp.fetch(url);
    result = response.getContentText();
    cache.put(url, result, 21600);
  }
  return result;
}