有没有一种方法可以同时使用应用程序脚本更新多个不连续的 google sheet 范围? (使用 SpreadsheetApp 而不是 sheets api)
is there a way I can update multiple non-contiguous google sheet ranges using apps script all at the same time? (using SpreadsheetApp not sheets api)
假设我们有一个从 A1 开始的 4 x 4 的 table,现在通常如果我想立即更新它的值,我会做
sheet.getRange("A1:D4").setValues(values);
现在,如果数据不连续,那么我有 3 4 x 4 个单独的 tables,它们之间有其他数据,但我将它们命名为命名范围,即 (table1, table2, table3), 我可以这样做吗:
sheet.getNamedRanges([table1range, table2range, table3range]).setValues([table1data, table2data, table3data]);
而不是:
sheet.getRange(table1range).setValues(table1data);
sheet.getRange(table2range).setValues(table2data);
sheet.getRange(table3range).setValues(table3data);
所以现在所有 3 个 table 都将在同一个操作中更新,而不是 3 个不同的操作以节省执行时间?
提前谢谢你。
我相信你的目标如下。
- 你想实现
sheet.getNamedRanges([table1range, table2range, table3range]).setValues([table1data, table2data, table3data]);
这样的脚本,以降低流程成本。
- 也就是说,您想使用 Google Apps 脚本将每个范围的值放入 Google 电子表格。并且,范围是
在这种情况下,我认为 Sheets API 可用于实现您的目标,如下所示。在这种情况下,该线程可能会有用。 When Sheets API is used for your situation, the process cost can be reduced rather than that of the method for putting the values to each range in the loop using Spreadsheet Service (SpreadsheetApp). Ref
const spreadsheetId = "###"; // Please set the Spreadsheet ID.
const ranges = [table1range, table2range, table3range]; // Please set table1range, table2range, table3range as A1Notation.
const values = [table1data, table2data, table3data]; // Please set table1data, table2data, table3data.
const data = ranges.map((e, i) => ({range: e, values: [[values[i]]]}));
Sheets.Spreadsheets.Values.batchUpdate({data, valueInputOption: "USER_ENTERED"}, spreadsheetId);
但是,在这种情况下,我认为创建请求正文可能有点困难。因此,我创建了一个 Google Apps 脚本库作为使用 Sheets API 的包装器。使用该库时,示例脚本如下
1。安装库。
库的安装方法见here. And, this script uses Sheets API. So please enable Sheets API at Advanced Google services。
2。示例脚本:
const ranges = [table1range, table2range, table3range]; // Please set table1range, table2range, table3range as A1Notation.
const values = [table1data, table2data, table3data]; // Please set table1data, table2data, table3data.
const spreadsheet = SpreadsheetApp.getActiveSpreadsheet();
RangeListApp.getSpreadsheet(spreadsheet).getRangeList(ranges).setValues(values);
- 当我看到你的脚本时,我认为这个示例脚本可能与你期望的方向相同。
- 当此脚本为 运行 时,
values
的每个值都使用 Sheets API. 放入 ranges
的每个范围
参考文献:
根据田内池的提议,我建议稍微修改一下
const ss = SpreadsheetApp.getActiveSpreadsheet()
const sheet = ss.getActiveSheet()
const ranges = [table1range2D, table2range2D, table3range2D];
const values = [data1values2D, data2values2D, data3values2D];
const data = ranges.map((e, i) => ({ range: `'${sheet.getName()}'!${e}`, values : values[i] }));
Sheets.Spreadsheets.Values.batchUpdate({ data, valueInputOption: "USER_ENTERED" }, ss.getId());
例如
function updateGoogleSheet() {
const ss = SpreadsheetApp.getActiveSpreadsheet()
const sheet = ss.getActiveSheet()
const otherSheet = ss.getSheetByName('other')
const table1range2D = 'A1:B2', table2range2D = 'C4:D5', table3range2D = 'E7:F8'
const data1values2D = otherSheet.getRange('A1:B2').getValues(), data2values2D = otherSheet.getRange('C4:D5').getValues(), data3values2D = otherSheet.getRange('E7:F8').getValues()
const ranges = [table1range2D, table2range2D, table3range2D];
const values = [data1values2D, data2values2D, data3values2D];
const data = ranges.map((e, i) => ({ range: `'${sheet.getName()}'!${e}`, values : values[i] }));
Sheets.Spreadsheets.Values.batchUpdate({ data, valueInputOption: "USER_ENTERED" }, ss.getId());
}
在 sheet 中名为 'other' 的地方我们可以在 A1 中找到 =sequence(10,10,0,1)
假设我们有一个从 A1 开始的 4 x 4 的 table,现在通常如果我想立即更新它的值,我会做
sheet.getRange("A1:D4").setValues(values);
现在,如果数据不连续,那么我有 3 4 x 4 个单独的 tables,它们之间有其他数据,但我将它们命名为命名范围,即 (table1, table2, table3), 我可以这样做吗:
sheet.getNamedRanges([table1range, table2range, table3range]).setValues([table1data, table2data, table3data]);
而不是:
sheet.getRange(table1range).setValues(table1data);
sheet.getRange(table2range).setValues(table2data);
sheet.getRange(table3range).setValues(table3data);
所以现在所有 3 个 table 都将在同一个操作中更新,而不是 3 个不同的操作以节省执行时间? 提前谢谢你。
我相信你的目标如下。
- 你想实现
sheet.getNamedRanges([table1range, table2range, table3range]).setValues([table1data, table2data, table3data]);
这样的脚本,以降低流程成本。 - 也就是说,您想使用 Google Apps 脚本将每个范围的值放入 Google 电子表格。并且,范围是
在这种情况下,我认为 Sheets API 可用于实现您的目标,如下所示。在这种情况下,该线程可能会有用。
const spreadsheetId = "###"; // Please set the Spreadsheet ID.
const ranges = [table1range, table2range, table3range]; // Please set table1range, table2range, table3range as A1Notation.
const values = [table1data, table2data, table3data]; // Please set table1data, table2data, table3data.
const data = ranges.map((e, i) => ({range: e, values: [[values[i]]]}));
Sheets.Spreadsheets.Values.batchUpdate({data, valueInputOption: "USER_ENTERED"}, spreadsheetId);
但是,在这种情况下,我认为创建请求正文可能有点困难。因此,我创建了一个 Google Apps 脚本库作为使用 Sheets API 的包装器。使用该库时,示例脚本如下
1。安装库。
库的安装方法见here. And, this script uses Sheets API. So please enable Sheets API at Advanced Google services。
2。示例脚本:
const ranges = [table1range, table2range, table3range]; // Please set table1range, table2range, table3range as A1Notation.
const values = [table1data, table2data, table3data]; // Please set table1data, table2data, table3data.
const spreadsheet = SpreadsheetApp.getActiveSpreadsheet();
RangeListApp.getSpreadsheet(spreadsheet).getRangeList(ranges).setValues(values);
- 当我看到你的脚本时,我认为这个示例脚本可能与你期望的方向相同。
- 当此脚本为 运行 时,
values
的每个值都使用 Sheets API. 放入
ranges
的每个范围
参考文献:
根据田内池的提议,我建议稍微修改一下
const ss = SpreadsheetApp.getActiveSpreadsheet()
const sheet = ss.getActiveSheet()
const ranges = [table1range2D, table2range2D, table3range2D];
const values = [data1values2D, data2values2D, data3values2D];
const data = ranges.map((e, i) => ({ range: `'${sheet.getName()}'!${e}`, values : values[i] }));
Sheets.Spreadsheets.Values.batchUpdate({ data, valueInputOption: "USER_ENTERED" }, ss.getId());
例如
function updateGoogleSheet() {
const ss = SpreadsheetApp.getActiveSpreadsheet()
const sheet = ss.getActiveSheet()
const otherSheet = ss.getSheetByName('other')
const table1range2D = 'A1:B2', table2range2D = 'C4:D5', table3range2D = 'E7:F8'
const data1values2D = otherSheet.getRange('A1:B2').getValues(), data2values2D = otherSheet.getRange('C4:D5').getValues(), data3values2D = otherSheet.getRange('E7:F8').getValues()
const ranges = [table1range2D, table2range2D, table3range2D];
const values = [data1values2D, data2values2D, data3values2D];
const data = ranges.map((e, i) => ({ range: `'${sheet.getName()}'!${e}`, values : values[i] }));
Sheets.Spreadsheets.Values.batchUpdate({ data, valueInputOption: "USER_ENTERED" }, ss.getId());
}
在 sheet 中名为 'other' 的地方我们可以在 A1 中找到 =sequence(10,10,0,1)