我从从外部端点获取的数据填充电子表格。一切正常,但是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)信息。 引用:
如果我误解了您的问题,对不起。