Передача пользовательского столбца электронных таблиц в триггер onFormSubmit
У меня есть форма Google с полем из двух чисел, поэтому в электронных таблицах мест назначения ответов у меня есть три столбца: SUBMIT-DATE, NUM1, NUM2
Я добавляю четвертый столбец TOT, а не поле в форме, с этой формулой:
ARRAYFORMULA(B2:B+C2:C)
Таким образом, в четвертом столбце у меня есть сумма для каждой строки
Я привязал этот скрипт к электронной таблице:
function onFormSubmit(e){
var subject = "TRY GAS";
var body = e.namedValues['NUM1']+ "+" +e.namedValues['NUM2']+ "=" +e.namedValues[TOT];
MailApp.sendEmail("admin@example.com", subject, body);
}
И я установил триггер для onFormSubmit
Но письмо, которое я получил:
34+43=
Находясь в электронной таблице в столбце ВСЕГО, отображается 77.
Я думаю, что проблема заключается в var e.namedValues, который не содержит TOT, потому что это не поле формы
Как я могу передать это значение в форме отправки??
3 ответа
Ваше предположение верно; поскольку интересующий вас столбец находится за пределами диапазона столбцов, заполненных ответами формы, он не будет присутствовать в объекте события. Тем не менее range
свойство объекта события скажет вам строку, которая получила отправку, и вы можете выбрать дополнительные ячейки относительно этого.
Какой столбец содержит "TOT"? Если этот столбец находится справа от нашего последнего столбца ответа формы, то мы можем использовать количество элементов ответа (e.values.length
) для смещения в этот столбец.
function onFormSubmit(e){
var subject = "TRY GAS";
var total = e.range.offset(0, e.values.length, 1, 1).getValue();
var body = e.namedValues['NUM1']+ "+" +e.namedValues['NUM2']+ "=" +total;
MailApp.sendEmail("admin@example.com", subject, body);
}
Предостережение: во время выполнения этой триггерной функции общая сумма еще не была рассчитана и еще не сохранена в электронной таблице. Вы можете обнаружить, что вам нужно отложить getValue()
позвоните на несколько секунд. Даже при этом, это может быть ненадежно - в этом случае вы обнаружите, что подход вычисления в функции, предложенный @Sergeinsas, будет более эффективным.
Когда вы используете e.namedValues['NUM1']
, вы получаете свойство namedValues e
объект, который на самом деле является ответом от формы.
Я весьма удивлен результатом, который вы получаете, поскольку ни свойство в этом объекте не называется "TOT"...
обычно он должен возвращать "undefined", очевидно.
Тем не менее, это не ваш вопрос, вам нужна просто числовая сумма обоих значений, вы можете получить их так:
var sum = Number(e.namedValues['NUM1'])+Number(e.namedValues['NUM2']);// Number is mandatory because object properties are strings in this context.
и ваше тело электронной почты станет
var body = e.namedValues['NUM1']+ "+" +e.namedValues['NUM2']+ "=" +sum;
Я только что нашел то же решение @Mogsdad, поэтому я пишу это:
function onFormSubmit(e){
//THE SHEETS WHERE RESPONSE IS STORED
var sheet = e.range.getSheet();
//SHEET HEADERS
var headers = sheet.getRange("1:1").getValues()[0];
//THE DIFFERENCE BETWEEN SHEET WIDTH AND FORM COLUMNS
var off = headers.length;
//WAIT DATA
Utilities.sleep(30000);
//OFFSET FORM RANGE ON RIGHT BY off TO ADD ALL CUSTOM COLUMN
var data = e.range.offset(0, 0, 1, off).getValues()[0];
//CREATE OBJECT WITH NAMED VALUES
var namedValues = {};
for(var col in headers)
namedValues[headers[col]] = data[col];
//LOG
var subject = "TRY GAS";
var body = namedValues["NUM1"] + ' + ' + namedValues["NUM2"] + ' = ' + namedValues["TOT"];
MailApp.sendEmail("admin@example.com", subject, body);
}
Спасибо всем, мне нужно это для создания PDF из шаблона с помощью replaceText()