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

top*_*her 1 google-sheets google-apps-script

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

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;
}
Run Code Online (Sandbox Code Playgroud)

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

=distance("83.342353,23.23353", V2)
Run Code Online (Sandbox Code Playgroud)

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

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

修复建议是Utitlies.sleep()在代码中添加一个.我应该把它放在哪里?

Spi*_*Pig 5

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

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;
}
Run Code Online (Sandbox Code Playgroud)

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