Добавить элементы в массив внутри цикла - PullRequest
0 голосов
/ 16 декабря 2018

У меня есть следующий код для преобразования серии почтовых кодов в длинные лат путем выбора ячеек, в этом примере A2: C3

Это работает хорошо, но я хочу, чтобы это было, это получить диапазондобавьте в массив запись long и lat, а затем сбросьте массив обратно на лист, предполагая, что это будет быстрее.

Я пробовал cells.split, но все еще мог печатать только одну строку назад

Пример данных, почтовые индексы Великобритании с пустыми ячейками для длинных и лат

  |     A    |      B     |      C     |
1 | Postcode | Long       | Lat        |
2 | SW1 1AA  |            |            |
3 | EC1V 9BP |            |            |

Текущий скрипт приложения

function getGeocodingRegion() {
  return PropertiesService.getDocumentProperties().getProperty('GEOCODING_REGION') || 'uk';
}

function addressToPosition() {
  var sheet = SpreadsheetApp.getActiveSheet();
  var cells = sheet.getActiveRange();

  var addressColumn = 1;
  var addressRow;

  var latColumn = addressColumn + 1;
  var lngColumn = addressColumn + 2;

  var geocoder = Maps.newGeocoder().setRegion(getGeocodingRegion());
  var location;

  for (addressRow = 1; addressRow <= cells.getNumRows(); ++addressRow) {
    var address = cells.getCell(addressRow, addressColumn).getValue();

    // Geocode the address and plug the lat, lng pair into the 
    // 2nd and 3rd elements of the current range row.
    location = geocoder.geocode(address);

    // Only change cells if geocoder seems to have gotten a 
    // valid response.
    if (location.status == 'OK') {
      lat = location["results"][0]["geometry"]["location"]["lat"];
      lng = location["results"][0]["geometry"]["location"]["lng"];

      cells.getCell(addressRow, latColumn).setValue(lat);
      cells.getCell(addressRow, lngColumn).setValue(lng);
    }
  }
};

1 Ответ

0 голосов
/ 16 декабря 2018

Так как вы делаете это для каждой строки электронной таблицы, вы можете просто получить getValues ​​() для всех строк, пройтись по значениям и построить другой 2D-массив, а затем использовать setValues ​​(), чтобы поместить этот массив рядом со столбцом адреса

function addressToPosition() {
  var sheet = SpreadsheetApp.getActiveSheet();

  // Get all values at once, a 2D array with getLastRow() rows and 1 column
  var cells = sheet.getRange(1,1,sheet.getLastRow(),1).getValues();
  var results = [];  // Will build a 2D array for setValues()
  for( var i=0; i<cells.length; i++ ) {
    var location = geocoder.geocode(cells[i][0]);
    if( location.status === "OK" ) {
      // I'm assuming this works, can't test
      var lat = location["results"][0]["geometry"]["location"]["lat"];
      var lng = location["results"][0]["geometry"]["location"]["lng"];
      results.push([lat,lng]);
    }
    else {
      results.push(["",""]); // if status is not OK
    }
  }
  // Now put the results in columns B and C
  sheet.getRange(1,2,results.length,results[0].length).setValues(results);
};
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...