如何在函数调用之间放置Utilities.sleep()?

时间:2015-12-30 19:14:43

标签: google-apps-script google-sheets

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

curl_form

它在电子表格中使用如下:

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;
}

该函数运行正常但达到了url调用的速率限制,因为我的电子表格有超过200行。错误消息是:

  

服务在短时间内调用了太多次:urlfetch保护主机rateMax。在两次通话之间尝试Utilities.sleep(1000)。 (第5行)

建议修复是在代码中放置=distance("83.342353,23.23353", V2) 。我应该把它放在哪里?

1 个答案:

答案 0 :(得分:5)

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

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次。所以你可能仍会遇到问题。