在onFormSubmit触发器中获取TypeError?

时间:2013-08-01 02:25:21

标签: google-apps-script google-sheets

我使用Google表单教程调整表单数据以合并为PDF,然后发送到电子邮件。我尝试运行脚本时收到以下错误消息:

  
    

TypeError:无法从undefined中读取属性“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 个答案:

答案 0 :(得分:5)

您看到的错误是因为您在脚本编辑器中运行了触发器功能。执行此操作时,未定义事件参数e - 这是错误消息所说的内容。

有关更多背景信息,请参阅How can I test a trigger function in 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);
  }
}

我没有对原始函数进行其他调试......但这消除了该错误消息,因此您可以继续测试。

答案 1 :(得分:0)

我使用下面的代码来测试我的触发器

//
//
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功能。

简单的解决方案:)