我正在嘗試將我的 Google 表格連接到 Firebase-RTDB,因為我想將我的資料傳輸到適當的資料庫(由于大量資料)并根據第一列值通過 google 表格獲取它們。
代碼有效,但性能一點也不令人滿意。即使在執行回圈之前使用 If 陳述句捕獲單元格是否為空,也需要大約 20 秒。如果我不這樣做,僅80行就需要60秒。這一點都不好。
function getAllData_ID33() {
//Read sheet
var ss = SpreadsheetApp.openById('**MY_GOOGLESHEET_ID**');
let sheet = ss.getSheetByName('Test')
let startRow = 2
//Get Range
let numRow = sheet.getDataRange().getLastRow();
let lastCols = sheet.getDataRange().getLastColumn();
let dataRange = sheet.getRange(startRow, 1, numRow, lastCols);
let celldata = dataRange.getValues();
//connect_link
//ID33_Headoffice
var ID33_HEADOFFICE_DATABASE = "**MY_FIREBASE_LINK**";
//if first and fourth column is not empty, pass.
//Otherwise, start the fetching loop.
for (j = 0; j < celldata.length-1; j ) {
//row = row[column]
row = celldata[j];
let phyid = ID33_HEADOFFICE_DATABASE "//" row[0]
let base = FirebaseApp.getDatabaseByUrl(phyid);
let dataSet_33headoffice = [base.getData()];
let id33_rows = [], data_33_headofflice;
if (row[0] != "") {
if (row[4] == "") {
for (i = 0; i < dataSet_33headoffice.length; i ) {
//need Booking ID, Stockout-ID, Branch ID, Branch To Name, Comment
data_33_headofflice = dataSet_33headoffice[i];
//Logger.log([
//data_33_headofflice['Booking ID'],
//data_33_headofflice['Stock Out (ID)'],
//data_33_headofflice['Branch (ID)'],
//data_33_headofflice['Branch To (Name)'],
//data_33_headofflice['Comment']
//]);
id33_rows.push([
data_33_headofflice['Booking ID'],
data_33_headofflice['Stock Out (ID)'],
data_33_headofflice['Branch (ID)'],
data_33_headofflice['Branch To (Name)'],
data_33_headofflice['Comment']
]);
let id33dataRange = sheet.getRange(j 2,2,id33_rows.length,5);
id33dataRange.setValues(id33_rows);
}
}
}
}
}
應該注意的是,我對 Javascript/Google App Script 一點也不熟悉。我什至不知道 Firebase 是否適合這樣的任務。因此,如果您確實知道是什么導致它變慢以及如何改進,請解釋一下。感謝所有的支持!
uj5u.com熱心網友回復:
我相信你的目標如下。
- 您想降低腳本的處理成本。
從The code works, but the performance is not very satisfying at all.,我了解到您的腳本有效。從這種情況來看,下面的修改呢?
修改點:
- 在
setValues回圈中使用時,處理成本變高。參考 - 從你的展示腳本中,我猜
dataSet_33headoffice.length可能總是 1。因為什么時候dataSet_33headoffice.length是 2,我認為行有偏差。但是,在你的問題中,你說The code works. 所以,我猜這個值可能是1。 - 為了通過降低流程成本將值放入離散行,我想建議使用 Sheets API。這樣,通過一個 API 呼叫,可以輸入值。
當這些點反映在你的腳本中時,下面的修改怎么樣?
修改后的腳本:
在使用此腳本之前,請在 Advanced Google services 中啟用 Sheets API。
function getAllData_ID33() {
var spreadsheetId = "###"; // Please set your Spreadsheet ID.
var sheetName = 'Test'; // Please set your sheet name.
var ID33_HEADOFFICE_DATABASE = "**MY_FIREBASE_LINK**"; // Please set this value.
var ss = SpreadsheetApp.openById(spreadsheetId);
let sheet = ss.getSheetByName(sheetName)
let startRow = 2
let numRow = sheet.getDataRange().getLastRow();
let lastCols = sheet.getDataRange().getLastColumn();
let dataRange = sheet.getRange(startRow, 1, numRow, lastCols);
let celldata = dataRange.getValues();
var data = [];
for (j = 0; j < celldata.length - 1; j ) {
row = celldata[j];
let phyid = ID33_HEADOFFICE_DATABASE "//" row[0]
let base = FirebaseApp.getDatabaseByUrl(phyid);
let dataSet_33headoffice = [base.getData()];
let id33_rows = [], data_33_headofflice;
if (row[0] != "") {
if (row[4] == "") {
for (i = 0; i < dataSet_33headoffice.length; i ) {
data_33_headofflice = dataSet_33headoffice[i];
id33_rows.push([
data_33_headofflice['Booking ID'],
data_33_headofflice['Stock Out (ID)'],
data_33_headofflice['Branch (ID)'],
data_33_headofflice['Branch To (Name)'],
data_33_headofflice['Comment']
]);
}
if (id33_rows.length > 0) {
data.push({ range: `'${sheetName}'!B${j 2}`, values: id33_rows });
}
}
}
}
if (data.length == 0) return;
Sheets.Spreadsheets.Values.batchUpdate({ data, valueInputOption: "USER_ENTERED" }, spreadsheetId);
}
- 運行此腳本時,將在回圈中創建請求正文。并且,請求正文使用 Sheets API 在回圈之外使用。由此,可以降低處理成本。
筆記:
- 此示例腳本假定您的腳本運行良好。請注意這一點。
參考:
- 方法:電子表格.values.batchUpdate
uj5u.com熱心網友回復:
您需要將這兩行移出回圈:
let id33dataRange = sheet.getRange(j 2, 2, id33_rows.length,5);
id33dataRange.setValues(id33_rows);
否則,您將在每次回圈迭代后更新電子表格。
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/504483.html
標籤:Google Cloud Collective 火力基地 表现 谷歌应用脚本 谷歌表格
