如何通过Google表格OnSubmit触发器获取Google表单文档属性(GAS)
Google表单插件跨上下文获取属性解决方案
问题场景
我正在开发一个Google表单编辑器插件,功能是自动创建对应的响应Google表格,并给表格绑定On form submit触发器。触发器代码存在表单的脚本编辑器中,但触发时调用getSettings()返回空值——因为触发器运行在表格的上下文里,无法直接获取表单的DocumentProperties。同时我不能改用forForm触发器,因为需要访问表格提交事件对象中的行数据。
解决思路
1. 建立表单与表格的ID关联(推荐方案)
核心是在创建表格时,将表单的ID存储到表格的属性中,触发器触发时通过该ID找到对应表单,进而获取表单的DocumentProperties。
示例代码:创建表格时存储表单ID
function createResponseSheet() { const activeForm = FormApp.getActiveForm(); const spreadsheet = SpreadsheetApp.create(`${activeForm.getTitle()} 响应表格`); // 将表单ID存入表格的DocumentProperties spreadsheet.setDocumentProperty('linkedFormId', activeForm.getId()); // 绑定表单提交触发器 ScriptApp.newTrigger('onSubmit') .forSpreadsheet(spreadsheet) .onFormSubmit() .create(); }
示例代码:在onSubmit中获取表单属性
function onSubmit(e) { // 获取当前表格及绑定的表单ID const spreadsheet = SpreadsheetApp.getActiveSpreadsheet(); const formId = spreadsheet.getDocumentProperty('linkedFormId'); if (formId) { // 打开关联的表单,获取其DocumentProperties const linkedForm = FormApp.openById(formId); const formProperties = PropertiesService.getDocumentProperties(linkedForm); // 读取表单设置 console.log(formProperties.getProperty('NAME')); } // 处理表格提交的行数据 const submittedRow = e.values; // ... 后续业务逻辑 }
2. 替代方案:使用触发器参数传递表单ID
创建触发器时,直接将表单ID作为参数传入,触发时通过触发器对象获取该参数:
示例代码:带参数创建触发器
function createTriggerWithFormId() { const activeForm = FormApp.getActiveForm(); const spreadsheet = SpreadsheetApp.getActiveSpreadsheet(); ScriptApp.newTrigger('onSubmit') .forSpreadsheet(spreadsheet) .onFormSubmit() .withArgument('formId', activeForm.getId()) // 传入表单ID .create(); }
示例代码:获取触发器参数并访问表单
function onSubmit(e) { // 通过触发器ID获取参数 const trigger = ScriptApp.getTriggerById(e.triggerUid); const formId = trigger?.getHandlerFunctionArguments().formId; if (formId) { const linkedForm = FormApp.openById(formId); const formProperties = PropertiesService.getDocumentProperties(linkedForm); console.log(formProperties.getProperties()); } // 处理行数据 }
3. 权限与清单配置
确保脚本的appscript.json清单中包含必要的OAuth权限,避免访问表单或表格时出现权限错误:
{ "oauthScopes": [ "https://www.googleapis.com/auth/forms", "https://www.googleapis.com/auth/spreadsheets", "https://www.googleapis.com/auth/script.triggers" ], "addOns": { "form": { "homepageTrigger": { "runFunction": "showSidebar", "enabled": true } } } }
不需要修改清单来“关联脚本到表单和表格”——脚本本身绑定在表单上,只要权限足够,就能访问关联的表格。
关键说明
DocumentProperties是文档级别的,表单和表格属于不同文档,无法直接跨上下文访问,必须通过ID关联后主动获取。- 存储表单ID到表格属性的方式比触发器参数更稳定,避免触发器参数丢失的情况。
内容的提问来源于stack exchange,提问作者Code Guy
相关产品推荐
相关产品推荐

