我有一个计算两个坐标之间距离的函数,如下所示:
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)
。我应该把它放在哪里?
答案 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次。所以你可能仍会遇到问题。