Триггер onSubmit выполнен без отправки формы - PullRequest
0 голосов
/ 01 мая 2019

Я создал форму Google, связал ее с листом для сбора ответов и добавил скрипт приложений, который запускается при каждой отправке формы.Пробежал кучу тестов и все работало нормально - ответы проходили через форму, функция onSubmit работала отлично.Однако вчера вечером мы получили несколько исполнений сценария, даже если форма не была отправлена.

Если посмотреть на страницу «Ответы» в самой форме, я не получил никаких сообщений, когда я получил уведомление.Кроме того, это не общедоступная форма в моей организации, и кроме меня есть ссылка только на одного человека.Он подтвердил, что не отправлял форму во время казней.

В Листе Google есть два листа: 1> Ответы на форму и 2> Данные.Лист данных использует несколько функций QUERY для извлечения данных из листа ответов, форматирования их по-разному (например, ввод дефисов в телефонных номерах, рендеринг некоторых полей в верхнем регистре и т. Д.).Кроме того, заголовки таблицы данных помечаются не так, как вопросы формы (например, «homeAdd1» вместо «Home Address Line 1»).Это связано с тем, что сценарий создает PDF-файл, используя ответы формы для замены заполнителей («% homeAdd1%») в шаблоне Google Doc.Затем скрипт берет сгенерированный PDF-файл и отправляет его по электронной почте отправителю.

Опять же, все работало до вчерашнего тестирования.Я не осознавал этого в то время, но когда мой коллега вводил случайные значения для проверки формы, для строки домашнего адреса 2 он вводил только 5-значный почтовый индекс.Он сгенерировал штраф в формате PDF, а также отправил его ему по электронной почте, но это привело к тому, что функция QUERY выдала ошибку #VALUE.Функции выглядят следующим образом:

=QUERY(Responses!L2:S,"SELECT UPPER(L) UPPER(M)...

Поэтому, когда Sheets видит ячейку с 5 цифрами, она автоматически отображается в виде числа, а UPPER не работает с числовыми значениями.Я (глупо) не думал предварительно форматировать все оба листа как простой текст, поэтому это произошло.

Может ли ошибка #VALUE в листе Google, связанном с формой и скриптом приложения, вызвать пропуски зажиганияфункции onSubmit?Это единственное, что я вижу, это могло быть причиной, но это не имеет смысла.Я исправил проблему с форматированием, но я не знаю, может ли ошибочное выполнение означать какую-то другую проблему.

С дополнительными отправками скрипт просто снова и снова отправлял самый последний PDF.В течение 20 секунд он запускался 5 раз, каждый раз отправляя последний файл PDF, сгенерированный по электронной почте.Глядя на логи Stackdriver, мы ничем не отличаемся от того, что мы тестировали вчера.Команды console.log и console.info работают нормально, и все они перечислены в списке как запущенные функцией onSubmit.

Вот сценарий:

Функция отправки:

function onSubmit(e) {
  var ss = SpreadsheetApp.getActiveSpreadsheet().getSheetByName('Data');
  var list = ss.getRange("A1:A").getValues();
  var row = list.filter(String).length;
  var email = ss.getRange(row,2).getValue();
  var newResponse = ss.getRange(row,3).getValue();
  if (newResponse == 'Generate New') {
    newOne(ss,row,email);
  } else if (newResponse == 'Upload Completed') {
    completed(ss,row,email);
  } else {
  }
}

Функция, которая была выполнена:

function newOne(ss,row,email) {
  var name = ss.getRange(row,4).getValue();
  console.log('Function Start - ' + name);
  var newType = ss.getRange(row,6).getValue();
  var copyFile = DriveApp.getFileById('[file id]').makeCopy();
  var copyDoc = DocumentApp.openById(copyFile.getId());
  var copyBody = copyDoc.getActiveSection();
  // Replacing variables with values on spreadsheet
  console.log('Create file start - ' + name);
  var newInfo = ss.getRange(row, 1, 1, 29).getDisplayValues();
  var header = ss.getRange(1, 1, 1, 29).getDisplayValues();
  for (var i = 1; i <= 5; i++) {
    copyBody.replaceText('%' + header[0][i] + '%', newInfo[0][i].toString());
  }
  var x;
  if (newType == 'Office 1') {
    x = 6;
  } else if (newType == 'Office 2') {
    x = 15;
  } else {
  }
  for (var i = x; i <= (x + 8); i++) {
    copyBody.replaceText('%' + header[0][i] + '%', newInfo[0][i].toString());
  }
  copyBody.replaceText('%' + header[0][26] + '%', newInfo[0][26].toString());
  // Create the PDF file, rename it, and delete the doc copy
  copyDoc.saveAndClose();
  var newFile = DriveApp.createFile(copyFile.getAs('application/pdf'));
  newFile.setName('New - ' + name + '.pdf');
  copyFile.setTrashed(true);
  console.log('Create file finished - ' + name);
  //Mails PDF to submitter
  console.info('Pre-email log for ' + name);
  MailApp.sendEmail(email,'Email Subject','', {
                    noReply: true,
                    htmlBody: "<body>Hello, and thank you.</body>",
                    attachments: [newFile]
                    });
  console.info('Email sent for ' + name);
  appFile.setTrashed(true);
}

Любое понимание / помощь будут оценены;спасибо!

Джош

Ответы [ 3 ]

2 голосов
/ 01 мая 2019

Ложные нежелательные триггеры событий

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

Может быть, стоит потратить время на захват массива e.values ​​и посмотреть, сможете ли вы найти последовательный способ не допустить, чтобы они вызывали перебои в работе вашей функции обработки. Надеюсь, это поможет.

0 голосов
/ 23 мая 2019

У меня есть установка электронной таблицы и соответствующей формы, где я получаю частые повторения событий отправки формы, необъяснимым образом.Это не происходит в других установках.Если это ваша ситуация, вы не можете просто проверить, является ли событие пустым, потому что для проверки его на нулевое значение вам нужно что-то проверить.Если он не определен, вы получите ошибку.Итак, сначала проверьте, не определено ли оно.Попробуйте этот код:

`function formSubmitted(e) {
  // Deal with the unusual case that this is a bogus event
  if ((typeof e === "undefined") || (e == null) || (e.length == 0))  { 
    Logger.log("formSubmitted() received a bogus or empty event");
    return;
  }
  ...`
0 голосов
/ 01 мая 2019

Насколько я знаю, onSubmit (e) работает не так, как вы ожидаете.

Я думаю, что вы ищете триггер onFormSubmit, попробуйте использовать следующее из Класс SpreadsheetTriggerBuilder документации , чтобы создать триггер сценария, который выполняется каждый раз, когда кто-то отправляет ответ на вашу связанную форму:

var sheet = SpreadsheetApp.getActive();
ScriptApp.newTrigger("function name")
  .forSpreadsheet(sheet)
  .onFormSubmit()
  .create();
...