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

Loops 谷歌应用程序脚本-仍在努力通过行循环,loops,google-apps-script,Loops,Google Apps Script,我仍在努力理解循环 我有一个脚本,可以计算两个地址之间的距离(以公里为单位)。此时,它只计算第12行的距离,并将结果放入第12行的C列 Start End Total km's address one address two 16,283 代码(可在web上找到): 最终结果应该是,它可以计算放入图纸中的所有距离: A B C Start

我仍在努力理解循环

我有一个脚本,可以计算两个地址之间的距离(以公里为单位)。此时,它只计算第12行的距离,并将结果放入第12行的C列

Start           End           Total km's      
address one     address two   16,283           
代码(可在web上找到):

最终结果应该是,它可以计算放入图纸中的所有距离:

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个地址,用户都应该能够添加行(在最后一个地址行和总计行之间)。由于我仍在努力理解循环,我不知道如何实现这一点

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

编辑

多亏了迭戈,剧本的第一部分开始发挥作用:

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);

}


但是,我会先自己尝试解决这个问题。

要读取“A12:B15”范围内的所有值,您应该使用。如果您查看文档,您会看到它返回一个二维数组。数组中的第一个元素是行,第二个元素是列。类似这样:

       0      1
0 [ ["A-1", "B-1"] ]
1 [ ["A-2", "B-2"] ]
因此,A-1的地址是
[0][0]
;A-2的地址是
[1][0]
;B-1的地址是
[0][1]
;B-2的地址是
[1][1]
。您可以使用A读取每个地址的值。查看下面的代码,尝试在纸上找出它,然后在编辑器中运行它

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列(
sheet.getRange('A12:B15')
)?

要读取“A12:B15”范围内的所有值,您应该使用。如果查看文档,您会看到它返回一个二维数组。数组中的第一个元素是行,第二个元素是列。类似于以下内容:

       0      1
0 [ ["A-1", "B-1"] ]
1 [ ["A-2", "B-2"] ]
因此,A-1的地址是
[0][0]
;A-2的地址是
[1][0]
;B-1的地址是
[0][1]
;B-2的地址是
[1][1]
。您可以使用A读取每个地址的值。查看下面的代码,尝试在纸上找出它,然后在编辑器中运行它

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列(
sheet.getRange('A12:B15')
)可能是因为var start_address=SpreadsheetApp.getActiveSheet().getRange('A12').getValue();var end_address=SpreadsheetApp.getActiveSheet().getRange('B12').getValue();只选择了一个值??是的,这是一个问题,但我不知道如何在脚本的其余部分中添加多个值。请查看Google文档,getValues()var start_address=SpreadsheetApp.getActiveSheet().getRange('B12:B26').getValues();给出了该范围内的值,但我不知道用户将在工作表中放置多少个路由。因此,我需要在地址列中循环,并将计算结果放在正确的行中。但是,当显示总计的行时,循环需要停止(否则我认为它将给出错误)可能是因为var start_address=SpreadsheetApp.getActiveSheet().getRange('A12').getValue();var end_address=SpreadsheetApp.getActiveSheet().getRange('B12').getValue();只选择了一个值??是的,这是一个问题,但我不知道如何在脚本的其余部分添加多个值。请查看Google文档,getValues()var start_address=SpreadsheetApp.getActiveSheet().getRange('B12:B26').getValues();提供该范围内的值,但我不知道用户将在该表中放置多少条路由。因此我需要循环地址列,并将计算结果放在正确的行。但是,当显示包含总计的行时,循环需要停止(否则它会给出一个错误,我想)谢谢你的帮助。我会使用你给我的代码。我知道如何使用getValues获得多个值,但之后我会处理这个部分。这是因为我不完全理解循环中发生了什么。它在mapObj.setOrigin(start_地址[I][0]处给出了一个错误);无效参数。如果使用记录器,我会看到start_addresses返回A列(for循环中)中所有值的4倍。因此,它会返回整个范围4倍(但有3行被填充)。@NinaBakker
start_addresses[I][0]
的哪个值返回错误?错误发生在mapObj.setOrigin(start_addresses[I][0]);,我想是因为起始地址包含4个数组,其中包含所有地址。mapObj需要一个带有地址的数组。我将更新我的问题,以便有更多的空间来解释发生了什么。@NinaBakker用
距离修复了问题。push([null])
谢谢你的帮助。我将使用你给我的代码。我知道如何使用getValues获取多个值,但之后我会处理该部分。这是因为我不完全理解循环中发生的事情。它在mapObj.setOrigin(起始地址[I][0])处出错;无效参数。如果使用记录器,我会看到start_addresses返回A列(for循环中)中所有值的4倍。因此,它会返回整个范围4倍(但有3行被填充)。@NinaBakker
start_addresses[I][0]
的哪个值返回错误?错误发生在mapObj.setOrigin(start_addresses[I][0]);,我想是因为起始地址包含4个数组,其中包含所有地址。mapObj需要一个带有地址的数组。我将更新我的问题,这样我就有更多的空间来解释发生了什么。@NinaBakker用
距离进行了修复。push([null])
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);

}