- ВКонтакте
- РћРТвЂВВВВВВВВнокласснРСвЂВВВВВВВВРєРСвЂВВВВВВВВ
- РњРѕР№ Р В Р’В Р РЋРЎв„ўР В Р’В Р РЋРІР‚ВВВВВВВВРЎР‚
- Viber
- Skype
- Telegram
Как извлечь всю изменяемую область с несмежными участками в тригере 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:
P.S. В трекере ошибок Google зафиксирован баг о некорректной работе getActiveRangeList
в триггерной функции onEdit
(кстати, прошу за него проголосовать, чтобы сделать более заметным для разработчиков). Это не отменяет вопрос, как получить доступ ко всем измененным ячейкам в onEdit
, но подтверждает, что getActiveRangeList
здесь вероятно не поможет.