Ситуация:
- Вы установили триггер
onEdit
для всех пользователей, имеющих доступ к редактированию электронной таблицы. - Функция, инициированная этим триггером, отправляет электронное письмо.
- Вы заметили, что электронные письма не всегда отправляются пользователем, который редактировал электронную таблицу.
Проблема:
Проблема в том, что, как вы можете видеть, здесь :
Устанавливаемые триггеры всегда запускаются под учетной записью человека, который их создал .
Это означает электронное письмо будет отправлено не пользователем, который редактировал электронную таблицу, а тем, кто установил триггер . Поскольку несколько пользователей установили этот триггер, ваш проект может содержать несколько дублирующих триггеров, каждый из которых будет запускаться от имени своей учетной записи. Из-за этого вы можете получить несколько электронных писем для одной электронной таблицы, каждая из которых будет отправлена с использованием другой учетной записи.
Решение:
Если вы хотите отправлять по одной электронной почте каждый раз электронная таблица редактируется, и отправив это электронное письмо от учетной записи, которая редактировала электронную таблицу, вы можете использовать методы getActiveUser()
и getEffectiveUser()
:
- Session.getActiveUser () относится к текущему пользователю, то есть к пользователю, который только что отредактировал электронную таблицу.
- Session.getEffectiveUser () относится к пользователю, от имени которого выполняется скрипт. То есть пользователь, который установил триггер.
Идея состоит в том, чтобы проверить, совпадают ли active user
и effective user
, и отправить электронное письмо, только если это так , Таким образом, даже если несколько функций запускаются одной редакцией (по одной для каждой учетной записи, которая установила триггер), будет отправлено только одно электронное письмо (то, которое соответствует пользователю, который редактировал электронную таблицу).
Код пример:
function onEditTrigger(e) {
var activeUser = Session.getActiveUser().getEmail();
var effectiveUser = Session.getEffectiveUser().getEmail();
if (activeUser === effectiveUser) {
// Rest of code
MailApp.sendEmail(mail_address, subject, msg);
}
}
Примечание:
- Если вы установили триггер, лучше не называть свою функцию
onEdit
: это имя зарезервировано для простого триггера.
Ссылка: