如何加快写入 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());
}

参考文献: