onSelectionChange(e) и onEdit(e) — в чем разница?

Когда я первый раз столкнулся с необходимостью что-либо изменять на листе в гугл таблице автоматически, возник вопрос — как это можно сделать?

Оба триггера — onSelectionChange(e) и onEdit(e) — работают с ячейками на листе. Оба связаны с изменением ячеек. Так какой же выбрать?

OnEdit(e)

Начну с более часто используемого — onEdit(e). По нему даже более понятное описание на google developer.

Триггер onEdit(e) запускается автоматически, когда пользователь изменяет значение любой ячейки в таблице.

При этом в самом (e) скрыто очень много

function onEdit(e){
  console.log(e)
}

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

function onEdit(e){
  console.log(e)
  SpreadsheetApp.getActive().toast(e.range.getValue())
}

Пишу в ячейке А1:

onEdit

и нажимаю Enter. Значение в ячейке изменится и, как следствие, всплывет тост с содержанием ячейки:

onEdit результат

Ниже рабочий пример получения данных из onEdit, которые можно передавать куда-либо далее:

function onEdit(e){
  const cellValue = e.range.getValue()
  const cellIndex = e.range.getA1Notation()
  const sourceSheet = e.source.getActiveSheet().getSheetName()
  const currentUser = e.user.nickname
  SpreadsheetApp.getActive().toast(`Ячейка ${cellIndex} была изменена на ${cellValue} на листе ${sourceSheet} пользователем ${currentUser}`)
}

onSelectionChange(e)

Дополняет функционал изменений на листе, в случае если пользователь ничего не меняет в ячейке.

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

Понимая вышеописанный функционал, добавляю триггер onSelectionChange(e):

function onSelectionChange(e) {
  SpreadsheetApp.getActive().toast(e.range.getValues())
  SpreadsheetApp.getActive().getRange("D1").setValue((e.range.getValues()).join(''))
}

У меня есть некий набор данных на листе:

ячейки с данными

так как getValues() возвращает массив, выделяю любой диапазон., который потом будет (в качестве примера) возвращен в ячейку D1.

Чтобы вернуть массив в ячейку — делаю .join(''), иначе будет возвращен первый элемент массива.

То есть я не делал никаких изменений в ячейке (или ячейках), а только их выделял, но ниже всплывает всё тот же тост:

Вывод

onEdit(e) — срабатывает всякий раз, когда пользователь меняет что-либо в ячейке.

onSelectionChange(e) — срабатывает всякий раз, когда пользователь выделяет или выбирает другую ячейку или диапазон, ничего в них не меняя.


Ваше мнение важно и может улучшить блог

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

Добавить комментарий