Получение TypeError в триггере onFormSubmit?
Я использовал учебник Google Forms, чтобы настроить данные формы, чтобы объединить их в PDF, а затем отправить по электронной почте. Я получаю следующее сообщение об ошибке при попытке запустить скрипт:
TypeError: Невозможно прочитать свойство "values" из неопределенного. (строка 11, файл "Код")
Я не знаю, как решить проблему. Я искал в Интернете ответ. Вот копия сценария. Я отметил 2 строки, в которых скрипт выдает ошибку:
var docTemplate = "1ZSqmId2BBjtz6PmgQEmusjnkHGsFKD1CBSq0rrQk6Kc";
var docName = "TestCertificate";
// When Form Gets submitted
function onFormSubmit(e) {
//Get information from form and set our variables
var email_address = "EMAIL@example.com";
//**(THIS IS WHERE THE ERROR IS OCCURRING ON THESE 2 LINES BELOW!)**
var full_name = e.values[2];
var Activity = e.values[3];
// Get document template, copy it as a new temp doc, and save the Doc’s id
var copyId = DocsList.getFileById(docTemplate)
.makeCopy(docName+' for '+full_name)
.getId();
// Open the temporary document
var copyDoc = DocumentApp.openById(copyId);
// Get the document’s body section
var copyBody = copyDoc.getActiveSection();
// Replace place holder keys,in our google doc template
copyBody.replaceText('keyFullName', full_name);
copyBody.replaceText('keyActivity', Activity);
// Save and close the temporary document
copyDoc.saveAndClose();
// Convert document to PDF
var pdf = DocsList.getFileById(copyId).getAs("application/pdf");
// Attach PDF and send the email
var subject = "Report";
var body = "Here is the form for " + full_name + "";
MailApp.sendEmail(email_address, subject, body, {htmlBody: body, attachments: pdf});
// Delete temp file
DocsList.getFileById(copyId).setTrashed(true);
}
Вот ссылки на форму и сертификат, который я тестировал.
2 ответа
Вы видите ошибку, потому что вы запускаете функцию триггера в редакторе скриптов. Когда вы делаете это, параметр события e
не определено - это то, что говорит сообщение об ошибке.
Дополнительную информацию смотрите в разделе Как проверить функцию триггера в GAS?
Вот тестовая функция, которая будет запускать ваш onFormSubmit()
функционировать несколько раз, с данными, которые уже есть в вашей электронной таблице. Он читает каждую строку листа, генерирует объект для имитации события, которое вы получите при отправке формы, затем вызывает функцию триггера. Если вы разместите точки останова внутри onFormSubmit()
или полагаться на Logger.log()
Эта техника позволит вам проверить вашу функцию триггера.
function test_onFormSubmit() {
var dataRange = SpreadsheetApp.getActiveSheet().getDataRange()
var data = dataRange.getValues();
var headers = data[0];
// Start at row 1, skipping headers in row 0
for (var row=1; row < data.length; row++) {
var e = {};
e.values = data[row];
e.range = dataRange.offset(row,0,1,data[0].length);
e.namedValues = {};
// Loop through headers to create namedValues object
for (var col=0; col<headers.length; col++) {
e.namedValues[headers[col]] = e.values[col];
}
// Pass the simulated event to onFormSubmit
onFormSubmit(e);
}
}
Я не делал никакой другой отладки вашей исходной функции... но это избавляет от этого сообщения об ошибке, так что вы можете продолжить тестирование.
Я использую приведенный ниже код для проверки своих триггеров.
//
//
function onFormSumbit(e) {
//Timestamp 1 Status Remarks 3 Expected Completion Date 4 TRB Number
var resp = e.source.getActiveSheet().getRange(e.range.rowStart,1, e.range.rowStart,5 ).getValues();
/*
function test(){
var ss=SpreadsheetApp.getActive();
var respsht=ss.getSheetByName("Form responses 1");
var resp = respsht.getRange("A119:P119").getValues();
*/
Я закомментирую часть onformsubmit и проведу тестовую часть.
Как только функция заработает, я закомментирую тестовую функцию и активирую функцию onformsubmit.
Простое решение :)