Когда я первый раз столкнулся с необходимостью что-либо изменять на листе в гугл таблице автоматически, возник вопрос — как это можно сделать?
Оба триггера — 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:
и нажимаю Enter. Значение в ячейке изменится и, как следствие, всплывет тост с содержанием ячейки:
Ниже рабочий пример получения данных из 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)
— срабатывает всякий раз, когда пользователь выделяет или выбирает другую ячейку или диапазон, ничего в них не меняя.
Ваше мнение важно и может улучшить блог
Я хочу услышать ваше мнение и ваши идеи о том, как сделать этот сайт еще лучше. Примите участие в опросе, чтобы поделиться вашими пожеланиями, предложениями и замечаниями. Пройдите опрос сейчас и помогите сделать этот сайт более полезным для вас!