Передача пользовательского столбца электронных таблиц в триггер 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()

Другие вопросы по тегам