我正在嘗試為 google 電子表格撰寫一個插件,它需要一個 csv 并寫入一個新表格。問題是 csv 可能非常大,達到大約一百萬行。我設法通過洗掉不必要的列來解決單元格限制問題,但我的腳本即使在 500,000 行時也會超時。所以我想知道是否有辦法提高寫入速度?
這是我創建一個新作業表并用 csv 資料填充它的代碼:
function writeDataToSheet(data,sheetName) {
const ss = SpreadsheetApp.getActive();
const sheet = ss.insertSheet(sheetName);
const neededColumns = data[0].length;
const totalColumns = sheet.getMaxColumns();
const columnsToDelete = totalColumns - neededColumns;
if(columnsToDelete > 0) sheet.deleteColumns(totalColumns , columnsToDelete);
sheet.getRange(1, 1, data.length, data[0].length).setValues(data);
return sheet.getName();
}
需要明確的是,資料應該是一個二維陣列,使用 .csv 資料從 csv 資料轉換而來Utilities.parseCsv()。
uj5u.com熱心網友回復:
在我實測的基準測驗中,當資料量很大時,使用 Sheets API 代替 Spreadsheet 服務 ( SpreadsheetApp) 可以降低處理成本。Ref這種情況在有和沒有 V8 運行時幾乎相同。這已經在TheMaster 的評論中提到了。在您的腳本中,當使用 Sheets API 時,它變成如下。
在您使用這個修改后的腳本之前,請在高級 Google 服務中啟用 Sheets API。
修改后的腳本 1:
在本次修改中,使用了你data的。請按如下方式修改您的腳本。
從:
sheet.getRange(1, 1, data.length, data[0].length).setValues(data);
到:
Sheets.Spreadsheets.Values.update({values: data}, ss.getId(), sheet.getSheetName(), {valueInputOption: "USER_ENTERED"});
修改后的腳本 2:
本次修改中,直接使用了To be clear, data is supposed to be a 2 dimensional array, converted from csv data using Utilities.parseCsv().之前的CSV資料data。請按如下方式修改您的腳本。所以,請直接提出csvData以下要求。
從:
sheet.getRange(1, 1, data.length, data[0].length).setValues(data);
到:
function writeDataToSheet(csvData, sheetName) {
const ss = SpreadsheetApp.getActive();
const sheet = ss.insertSheet(sheetName);
const requests = { requests: [{ pasteData: { data: csvData, coordinate: { sheetId: sheet.getSheetId() } } }] };
Sheets.Spreadsheets.batchUpdate(requests, ss.getId());
}
參考:
- 方法:spreadsheets.values.update
- 基準測驗:使用 Google Apps 腳本讀寫電子表格
- 基準測驗:使用 Google Apps 腳本將 CSV 資料匯入電子表格
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/402316.html
標籤:
