Google表单提交后无法生成PDF,脚本执行时e.namedvalue行报错
Google表单提交生成PDF报错解决方案
报错核心原因
你收到的error in line 2 e.namedvalue(e)报错,本质是afterFormSubmit函数接收的事件对象e不符合预期,或是后续字段读取、权限配置异常,对应解决方法如下:
1. 触发方式配置错误
事件对象e仅在表单提交自动触发脚本时才会自动生成,如果你直接在Apps Script编辑器手动点击运行按钮,系统不会传入e对象,自然会报属性读取错误。
配置正确触发的步骤:
- 打开当前脚本对应的Apps Script项目,点击左侧菜单栏「触发器」选项
- 点击右下角「添加触发器」,按以下参数配置:
- 选择要运行的函数:
afterFormSubmit - 选择要运行的部署:Head(默认)
- 选择事件来源:来自表单
- 选择事件类型:表单提交时
- 选择要运行的函数:
- 保存后按照提示完成账号权限授权,提交测试表单验证即可。
2. 表单字段名称不匹配
e.namedValues的键名必须和Google表单的字段名称完全一致,大小写、空格、特殊符号都不能有差异,否则读取对应字段会返回undefined,调用[0]时报错。
验证字段名方法:
在afterFormSubmit函数首行添加日志代码:
console.log(JSON.stringify(e.namedValues))
提交一次测试表单后,到Apps Script左侧「执行记录」中查看打印的字段名,完全复制对应字段名替换代码中的键名即可。
3. 代码细节修复
你的现有代码缺少文档保存步骤,会导致替换的内容未同步到PDF中,且存在语法缺漏,修正后的完整代码如下:
function afterFormSubmit(e) { // 新增判断防止手动运行报错 if (!e || !e.namedValues) return; const info = e.namedValues; createPDF(info); } function createPDF(info) { const pdfFolder = DriveApp.getFolderById("1BSBIOPWFoc7o2nbX8XT23C85_pBq02VE"); const tempfolder = DriveApp.getFolderById("1xSl7VhVwHAmIcVOdXVUlzwZcZ27q3hqU"); const templateDoc = DriveApp.getFileById("1vc7rTRU88LDF07hJs5Waf4OIWy2pAeoFNkB8UBpDnqI"); const newTempFile = templateDoc.makeCopy(tempfolder); const opendoc = DocumentApp.openById(newTempFile.getId()); const body = opendoc.getBody(); body.replaceText("{dor}", info['Timestamp'][0]); body.replaceText("{fn}", info['Name ( Nama )'][0]); body.replaceText("{nric}", info['NRIC/ID/PASSPORT ( No kad pengenalan/pasport )'][0]); // 新增保存关闭文档步骤,确保修改生效 opendoc.saveAndClose(); const blobPDF = newTempFile.getAs(MimeType.PDF); const pdfFile = pdfFolder.createFile(blobPDF).setName(info['Name ( Nama )'][0] + " " + info['Timestamp'][0]); // 可选:自动删除临时文件节省空间 newTempFile.setTrashed(true); }
4. 权限与ID验证
- 确认代码中三个ID(PDF文件夹ID、临时文件夹ID、模板文档ID)输入正确,且脚本所属的Google账号对三个资源均有编辑权限
- 确认模板文件为Google Docs原生格式,不是上传的Word、PDF等其他格式
内容的提问来源于stack exchange,提问作者helios99
相关产品推荐
相关产品推荐

