javascript - 在循环内向数组添加元素

标签 javascript google-apps-script google-sheets

我有以下代码,通过选择单元格将一系列邮政编码转换为长纬度,在本例中为 A2:C3

它工作得很好,但我希望它做的是将范围添加到数组中,然后将数组转储回工作表,假设它会更快。

我已经尝试过 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);
    }
  }
};

最佳答案

由于您要对电子表格的每一行执行此操作,因此您只需为所有行执行 getValues(),循环遍历值并构建另一个二维数组,然后使用 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);
};

关于javascript - 在循环内向数组添加元素,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53805284/

相关文章:

google-sheets - 在谷歌表格中分割后文本变成数字

javascript - 安装和使用 React

javascript - 选中时使用 FontAwesome 单选按钮下载文件

javascript - AJAX 用户登录不起作用

javascript - 比较两种不同格式的时间戳 - GAS

javascript - 如何设置服务以传递谷歌工作表 ID? AngularJS

javascript - 在 JQuery 中为方法声明一个基变量

google-apps-script - 如何使用谷歌应用程序脚本在谷歌文档中的特定文本后附加表格?

mysql - Google-Apps-Script 非云数据库连接选项

google-apps-script - 在 Google 电子表格中运行脚本时出现权限错误