Как извлечь всю изменяемую область с несмежными участками в тригере onEdit?

Я работаю в Google Spreadsheet с триггерной функцией onEdit. Предположим, я выделяю несколько несмежных диапазонов (т.е. последовательно указываю курсором ячейки в разных местах страницы при нажатой клавише Ctrl, как это выглядит см. ниже) и нажимаю либо Del, либо комбинацию Ctrl+Enter, тем самым изменив всю выделенную область. Будет активирована функция onEdit, но внутри контекста она, вероятно, получит лишь один (первый из выделенных пользователем) измененный объект Range вместо ожидаемого RangeList (я имею ввиду свойство range объекта, который передается в onEdit как параметр). Можно ли при срабатывании onEdit получить доступ ко всем измененным ячейкам, когда одновременно изменяются как минимум 2 несмежные области?

Мотивация: Нужно предпринять заданные действия, если изменились ячейки в определенной области. Ячеек много, хранить копию для сравнения при каждом срабатывании - так себе вариант. А срабатывание onEdit можно обойти, последовательно выделив три участка: ячейку в неконтролируемой области, затем ту, которую нужно изменить, затем произвольную неконтролируемую пару с новым значением в верхнем левом углу, после чего нажимаем Ctrl+Enter. Следующим шагом зачищаем крайние ячейки, выделив их в той же последовательности и удалив содержимое. Я увижу в onEdit, что в какой-то пустой ячейке появилось и исчезло число, словно она использовалась как черновик. Хотелось бы видеть всю картину в момент изменения.

Я пробовал решить вопрос используя метод getActiveRangeList. В примере ниже получилось с его помощью окрасить разрозненные области в индивидуальные цвета через выполняемую вручную процедуру:

function colorizeActiveRanges() {
  var sheet = SpreadsheetApp.getActiveSpreadsheet().getActiveSheet();
  var rangeList = sheet.getActiveRangeList();
  if (rangeList) {
    var colors = ['red', 'green', 'blue', 'yellow', 'black']
    var i = 0
    rangeList.getRanges().forEach(range => range.setBackground(colors[i++]))
  }
}

Вот как выглядит страница до и после выполнения colorizeActiveRanges, цифрами обозначена последовательность выделения областей:

успешно измененные разрозненные области

Если поместить этот же код в onEdit, то окрашивается либо один связный участок (первый из выделяемых пользователем), либо его часть, либо ничего (зависит от наполнения ячеек и выполняемых операций):

function onEdit(e) {
  var sheet = e.range.getSheet();
  var rangeList = sheet.getActiveRangeList();
  if (rangeList) {
    var colors = ['red', 'green', 'blue', 'yellow', 'black']
    var i = 0
    rangeList.getRanges().forEach(range => range.setBackground(colors[i++]))
  }
}

Результат при нажатии Del с указанной выше функцией onEdit:

скрин результата при удалении

Результат при нажатии Ctrl+Enter:

скрин результата при ctrl+enter


P.S. В трекере ошибок Google зафиксирован баг о некорректной работе getActiveRangeList в триггерной функции onEdit (кстати, прошу за него проголосовать, чтобы сделать более заметным для разработчиков). Это не отменяет вопрос, как получить доступ ко всем измененным ячейкам в onEdit, но подтверждает, что getActiveRangeList здесь вероятно не поможет.


Ответы (0 шт):