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