получение широты / длины из адреса с геокодом в скрипте Google apps

#google-apps-script #google-sheets #geocoding #google-geocoder

#google-apps-script #google-sheets #геокодирование #google-геокодер

Вопрос:

У меня есть этот рабочий код, который получает комбинацию широты / длины из адреса.

 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' .

Ответ №1:

Объяснение / Проблемы:

  • Прежде всего, ваш код довольно неэффективен. Причина этого в том, что вы используете getRange и setValue внутри for цикла, но также два раза за итерацию. Как объясняется в рекомендациях, правильный способ достижения вашей цели — сохранить значения в пустой массив, а затем использовать setValues outside the for loop для их установки на вашем листе.
  • Другая модификация уже упоминается в другом ответе. Вы хотите объединить 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
    
}
 

Ответ №2:

Из того, что я понял, в настоящее время вы получаете значения широты и долготы и записываете их в разные ячейки, но вы хотите, чтобы они оба были в одной ячейке, разделенные запятой. Если это так, то вы можете внести следующие изменения.

От:

 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(), если хотите записать его в другую ячейку.