当前位置:  开发笔记 > 编程语言 > 正文

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

如何解决《如何在函数调用之间放置Utilities.sleep()?》经验,为你挑选了1个好方法。

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

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)

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

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

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



1> SpiderPig..:

这里的问题是,即使你放入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;
}

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

推荐阅读
mobiledu2402851173
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有