我从从外部端点获取的数据填充电子表格。一切正常,但是for...in循环的执行非常缓慢。

我从UrlFetchApp返回的对象很大; Object.keys().length > 1500,所以它可能只是对象的大小。

我很好奇是否有一种方法可以优化我的功能。

码:

    var sh = SpreadsheetApp.getActiveSheet();
    function getData() {
      var response = UrlFetchApp.fetch(endpoint);
      var data = JSON.parse(response);
      var rates = data["quotes"];
      var max = Object.keys(rates).length;
      var row = 2;
      var i = 0;
      clear(); //clears the range A2:B
      for (var key in rates) {
        sh.getRange("A" + (i+row)).setValue(key.substring(3));
        sh.getRange("B" + (i+row)).setValue(rates[key]);
        i++
        if (i+1 === max) {
          //do something after complete
        }
      }
    }

最佳答案

我不确定//do something after complete。那么这两种模式怎么样。请将此答案视为几个答案之一。

我修改了脚本,将setValue()替换为setValues()。这样,处理速度将很快。

模式1:

function getData1() {
  var sh = SpreadsheetApp.getActiveSheet();
  var response = UrlFetchApp.fetch(endpoint);
  var data = JSON.parse(response);
  var rates = data["quotes"];

  var keys = Object.keys(rates);
  var dat = [];
  keys.forEach(function(key){
    if (key != keys[keys.length - 1]) {
      dat.push([key.substring(3), rates[key]]);
    } else {
      //do something after complete
    }
  });
  sh.getRange(2, 1, dat.length, dat[0].length).setValues(dat);
}

模式2:
function getData2() {
  var sh = SpreadsheetApp.getActiveSheet();
  var response = UrlFetchApp.fetch(endpoint);
  var data = JSON.parse(response);
  var rates = data["quotes"];

  var dat = Object.keys(rates).map(function(key){return [key.substring(3), rates[key]]});
  sh.getRange(2, 1, dat.length, dat[0].length).setValues(dat);

  //do something after complete
}

注意 :
  • 如果这样做不起作用,可以从var response = UrlFetchApp.fetch(endpoint);提供样本数据吗?当然,请从其中删除私有(private)信息。

  • 引用:
  • setValue(value)
  • setValues(values)
  • Best Practices

  • 如果我误解了您的问题,对不起。

    08-19 09:21