javascript - 表单的应用程序脚本返回无法读取未定义错误的属性“值”
问题描述
我有一个简单的脚本可以在提交表单时生成文档和 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];
。
解决方案
- 在您的情况下,使用了 Google Form 的容器绑定脚本。
- OnSubmit 事件触发器安装到
myFunction
. - 您想
firstName, lastName, title
从 4 个问题中检索 3 个响应值。 - 您还想检索
timestamp
.
如果我的理解是正确的,那么这个修改呢?请认为这只是几个可能的答案之一。
修改点:
- 从您提供的图片中,发现该脚本是Google Form的容器绑定脚本。
- 不幸的是, OnSubmit 事件触发器的事件对象没有Google Form
values
的容器绑定脚本的属性。参考 - 在这种情况下,需要使用 检索响应值
e.response.getItemResponses()
。
- 不幸的是, OnSubmit 事件触发器的事件对象没有Google Form
- 在
values
事件对象中包含的情况下,需要是Spreadsheet的容器绑定脚本。当使用 Spreadsheet 的容器绑定脚本时,您可以使用e.values
from检索响应值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()});
参考:
- 事件对象的表单提交
- 获取时间戳()
- 获取项目响应()
- 如何在提交事件处理程序中获取表单值?
- 我认为这个线程可能有用。
推荐阅读
- javascript - 根据特定字段对对象数组进行分组
- reactjs - react redux依赖如何与redux一起工作
- python - NN 的反向传播是否正确
- python - 绑定到键盘的 Tkinter 按钮不计算类参数
- javascript - 有哪些类似于 Google 应用脚本的替代编程脚本。?
- django - 将额外数据附加到 django 中的 request.POST
- c# - System.NullReferenceException:Excel C#
- r - 在 r 中以单独的时间序列运行循环
- javascript - 浏览器没有响应,但在邮递员中得到 401
- javascript - javascript 样式不适用于拆分的字符串