Получение 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.

Простое решение :)

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