谷歌表单提交触发PDF生成脚本报错 TypeError: 无法读取undefined的range属性
报错原因
你遇到的TypeError: Cannot read property 'range' of undefined错误,核心原因是代码运行时事件参数e未被正确传入,具体可分为三类情况:
- 触发方式错误:直接在脚本编辑器手动点击运行代码,手动运行不会自动注入表单提交事件的
e参数,只有绑定的触发器被表单提交动作触发时,系统才会自动传入该参数。 - 触发器失效:原有的表单提交可安装触发器被系统禁用、权限过期、或关联的表格/表单权限变更,导致触发时没有传入事件参数。
- 代码结构缺失:你贴出的代码缺少外层函数定义,触发逻辑必须包裹在接收
e作为入参的函数中,否则e会是未定义状态。
另外你当前代码还存在一个隐藏问题:发邮件时引用的Name变量没有定义,修复完e的问题后还会触发变量未定义的报错。
修复方案
步骤1:补全代码结构
将你现有的代码全部包裹到接收事件参数的触发函数中,同时补充缺失的Name变量定义:
// 定义表单提交触发函数,必须接收e作为入参 function onFormSubmit(e) { const rg = e.range; console.log(rg.getA1Notation()); const sh = rg.getSheet(); // 获取表单提交数据 const Email= e.namedValues['Email Address'][0]; // 补充Name变量,把字段名替换为你表单里实际的姓名字段,不需要的话直接删除邮件里的Name引用 const Name = e.namedValues['Your Name'][0]; const LinkOrig = e.namedValues['Link(s) for where the original work appears'][0]; const AttachOrig = e.namedValues['Copies of the original copyrighted work'][0]; const Domain = e.namedValues['Infringing Domain'][0]; const LinkInfring = e.namedValues['Link(s) for where infringing image appears online'][0]; const Contact = e.namedValues['Contact Information'][0]; const WHOIS = e.namedValues['WHOIS Search results'][0]; const Date = e.namedValues['Date'][0]; const Location = e.namedValues['Where are you based?'][0]; // 定义存储文件夹、模板ID,替换为你自己的实际ID const DMCAFolderID = 'googledrivefolderidhere'; const DMCALibFolder = DriveApp.getFolderById(DMCAFolderID); const TemplateFileID = 'googledrivetemplateidhere'; const newFilename = 'DMCA Notice -' + TemplateFileID + 'Domain'; // 复制模板文件 const newTemplateFileID = DriveApp.getFileById(TemplateFileID).makeCopy(newFilename, DMCALibFolder).getId(); // 填充模板内容 var document = DocumentApp.openById(newTemplateFileID); var body = document.getBody(); body.replaceText('{{LinkOrig}}', LinkOrig); body.replaceText('{{LinkInfring}}', LinkInfring); body.replaceText('{{ContactInfo}}', Contact); body.replaceText('{{WHOISResults}}', WHOIS); body.replaceText('{{date}}', Date); body.replaceText('{{location}}', Location); document.saveAndClose(); // 组装邮件 var subject = 'DMCA Notice - ' + Domain; var msgHtml = "Hi " + Name + "," + "<br/>" + "<br/>" + "Please find your DMCA Notice attached." + "<br/>" + "<br/>" + "Sincerely," + "<br/>" + "Your Bada** Self" + "<br/>" ; var attachment = DriveApp.getFileById(newTemplateFileID); // 发送带PDF附件的邮件 GmailApp.sendEmail(Email, subject, msgHtml, {htmlBody: msgHtml, attachments: [attachment.getAs(MimeType.PDF)]}); }
步骤2:重新配置可安装触发器
- 打开脚本编辑器左侧「触发器」面板,删除所有旧的失效触发器
- 点击「添加触发器」,按如下配置:
- 选择运行的函数:
onFormSubmit - 选择事件来源:
电子表格 - 选择事件类型:
表单提交时 - 失败通知设置:建议选择即时通知,方便后续排查问题
- 选择运行的函数:
- 保存触发器后按照提示完成账号权限授权,遇到未验证应用提示时,选择「高级」-「继续前往[脚本名称]」即可完成授权。
步骤3:测试验证
不要在脚本编辑器手动点击运行,直接在关联的谷歌表单提交一条测试数据,前往脚本编辑器的「执行」面板查看运行日志,无报错即为修复成功。
内容的提问来源于stack exchange,提问作者taleesita
相关产品推荐
相关产品推荐

