谷歌应用程序脚本-仍在努力循环通过行



我仍在努力理解循环。

我有一个脚本,可以计算两个地址之间的距离(公里(。在这一点上,它只计算第12行的距离,并将结果放在第12行C列中。

Start           End           Total km's      
address one     address two   16,283           

代码(可在网上找到(:

function GOOGLEMAPS() {
var start_address = SpreadsheetApp.getActiveSheet().getRange('A12').getValue();
var end_address = SpreadsheetApp.getActiveSheet().getRange('B12').getValue();
var mapObj = Maps.newDirectionFinder();
mapObj.setOrigin(start_address);
mapObj.setDestination(end_address);
var directions = mapObj.getDirections();
var getTheLeg = directions["routes"][0]["legs"][0];
var meters = getTheLeg["distance"]["value"];
var keerduizend = meters / 1000;
SpreadsheetApp.getActiveSheet().getRange('C12').setValue(keerduizend);
}

最终的结果应该是,它可以计算出表格中的所有距离:

A               B             C
Start           End           Total km's      
address one     address two   16,283    
address two     address one   16,283    
address three   address four  16,283    
address five    address six   16,283    
Total        SUM(C12:C15)

如果有4个地址或40个地址,用户应该能够添加行(在最后一行有地址和行总数之间(。由于我仍在努力理解循环,我不知道如何实现这一点。

有人能向我解释一下如何做到这一点吗?

编辑

感谢Diego剧本的第一部分作品:

function GOOGLEMAPS() {
var sheet = SpreadsheetApp.getActiveSheet();
var start_addresses = sheet.getRange('B12:B26').getValues(); // [["address one"], ["address two"], ["address three"], ["address five"]]
var end_addresses = sheet.getRange('D12:D26').getValues(); // [["address two"], ["address one"], ["address four"], ["address six"]]
var distances = []; // This will store all of the distances
for (var i = 0; i < start_addresses.length; i++) {
var mapObj = Maps.newDirectionFinder();
if (start_addresses[i][0] != "" && end_addresses[i][0] != "") {
mapObj.setOrigin(start_addresses[i][0]);
mapObj.setDestination(end_addresses[i][0]);
var directions = mapObj.getDirections();
var getTheLeg = directions["routes"][0]["legs"][0];
var meters = getTheLeg["distance"]["value"];
var keerduizend = meters / 1000;
distances.push([keerduizend]);
}
}
sheet.getRange('E12:E26').setValues(distances);
}

仍然有错误

The number of rows in the data does not match the number of rows in the range. The data has 3, but the range has 15. (line 30, file 'Code')

但我会先自己想办法解决这个问题。

要读取范围"A12:B15"中的所有值,应使用.getValues()。如果您查看文档,您会发现它返回一个二维数组。数组中的第一个元素是行,第二个元素是列。类似这样的东西:

0      1
0 [ ["A-1", "B-1"] ]
1 [ ["A-2", "B-2"] ]

所以A-1的地址是[0][0];A-2的地址为CCD_ 3;B-1的地址为CCD_ 4;B-2的地址为CCD_ 5。您可以使用for循环读取每个地址的值。看看下面的代码,试着在纸上弄清楚,然后在编辑器中运行它。

function test_forLoop() {
var data = [["A-1", "B-1"], ["A-2", "B-2"]];
for (var rowIndex = 0; rowIndex < data.length; rowIndex++) {
for (var columnIndex = 0; columnIndex < data[rowIndex].length; columnIndex++) {
Logger.log(data[rowIndex][columnIndex]); // Will print: "A-1", "B-1", "A-2", "B-2"
}
}
}

这只是一个非常简短的介绍,但让我们回到您的代码。您可以在列A范围和列B范围上调用.getValues(),然后循环这些值来计算各种距离。最后,您可以使用.setValues()将结果打印到C列。

function GOOGLEMAPS() {
var sheet = SpreadsheetApp.getActiveSheet();
var start_addresses = sheet.getRange('A12:A15').getValues(); // [["address one"], ["address two"], ["address three"], ["address five"]]
var end_addresses = sheet.getRange('B12:B15').getValues(); // [["address two"], ["address one"], ["address four"], ["address six"]]
var distances = []; // This will store all of the distances
for (var i = 0; i < start_addresses.length; i++) {
var mapObj = Maps.newDirectionFinder();
if (start_addresses[i][0] != "" && end_addresses[i][0] != "") {
mapObj.setOrigin(start_addresses[i][0]);
mapObj.setDestination(end_addresses[i][0]);
var directions = mapObj.getDirections();
var getTheLeg = directions["routes"][0]["legs"][0];
var meters = getTheLeg["distance"]["value"];
var keerduizend = meters / 1000;
distances.push([keerduizend]);
} else {
distances.push([null]);
}
}
sheet.getRange('C12:C15').setValues(distances);
}

有多种方法可以做到这一点,但为了帮助你更容易地理解它,我选择对你写的内容进行尽可能少的修改。如果你理解它,那么请继续思考如何改进它。例如,如果你同时选择A列和B列(sheet.getRange('A12:B15')(呢?

最新更新