在谷歌应用程序脚本中使用地理编码从地址获取纬度/经度

问题描述 投票:0回答:3

我有这个工作代码,可以从地址获取纬度/经度组合。

function testgeocode(){ 
    var responses = SpreadsheetApp.openById('###').getSheetByName('Form Responses');
    var range = responses.getRange('AD2:AD');
    var addresses = range.getValues();

    var row = range.getRow();
    var column = range.getColumn();

    var destination = new Array();
    destination[0] = 31; // column + 1;
    destination[1] = 32; // column + 2;

    var geocoder = Maps.newGeocoder();
    var count = range.getHeight();
  
    for(i in addresses) {
        var location = geocoder.geocode(addresses[i]).results[0].geometry.location;
        responses.getRange(row, destination[0]).setValue(location.lat);
        responses.getRange(row++, destination[1]).setValue(location.lng);
        Utilities.sleep(200);
    }
}

我很难修改它,以便将纬度/经度组合输出到格式为

'lat,long'
的一列中。

google-apps-script google-sheets geocoding google-geocoder
3个回答
1
投票

说明/问题:

  • 首先,你的代码效率很低。原因是因为您在

    getRange
    循环中使用
    setValue
    for
    ,而且每次迭代使用两次。正如最佳实践中所述,实现目标的正确方法是将值存储到空数组中,然后在
    setValues
    循环之外使用
    for
    将它们设置到工作表中。

  • 其他修改已经在其他答案中提到了。您想要连接

    location.lat
    location.lng
    ,并用逗号分隔。

解决方案:

function testgeocode(){ 
    var responses = SpreadsheetApp.openById('###').getSheetByName('Form Responses');
    var range = responses.getRange('AD2:AD');
    var addresses = range.getValues();

    var row = range.getRow();
    var column = range.getColumn();

    var destination = new Array();
    destination[0] = 31; // column + 1;
    destination[1] = 32; // column + 2;

    var geocoder = Maps.newGeocoder();
    var count = range.getHeight();
    
    var data = [];
  
    for(i in addresses) {
        var location = geocoder.geocode(addresses[i]).results[0].geometry.location;
        data.push([location.lat + ',' + location.lng]) // new code
        Utilities.sleep(200);
    }
    
    responses.getRange(2,destination[0],data.length,1).setValues(data); // new code
    
}

0
投票

据我了解,目前您正在获取纬度和经度值并将它们写入不同的单元格,但您希望将它们都放在一个单元格中,并用逗号分隔。 如果是这种情况,那么您可以进行以下更改。

来自:

var location = geocoder.geocode(addresses[i]).results[0].geometry.location;
responses.getRange(row, destination[0]).setValue(location.lat);
responses.getRange(row++, destination[1]).setValue(location.lng);

致:

var location = geocoder.geocode(addresses[i]).results[0].geometry.location;
responses.getRange(row, destination[0]).setValue(location.lat + ',' + location.lng);

如果你想将其写入不同的单元格,可以调整getRange()的参数。


0
投票

另一种方法是创建自定义函数:

function a2c(address){
  var geo = Maps.newGeocoder().geocode(address);
  var loc = geo.results[0].geometry.location;
  return ([[loc.lat,loc.lng]]);
}

此函数将返回一对 lat lng 作为两列

© www.soinside.com 2019 - 2024. All rights reserved.