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 脚本服务器在方法比较之间缓存引用。