Google父表单创建的子表单OnSubmit触发器触发异常问题
这是Google Apps Script的平台固有设计,不是配置遗漏导致的问题。
你在父表单绑定的Apps Script项目中创建子表单的提交触发器时,所有触发器默认归属当前运行的父脚本项目,事件对象的source字段固定返回当前脚本绑定的容器(也就是父表单),即使触发器是由子表单提交触发的,该字段也不会自动指向触发事件的子表单,因此会出现子表单的响应ID在父表单中查询不到的报错。
修复方案
你可以通过存储触发器UID与子表单ID的映射关系解决这个问题,参考修改后的代码:
// 全局声明脚本属性存储实例,用于存映射关系 const scriptProps = PropertiesService.getScriptProperties(); function onSendForm(event) { let newForm = FormApp.create('A form'); const newFormId = newForm.getId(); let trigger = ScriptApp.newTrigger('onSendNewForm') .forForm(newForm) .onFormSubmit() .create(); // 存储触发器UID对应子表单ID的映射 scriptProps.setProperty(trigger.getUniqueId(), newFormId); } function onSendNewForm(event) { const triggerUid = event.triggerUid; // 查询当前触发的触发器对应的子表单ID const childFormId = scriptProps.getProperty(triggerUid); if (!childFormId) return; // 主动打开正确的子表单实例 const childForm = FormApp.openById(childFormId); // 从子表单中查询对应响应 const targetResponse = childForm.getResponseById(event.response.getId()); // 后续业务逻辑 Logger.log(childForm.getId()); // 可正确输出子表单ID Logger.log(targetResponse.getItemResponses()); // 可正常获取响应内容 }
如果后续需要清理失效的子表单和触发器,记得同步删除PropertiesService中对应的映射记录,避免存储冗余数据。
内容的提问来源于stack exchange,提问作者coooola
相关产品推荐
相关产品推荐

