【问题标题】:How to fix the "Service invoked too many times for one day: urlfetch" error?如何修复“一天内调用的服务次数过多:urlfetch”错误?
【发布时间】:2019-11-15 21:38:17
【问题描述】:

我的 Google 工作表中出现以下错误:

Service invoked too many times for one day: urlfetch

我知道我没有拨打 10 万次电话,但我的工作表中确实有很多自定义函数。我尝试制作一张新工作表并将脚本复制/粘贴到该工作表中,但我仍然遇到同样的错误。然后我切换我的帐户,制作了一张新工作表,添加了代码,但我仍然收到了错误。

这仅仅是因为我在同一台计算机上吗?谷歌是否足够聪明,可以意识到我是同一个人试图这样做?我非常怀疑这一点,所以我想知道为什么它会抛出这个错误,即使在切换帐户并制作新工作表之后也是如此。

除此之外,有什么方法可以确保我以后不会超过限制?这个错误至少让我回到了我正在做的事情上的一天。我确实计划编写一个脚本,将导入的 HTML 作为值复制/粘贴到另一个工作表中,但在我得到它之前,我需要一个临时修复。


示例代码:

function tbaTeamsAtEvent(eventcode){
  return ImportJSON("https://www.thebluealliance.com/api/v3/event/" + eventcode + "/teams?X-TBA-Auth-Key=" + auth_key);
}

function ImportJSONForTeamEvents(url, query, options){
  var includeFunc = includeXPath_;
  var transformFunc = defaultTransform_;
  var jsondata = UrlFetchApp.fetch(url);
  var object   = JSON.parse(jsondata.getContentText());
  var newObject = [];
  for(var i = 0; i < object.length; i++){
    var teamObject = {};
    teamObject.playoff = object[i].alliances
    
    newObject.push(teamObject);
  }
  
  return parseJSONObject_(object, query, "", includeFunc, transformFunc);
}

这是用于特定功能的一组“代码”。我多次拉动两个不同的功能。我有大约 600 个功能,还有 4 个。如果所有调用都同时运行,那只会超过一千个调用。

我应该注意,我的驱动器中还有另一张表,它每小时自动更新为UrlFetch。不过,由于拉取率非常低,我认为这不会影响这一点。

【问题讨论】:

  • 这个数字只是一天的总和。但是,如果您在一天中的任何时间超过每秒 100000/86400 次操作的速率,那么您仍然可以触发错误。我实际上并不知道这一点,但通过使用这种方法,我已经避免了很长时间的此类错误。所以我猜它可能对你有用。但您可能需要等待一段时间才能再次尝试。
  • @Cooper 什么算作一次操作?我有一个读取和格式化 API 的函数,大约有 200 行代码。我的工作表中有许多(大约 600 个)这些函数,每个函数都算作一个操作,还是脚本经过的每个进程都算作一个操作?根据我所拥有的,似乎脚本中的每个单独操作?
  • 您的意思是您的脚本中有 600 个 UrlFetches?如果是这样,是的,我认为这可能是问题所在。如果您可以控制将它们减慢到每秒约 2 次而不会超时,那可能会起作用。同样,我没有内幕消息。我真的不知道。这是我用来避免错误的方法。我猜每秒两次会让你超时,所以也许你需要重新考虑你的功能。
  • 您能否提供一些代码来重现您的问题?正如 Cooper 所说,这个速率可以根据每秒的调用次数来超过。但是,这不太可能。
  • @Cooper 我没有 600 个 UrlFetches,很抱歉造成混淆。我每个函数有 2 个 UrlFetches。我将编辑 OP 以反映一些代码

标签: json google-apps-script google-sheets urlfetch custom-function


【解决方案1】:

我遇到了类似的问题,尽管我在函数中只调用了两个 fetch 调用并且每个数据行的每个函数。它呈指数增长,并且随着我的数据变化,每次重新计算调用也称为那些函数,它很快达到最大值。
我的解决方案?我开始使用缓存服务来临时存储 fetch 调用的结果,即使只有几秒钟,以允许由同一重新计算事件触发的所有单元格仅使用单个调用传播。每次访问工作表时,这个简单的添加都为我节省了数千次 fetch 调用。

供参考: https://developers.google.com/apps-script/reference/cache?hl=en

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多