如何为程序化复制的带绑定脚本的Google表单添加onFormSubmit触发器?
解决Google表单复制后自动添加onFormSubmit触发器的问题
我来帮你搞定这个触发器创建的问题!你已经走对了方向,只是有几个小细节需要调整,下面是完整的解决方案和关键点说明:
修正后的完整代码
function copyFormAndAddTrigger(classID) { // 配置模板表单和目标文件夹的ID const templateFileId = "1FEVxX2-_pdeg8vN4jaUGhYbTgqVImQqdcPp5jSXkDGM"; const targetFolderId = "1XQfmJH0_CYJP9luXKQTn2JAyLsW5xeV0"; // 复制模板表单到目标文件夹 const templateFile = DriveApp.getFileById(templateFileId); const copiedFile = templateFile.makeCopy(`Debriefing Teste ${classID}`, DriveApp.getFolderById(targetFolderId)); const newFormId = copiedFile.getId(); // 为新创建的表单添加onFormSubmit触发器 ScriptApp.newTrigger("onDebriefingSubmit") .forForm(newFormId) .onFormSubmit() .create(); // 把classID存储到表单的自定义属性中(方便触发函数后续使用) const newForm = FormApp.openById(newFormId); newForm.setProperty("classID", classID); } // 表单提交后的触发处理函数 function onDebriefingSubmit(e) { // 从表单属性中获取对应的classID const submitForm = FormApp.openById(e.source.getId()); const classID = submitForm.getProperty("classID"); // 写入数据到指定表格 const ss = SpreadsheetApp.openById('165k3ieREOPZh9JV7UstidW0z8RScB3GtSjxG_Eb7ttk'); const sheet = ss.getSheetByName('Respostas'); // 这里可以根据需求写入更多内容,比如提交时间、classID等 sheet.appendRow([new Date(), classID, "表单提交测试成功"]); }
关键调整说明
- 表单属性存储修正:你之前用
newForm.classID = classID的方式是无效的,Google表单对象没有直接的自定义属性,需要用setProperty()和getProperty()来存储/读取自定义数据,这样触发函数就能关联到对应的classID。 - 权限注意事项:第一次运行
copyFormAndAddTrigger函数时,会弹出授权请求,必须授予足够的权限(尤其是创建触发器和访问表单/表格的权限),否则触发器无法创建。 - 触发器验证:创建完成后,你可以在脚本编辑器的「编辑」→「当前项目的触发器」中查看,确认新的触发器是否成功生成。
- 触发函数参数利用:
e.source是触发事件的表单对象,通过它可以获取当前提交的表单ID,进而拿到存储的classID,确保每个表单的提交都能对应到自己的业务逻辑。
排查小技巧
- 如果触发器没创建成功,先检查是否有授权弹窗被拦截,重新运行函数完成授权。
- 确认触发函数的名称和
newTrigger()中传入的字符串完全一致(大小写敏感)。 - 测试时可以手动提交新复制的表单,查看目标表格是否有数据写入,验证触发器是否生效。
内容的提问来源于stack exchange,提问作者Set
相关产品推荐
相关产品推荐

