Google Sheets: пакетный getRangeByName с помощью скрипта приложений - PullRequest
0 голосов
/ 24 апреля 2018

Можно ли получить несколько диапазонов по имени одним вызовом? У меня есть сложная функция, которая должна захватывать много диапазонов по имени, и Spreadsheet.getRangeByName (name) значительно замедляет мой скрипт. Иногда эти вызовы занимают ~ 2 секунды, а иногда один звонок может занимать ~ 45 секунд.

Ограничения:

  • Мне нужно захватить диапазон (а не только значения), потому что форматы сценариев, захват A1Notation для последующего использования, ошибки и т. Д.
  • Адреса этих именованных диапазонов изменяются в результате других функций

Что я пробовал:

  • Сохранить объект Range в Свойствах документа. Кажется, это не работает, потому что диапазоны имеют только функции. JSON.stringify (Range) ничего не возвращает.
  • Используйте функцию batchGet API Google Sheets v4, но, похоже, она получает только значения

1 Ответ

0 голосов
/ 24 апреля 2018

Для именованных диапазонов единственным методом конкретного сбора данных является метод getRangeByName рабочей книги. Также доступны уровень рабочей тетради и уровень листа доступные коллекции:

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 предлагает очень незначительное улучшение скорости, но в настоящее время он принимает только входной массив в стиле A1 / R1C1, например, [ "A1", "B2", "C3" ] и требует, чтобы диапазоны были на одном листе.

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, вы увидите время выполнения, например: enter image description here

Я использовал разные диапазоны для каждого вызова, чтобы сервер скриптов приложений не кэшировал ссылку между сравнениями методов.

...