Я создал форму 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);
}
Любое понимание / помощь будут оценены;спасибо!
Джош