這將是我第一次發帖,所以對于我可能寫或可能不寫的東西,我感到很抱歉。
我有一個有效的谷歌腳本,它從 URL 獲取檔案,決議 JSON,然后將資料提供給谷歌電子表格,一次一行。
我遇到的問題是其中一些檔案很大,有 7000 行大,腳本無法在 6 分鐘的給定時間內提供這些檔案。它處理每一行的速度很慢,大約每 1-3 秒處理 1 行。
我相信問題出在 for 子句上,但我似乎無法讓它發揮作用。我對這種腳本沒有那么有經驗,這是由“靈感”制成的
有沒有辦法加快 for 程序以便更快地填寫表格,所以它不會超時?
SpreadsheetApp.getUi()
.createMenu('Update')
.addItem('Refresh Report', 'getData')
.addToUi();
}
function getData() {
var ss = SpreadsheetApp.getActiveSpreadsheet();
//var sheets = ss.getSheets();
var datasheet = ss.getSheetByName('Data');
var hasCreatedHeaders = false;
//Url
var url = 'URL HERE';
//Create header
var headers = {
'Content-Type': 'application/json',
'Authorization': 'xxx'
};
//Options
var options = {
'method': 'get',
'headers': headers
};
var response = UrlFetchApp.fetch(url, options);
var json = response.getContentText();
var data = JSON.parse(json);
var table = data.Table1;
datasheet.clear();
//foreach row
table.forEach(function(row) {
var cols = [];
var headers = [];
for (var prop in row.Columns) {
if (!hasCreatedHeaders)
headers.push(prop);
cols.push(row.Columns[prop]);
}
if (!hasCreatedHeaders) {
datasheet.appendRow(headers);
hasCreatedHeaders = true;
}
datasheet.appendRow(cols);
});
}
uj5u.com熱心網友回復:
嘗試以table.forEach()這種方式更改回圈:
//foreach row
var table_new = []; // <--- create a new empty array
table.forEach(function (row) {
var cols = [];
var headers = [];
for (var prop in row.Columns) {
if (!hasCreatedHeaders)
headers.push(prop);
cols.push(row.Columns[prop]);
}
if (!hasCreatedHeaders) {
// datasheet.appendRow(headers);
table_new.push(headers); // <--- add row to the array
hasCreatedHeaders = true;
}
// datasheet.appendRow(cols);
table_new.push(cols); // <--- add row to the array
});
// put the array on the sheet all at once
datasheet.getRange(1,1,table_new.length,table_new[0].length).setValues(table_new);
問題是appendRow()方法非常耗時。setValues()如果您將表格創建為 2D 陣列,您可以使用方法一步將其放在作業表上。它要快得多。
參考
- 最佳實踐
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/441623.html
標籤:谷歌应用脚本
