【发布时间】:2019-10-29 10:33:35
【问题描述】:
我目前正在制作一个脚本,该脚本将相互比较大约 90 个地址的列表。脚本的结果应该是一个列表,其中包含从彼此到达每个地址所花费的时间。
我在尝试解决此问题时遇到了一系列问题。主要问题是生成的距离矩阵将有 8100 个元素。 Google 脚本的最长执行时间是 30 分钟,因此脚本会一直超时。
有什么方法可以改进脚本以使其运行得更快?
此脚本的目的是生成一个包含 StartID、EndID 和 Time 的列表。然后,我将能够过滤列表以查找彼此相隔一小时内的地址。
谢谢!
function maps(origin, destination) {
var driving = Maps.DirectionFinder.Mode.DRIVING
var transit = Maps.DirectionFinder.Mode.TRANSIT
var modeSet = driving
var directions = Maps.newDirectionFinder()
.setOrigin(origin)
.setDestination(destination)
.setMode(modeSet)
.setOptimizeWaypoints(true)
.getDirections()
var result = directions
return result;
}
function GoogleMaps() {
//get distance
var sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("ABC");
var outputSheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("EFG");
var lastrow = sheet.getLastRow();
var lastcolumn = sheet.getLastColumn();
var range = sheet.getRange(2, 3, lastrow-1, 3);
//var range = sheet.getRange(2, 3, 3, 3);
//Origin is in row 2, column 3
var values = range.getValues();
var output = []
for (var i = 0; i < values.length; ++i)
{
var loop1 = values[i]
var start = values[i][1]
var startId = values[i][0]
for (var j = 0; j < values.length; j++) {
var loop2 = values[j]
var end = values[j][1]
var endId = values[j][0]
var result = maps(start, end)
var status = result.status
try{
var time = result.routes[0].legs[0].duration.value / 60;
var row = [startId, endId, time]
output.push(row)
} catch(err){
Logger.log(err);
}
}
}
var outputLength = output.length
var outputRange = outputSheet.getRange(1,1,outputLength,3);
outputRange.setValues(output);
}
编辑:更新列表中的元素数量
【问题讨论】:
-
90 * 90 就是 8100,这个怎么降到 3600?获取循环上方的列表是您创建
output数组的缓慢部分吗?较慢的部分是ouptutRange的创建吗?是否在 try/catch 中产生任何错误,如果是这样,您是否可以在逻辑上检测到比 try/catch 更快的条件。 -
是的,关于 8100 元素,您是对的。数据集从昨天开始更新,所以我还在想旧的数字。我使用 try/catch 块来尝试解决我在脚本的
result.routes[0].legs[0].duration.value方面遇到的另一个问题。 “腿”产生了一个未定义的错误。 -
我会建议检查未定义的
result.routes[0].legs === undefined,以及为什么它未定义? -
我用 3 行测试了
result.routes[0].legs[0].duration.value,得到了我想要的结果。这让我相信,也许问题在于腿不能针对如此大量的值起作用。我不确定如何解决这个问题。 -
如何在 Python 中执行此操作(例如),这样您就不会有超时限制?
标签: javascript node.js google-maps google-apps-script google-sheets