如何加快写入 google 电子表格
How to speed up writing onto google spreadsheet
我正在尝试为 google spread sheet 编写一个附加组件,它需要一个 csv 并写入一个新的 sheet。问题是 csv 可能会非常大,达到大约一百万行。我设法通过删除不必要的列来解决单元格限制问题,但我的脚本即使在 500,000 行时仍会超时。所以我想知道有没有办法提高写入速度?
这是我创建新 sheet 并用 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();
}
明确地说,数据应该是一个二维数组,使用 Utilities.parseCsv()
.
从 csv 数据转换而来
在我实测的benchmark中,当数据量较大时,使用SheetsAPI代替Spreadsheet服务(SpreadsheetApp
),可以降低处理成本。 Ref This situation is almost the same with and without V8 runtime. This has already been mentioned in 。在你的脚本中,当使用Sheets API时,它变成如下。
在使用此修改后的脚本之前,please enable Sheets API at Advanced Google services。
修改后的脚本 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().
开始,直接使用data
之前的CSV数据。请按如下方式修改您的脚本。所以,请直接把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());
}
参考文献:
我正在尝试为 google spread sheet 编写一个附加组件,它需要一个 csv 并写入一个新的 sheet。问题是 csv 可能会非常大,达到大约一百万行。我设法通过删除不必要的列来解决单元格限制问题,但我的脚本即使在 500,000 行时仍会超时。所以我想知道有没有办法提高写入速度?
这是我创建新 sheet 并用 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();
}
明确地说,数据应该是一个二维数组,使用 Utilities.parseCsv()
.
在我实测的benchmark中,当数据量较大时,使用SheetsAPI代替Spreadsheet服务(SpreadsheetApp
),可以降低处理成本。 Ref This situation is almost the same with and without V8 runtime. This has already been mentioned in
在使用此修改后的脚本之前,please enable Sheets API at Advanced Google services。
修改后的脚本 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().
开始,直接使用data
之前的CSV数据。请按如下方式修改您的脚本。所以,请直接把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());
}