我有一个函数计算两个坐标之间的距离,如下所示:
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()
在代码中添加一个.我应该把它放在哪里?
这里的问题是,即使你放入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次.所以你可能仍会遇到问题.