我有一个脚本,它使用 setValues 合并两个具有相同结构的电子表格。最近开始超时了,因为数据随着时间的推移变得太大了
我做了一些研究并偶然发现了这个网站,它比较了不同读/写方法的性能。结论是使用 google 的高级服务(Sheets API)可以比 setValues 节省大量时间。
我真的很纠结如何将我的脚本转换为使用 SheetsAPI。这是我的原始代码:
function getData() {
var get_files = ['File1', 'File2'];
var copySheet = SpreadsheetApp.openById('[ID for end result]').getSheetByName('Sheet1');
copySheet.getRange('A2:Z').clear();
for (z = 0; z < get_files.length; z++) {
var files = DriveApp.searchFiles(`title='${get_files[z]}' and mimeType='${MimeType.GOOGLE_SHEETS}' and trashed=false`);
var file = files.hasNext() && files.next();
if (!file) {
console.log(`"${get_files[z]}" of Google Spreadsheet was not found.`);
continue;
}
var sheets = SpreadsheetApp.open(file).getSheets();
for (var i = 0; i < sheets.length; i++) {
var values = sheets[i].getDataRange().getValues().slice(1);
copySheet.getRange(copySheet.getLastRow() + 1, 1, values.length, values[0].length).setValues(values);
}
}
}
我不熟悉 Sheets API,我尝试利用 SheetsAPI 实现 Range.copyTo 并使用更少的处理时间。
当我看到你的脚本时,我认为 Sheets API 可用于从电子表格的所有工作表中检索所有值,也可用于将所有值放入目标工作表。当这反映在您的脚本中时,以下修改如何?
在使用此脚本之前,请在 Advanced Google 服务中启用 Sheets API。
function getData() {
var spreadsheetId = "[ID for end result]"; // Please set your destination spreadsheet ID.
var get_files = ['File1', 'File2'];
var copySheet = SpreadsheetApp.openById(spreadsheetId).getSheetByName('Sheet1');
copySheet.getRange('A2:Z').clear();
SpreadsheetApp.flush();
var values = [];
for (z = 0; z < get_files.length; z++) {
var files = DriveApp.searchFiles(`title='${get_files[z]}' and mimeType='${MimeType.GOOGLE_SHEETS}' and trashed=false`);
var file = files.hasNext() && files.next();
if (!file) {
console.log(`"${get_files[z]}" of Google Spreadsheet was not found.`);
continue;
}
var sheets = SpreadsheetApp.open(file).getSheets();
var v = Sheets.Spreadsheets.Values.batchGet(file.getId(), { ranges: sheets.map(s => s.getSheetName()) }).valueRanges.flatMap(({ values }) => values.slice(1));
values = [...values, ...v];
}
if (values.length == 0) return;
Sheets.Spreadsheets.Values.update({ values }, spreadsheetId, "Sheet1", { valueInputOption: "USER_ENTERED" });
}
['File1', 'File2']
的 2 个电子表格的所有工作表中的所有值。并且,检索到的值被放入目标电子表格的“Sheet1”。