MailApp.sendEmail -> почта, приходящая из разных аккаунтов - PullRequest
1 голос
/ 04 мая 2020

Я использую скрипт в общей электронной таблице для отправки обновлений по электронной почте рабочей команде. Я использую простой вызов:

MailApp.sendEmail(mail_address, subject, msg);

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

Редактировать : Сценарий выполняется с помощью триггера на основе редактирования электронной таблицы.

1 Ответ

0 голосов
/ 07 мая 2020

Ситуация:

  • Вы установили триггер 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: это имя зарезервировано для простого триггера.

Ссылка:

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...