【问题标题】:How do I put Utilities.sleep() between function calls?如何在函数调用之间放置 Utilities.sleep()?
【发布时间】:2016-04-04 19:03:10
【问题描述】:

我有一个函数计算两个坐标之间的距离,如下所示:

function distance(origin, destination) {
  //Utilities.sleep(Math.random() * 60000);
  destination = destination + "";
  if (destination.split(",").length == 2) {
    var directions = Maps.newDirectionFinder()
    .setOrigin(origin)
    .setDestination(destination)
    .getDirections();
    if (directions.routes.length > 0) {
      return directions.routes[0].legs[0].distance.value / 1000;
    }
    return "-";
  }
  return 0;
}

在电子表格中使用如下:

=distance("83.342353,23.23353", V2)

该函数运行良好,但由于我的电子表格有 200 多行,因此达到了 url 调用的速率限制。错误信息是:

服务在短时间内调用太多次:urlfetch protected host rateMax。在通话之间尝试 Utilities.sleep(1000)。 (第 5 行)

建议的修复方法是在代码中添加Utitlies.sleep()。我应该把这个放在哪里?

【问题讨论】:

  • 您是否将其用作 Google 表格中的自定义函数?
  • 是的。我已将公式添加到问题中。

标签: google-apps-script google-sheets


【解决方案1】:

这里的问题是,即使你把Utilities.sleep 放在那里,这个函数仍然会同时被多次调用。这就是谷歌表格通常所做的事情。它并行运行功能以加快速度。 所以你需要强制它按顺序运行,你可以用锁来实现。 例如

function distance(origin, destination) {
  destination = destination + "";
  if (destination.split(",").length == 2) {
    var lock = LockService.getScriptLock();
    lock.waitLock(20000);
    Utilities.sleep(500);
    var directions = Maps.newDirectionFinder()
    .setOrigin(origin)
    .setDestination(destination)
    .getDirections();
    lock.releaseLock();
    if (directions.routes.length > 0) {
      return directions.routes[0].legs[0].distance.value / 1000;
    }
    return "-";
  }
  return 0;
}

但测向服务的配额相对较低。也许每天只有 1000 次使用。所以你可能仍然会遇到问题。

【讨论】:

  • 谢谢。正如你所说,我达到了配额,所以我会选择非 Google 脚本方法。
  • @topher 你选择了哪种方法?
猜你喜欢
  • 2012-06-23
  • 1970-01-01
  • 2015-09-05
  • 2011-10-13
  • 1970-01-01
  • 1970-01-01
  • 2022-01-06
  • 1970-01-01
  • 2023-04-07
相关资源
最近更新 更多