Как отправить электронное письмо-подтверждение при ответе на определенный элемент формы Google?
У меня проблемы с Google Forms/Sheets - и, чтобы вы знали с самого начала, я не большой программист, и я ОЧЕНЬ новичок в работе с Apps Script.
Я пытаюсь сделать следующее:
1) Попросите пользователя ответить на один вопрос в форме. 2) Если на этот вопрос дан ответ, и значение записано в столбец ячейки на соответствующем листе, автоматически отправьте электронное письмо на 2 заранее заданных адреса электронной почты утверждающего. 3) Если на этот вопрос нет ответа, и в столбец ячейки не записывается никакое значение, а затем электронное письмо не отправляется двум утверждающим
Я могу сделать это, если я вручную добавлю значение в соответствующий столбец на листе с помощью сценария, который я включил ниже, но он не будет работать для меня, если значение, записанное на листе, получено непосредственно из формы (которая является что мне нужно сделать!).
Ниже приведен код, который я написал в редакторе сценариев на листе формы, который позволяет мне вручную обновлять столбец и отправлять уведомления утверждающим (опять же, моя проблема только в том, что электронные письма не отправляются, если столбец обновляется динамически из формы). Как написано сейчас, если я вручную обновлю столбец 5 и / или столбец 7, электронное письмо будет отправлено указанному набору утверждающих.
Но опять же, он не будет отправлять уведомления, если форма динамически обновляет столбец 5 или столбец 7.
Пожалуйста, помогите, я застрял на этом в течение нескольких дней - Спасибо!!!
Вот мой нынешний сценарий:
/*
* This function sends an email when a specific Google Sheets column is edited
* The spreadsheets triggers must be set to onEdit for this function to work
*/
function sendNotification() {
//var ss = SpreadsheetApp.openById('1N6dqSXs8hdhCi1vrOGT7I7tD2yDMtgK7BSddMPqmuo0');
var ss = SpreadsheetApp.getActiveSpreadsheet();
var sheet = ss.getActiveSheet();
//Get Active cell
var mycell = ss.getActiveSelection();
var cellcol = mycell.getColumn();
var cellrow = mycell.getRow();
//Define Notification Details for vars
var recipients = "joseph@XXXXX.com,jmang@XXXXX.com";
var recipients1 = "joseph2@XXXXX.com"
var subject = "NEW SENSITIVE DATA REQUEST REQUIRES APPROVAL";
var subject1 = "ALERT: SENSITIVE DATA REQUEST";
var body = ss.getName() + " has been updated. Visit " + ss.getUrl() + " to view the changes.";
//Check to see which column will trigger the email - this script sends an email to "var recipients" if
//column 5 is updated and sends and email to "var recipients1" when colum 7 is updated.
if (cellcol == 5) {
//Send the Email to recipients defined in "var recipients"
MailApp.sendEmail(recipients, subject, body);
}
if (cellcol == 7) {
//Send the Email to recipients defined in "var recipients1"
MailApp.sendEmail(recipients1, subject1, body);
}
//End sendNotification
}
Вот как устанавливаются мои триггеры на листе: sendNotification из электронной таблицы 1) при изменении, 2) при редактировании и 3) при FormSubmit
И последнее: моя компания не допускает надстройки, поэтому я должен сделать это с помощью скрипта приложений...
2 ответа
Установить отдельные триггеры для отдельных событий;
для события редактирования листа:
function sendNotificationAtEdit(event) {
var ss = SpreadsheetApp.getActiveSpreadsheet();
var sheet = ss.getActiveSheet();
//get edited range
var range = event.range;
var cellcol = range.getColumn();
var cellrow = range.getRow();
//Define Notification Details for vars
var recipients = "joseph@XXXXX.com,jmang@XXXXX.com";
var recipients1 = "joseph2@XXXXX.com"
var subject = "NEW SENSITIVE DATA REQUEST REQUIRES APPROVAL";
var subject1 = "ALERT: SENSITIVE DATA REQUEST";
var body = ss.getName() + " has been updated. Visit " + ss.getUrl() + " to view the changes.";
if (cellcol == 5) {
//Send the Email to recipients defined in "var recipients"
MailApp.sendEmail(recipients, subject, body);
}
if (cellcol == 7) {
//Send the Email to recipients defined in "var recipients1"
MailApp.sendEmail(recipients1, subject1, body);
}
//End sendNotification
}
для формы отправки события:
function sendNotificationAtFormSubmit(event) {
var ss = SpreadsheetApp.getActiveSpreadsheet();
var sheet = ss.getActiveSheet();
//Define Notification Details for vars
var recipients = "joseph@XXXXX.com,jmang@XXXXX.com";
var recipients1 = "joseph2@XXXXX.com"
var subject = "NEW SENSITIVE DATA REQUEST REQUIRES APPROVAL";
var subject1 = "ALERT: SENSITIVE DATA REQUEST";
var body = ss.getName() + " has been updated. Visit " + ss.getUrl() + " to view the changes.";
//if form submitted 5th question's answer is not empty
if (event.values[4] !== '') {
//Send the Email to recipients defined in "var recipients"
MailApp.sendEmail(recipients, subject, body);
}
if (event.values[6] !== '') {
//Send the Email to recipients defined in "var recipients1"
MailApp.sendEmail(recipients1, subject1, body);
}
//End sendNotification
}
Самый безопасный способ сделать то, что вы хотите, это проверить ответ формы, а не ячейку в электронной таблице. По крайней мере, не для триггера отправки формы. Вам может понадобиться ОБА, и onEdit()
триггер, и триггер On формы отправки.
Таким образом, в триггере On Form Submit необходимо получить текущий ответ формы, получить необходимый элемент, а затем получить индивидуальный ответ от элемента, который соответствует столбцу 5 в электронной таблице.
Вы можете проверить последнюю строку в листе ответов и получить столбец 5, и это будет прекрасно работать, если у вас никогда не будет много людей, одновременно отправляющих запросы формы. В этой ситуации вам нужно заблокировать документ, что вы можете сделать в любом случае.
Чтобы получить последний ответ с помощью триггера при отправке, вам нужно добавить объект "событие" в функцию.
function sendNotification(e) {
Тогда вам нужно получить текущий ответ:
function sendNotification(e) {
/* Logger.log('e: ' + e);
for (var key in e) {
Logger.log('key: ' + key)
Logger.log('value: ' + e[key]);
}; */
var allAnswers = e.response.getItemResponses();
var howManyQuestionsInForm = allAnswers.length;
Logger.log('howManyQuestionsInForm: test again: ' + howManyQuestionsInForm);
/* for (var key in allAnswers) {
Logger.log('key: ' + key)
Logger.log('value: ' + allAnswers[key]);
}; */
var questionThree = allAnswers[2];
var theAnswerIs = questionThree.getResponse();
Logger.log('theAnswerIs: ' + theAnswerIs);
if (theAnswerIs !== "") {
//Send email
Logger.log('it got to here')
};
};