首页 > 解决方案 > 表单的应用程序脚本返回无法读取未定义错误的属性“值”

问题描述

我有一个简单的脚本可以在提交表单时生成文档和 PDF。我检查了我的所有代码并提交了一个测试表单来测试它,但是当脚本试图从表单中读取电子表格结果时,我不断收到“值”未定义的错误。

我还尝试在存储表单提交结果而不是表单的电子表格中添加脚本,但我得到了同样的错误。

谁能指出我做错了什么?

我设置了一个触发器以在表单提交时执行脚本: 触发器集

这是我的代码:

function myFunction(e) {
  //e.values is an array of form values
  var timestamp = e.values[0];
  var firstName = e.values[1];
  var lastName = e.values[2];
  var title = e.values[3];
  Logger.log(e.values[0]);

  //file is the template file, and you get it by ID
  var file = DriveApp.getFileById('google-doc-template-file-id'); 

  //We can make a copy of the template, name it, and optionally tell it what folder to live in
  //file.makeCopy will return a Google Drive file object
  var folder = DriveApp.getFolderById('my-drive-folder-id')
  var copy = file.makeCopy(lastName + ',' + firstName, folder); 

  //Once we've got the new file created, we need to open it as a document by using its ID
  var doc = DocumentApp.openById(copy.getId());

  //Since everything we need to change is in the body, we need to get that
  var body = doc.getBody(); 

  //Then we call all of our replaceText methods
  body.replaceText('{{First name}}', firstName); 
  body.replaceText('{{Last name}}', lastName);  
  body.replaceText('{{Company}}', company); 

  doc.getAs(pdf);
  //Lastly we save and close the document to persist our changes
  doc.saveAndClose(); 
}

错误发生在第 3 行 - var timestamp = e.values[0];

标签: javascriptgoogle-apps-script

解决方案


  • 在您的情况下,使用了 Google Form 的容器绑定脚本。
  • OnSubmit 事件触发器安装到myFunction.
  • 您想firstName, lastName, title从 4 个问题中检索 3 个响应值。
  • 您还想检索timestamp.

如果我的理解是正确的,那么这个修改呢?请认为这只是几个可能的答案之一。

修改点:

  • 从您提供的图片中,发现该脚本是Google Form的容器绑定脚本。
    • 不幸的是, OnSubmit 事件触发器的事件对象没有Google Formvalues的容器绑定脚本的属性。参考
    • 在这种情况下,需要使用 检索响应值e.response.getItemResponses()
  • values事件对象中包含的情况下,需要是Spreadsheet的容器​​绑定脚本。当使用 Spreadsheet 的容器绑定脚本时,您可以使用e.valuesfrom检索响应值myFunction(e)参考
  • 而且,为了检索时间戳,getTimestamp()使用。

当以上几点反映到您的脚本时,它变成如下。

修改后的脚本:

从:
//e.values is an array of form values
var timestamp = e.values[0];
var firstName = e.values[1];
var lastName = e.values[2];
var title = e.values[3];
Logger.log(e.values[0]);
至:
var response = e.response;
var timestamp = response.getTimestamp();
var [firstName, lastName, title] = response.getItemResponses().map(function(f) {return f.getResponse()});

参考:


推荐阅读