I am populating a spreadhsheet from data I am getting from an external endpoint. Everything is working, but the execution of the for...in loop is incredibly slow.
Th
I was not sure about //do something after complete
. So how about these 2 patterns. Please think of this answer as one of several answers.
I modified your script to replace setValue()
to setValues()
. By this, the process speed will be fast.
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);
}
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);
? Of course, please remove the private information from it.If I misunderstand your question, I'm sorry.
The problem is not with the size of your object. You are repeatedly calling sheet.getRange() to get every individual cell in the target range which is redundant. Keep read/process/write operations completely separate from each other to optimize performance. 1) Retrieve values 2) Process them, and 3) Call 'setValues()' on the target range. This took less than 0.2 seconds to finish:
var arr = [];
for (var [prop, val] in hugeObject) {
arr.push([prop, val]);
}
var targetRange = SpreadsheetApp.getActive()
.getSheets()[0]
.getRange(2, 1, arr.length, arr[0].length)
.setValues(arr);