Google 表格:通过 Apps 脚本批量获取 getRangeByName
Google Sheets: Batch getRangeByName via Apps Script
是否可以一次调用按名称 获取多个范围?我有一个复杂的函数,需要按名称获取多个范围,并且 Spreadsheet.getRangeByName(name) 显着降低了我的脚本速度。有时这些调用需要约 2 秒,有时单个调用可能需要约 45 秒。
限制:
- 我需要获取范围(不仅仅是值),因为脚本格式、获取 A1Notation 供以后使用、offets 等
- 这些命名范围的地址因其他函数而改变
我尝试过的:
- 将 Range 对象存储在文档属性中。这似乎不起作用,因为范围只有功能。 JSON.stringify(范围)returns 没有。
- 使用 Google Sheets API v4 的 batchGet 函数,但它似乎只获取值
对于命名范围,特定获取的唯一方法是通过工作簿的 getRangeByName
method. There are also workbook-level and sheet-level 个可用集合:
var namedRangeArray = SpreadsheetApp.getActive().getNamedRanges();
var a1array = [];
namedRangeArray.forEach(function (namedRange) {
var range = namedRange.getRange();
a1array.push(range.getA1Notation()); // Doesn't include a sheet reference...
...
});
我最初将您的问题误读为指的是通过 A1 表示法获取多个范围。为此,RangeList
class 提供了非常小的速度改进,但它目前只接受 A1/R1C1-style 输入数组,例如[ "A1", "B2", "C3" ]
,并要求范围相同 sheet。
function compare_GetRange_And_GetRangeList() {
var rangeStrings = [
"A1:A100", "B2:B101", "C3:C102"
];
var sheet = SpreadsheetApp.getActive().getActiveSheet()
// Acquire multiple.
console.time("Get rangelist");
var ranges = sheet.getRangeList(rangeStrings);
console.timeEnd("Get rangelist");
// Acquire single.
var separate = [];
console.time("Get individual");
["D4:D103", "E5:E104", "F6:F105"].forEach(function (a1) {
separate.push(sheet.getRange(a1));
});
console.timeEnd("Get individual");
// Do something with the acquired ranges.
[].concat(ranges.getRanges(), separate).forEach(function (rl) {
console.log(rl.getA1Notation());
});
}
如果您 运行 然后检查 Stackdriver,您可以看到执行时间,例如:
我为每个调用使用不同的范围以避免 Apps 脚本服务器在方法比较之间缓存引用。
是否可以一次调用按名称 获取多个范围?我有一个复杂的函数,需要按名称获取多个范围,并且 Spreadsheet.getRangeByName(name) 显着降低了我的脚本速度。有时这些调用需要约 2 秒,有时单个调用可能需要约 45 秒。
限制:
- 我需要获取范围(不仅仅是值),因为脚本格式、获取 A1Notation 供以后使用、offets 等
- 这些命名范围的地址因其他函数而改变
我尝试过的:
- 将 Range 对象存储在文档属性中。这似乎不起作用,因为范围只有功能。 JSON.stringify(范围)returns 没有。
- 使用 Google Sheets API v4 的 batchGet 函数,但它似乎只获取值
对于命名范围,特定获取的唯一方法是通过工作簿的 getRangeByName
method. There are also workbook-level and sheet-level 个可用集合:
var namedRangeArray = SpreadsheetApp.getActive().getNamedRanges();
var a1array = [];
namedRangeArray.forEach(function (namedRange) {
var range = namedRange.getRange();
a1array.push(range.getA1Notation()); // Doesn't include a sheet reference...
...
});
我最初将您的问题误读为指的是通过 A1 表示法获取多个范围。为此,RangeList
class 提供了非常小的速度改进,但它目前只接受 A1/R1C1-style 输入数组,例如[ "A1", "B2", "C3" ]
,并要求范围相同 sheet。
function compare_GetRange_And_GetRangeList() {
var rangeStrings = [
"A1:A100", "B2:B101", "C3:C102"
];
var sheet = SpreadsheetApp.getActive().getActiveSheet()
// Acquire multiple.
console.time("Get rangelist");
var ranges = sheet.getRangeList(rangeStrings);
console.timeEnd("Get rangelist");
// Acquire single.
var separate = [];
console.time("Get individual");
["D4:D103", "E5:E104", "F6:F105"].forEach(function (a1) {
separate.push(sheet.getRange(a1));
});
console.timeEnd("Get individual");
// Do something with the acquired ranges.
[].concat(ranges.getRanges(), separate).forEach(function (rl) {
console.log(rl.getA1Notation());
});
}
如果您 运行 然后检查 Stackdriver,您可以看到执行时间,例如:
我为每个调用使用不同的范围以避免 Apps 脚本服务器在方法比较之间缓存引用。