Google Form Submit触发器触发时机及响应修改代码问题咨询
Google Form 提交修改问题解答
1. 表单提交触发器的触发时机
- 绑定在表单侧的
onFormSubmit触发器:触发时机为用户提交表单后、数据同步推送至关联电子表格之前 - 绑定在关联电子表格侧的
onFormSubmit触发器:触发时机为表单数据已经写入电子表格之后
2. 当前代码的核心错误
你的代码无法运行和触发时机无关,本身存在多处逻辑/语法错误:
- 未关联到用户本次提交的响应:
form.createResponse()是创建一条全新的空白响应,完全没有绑定用户刚提交的作答,自然修改不到目标内容 getItemById()参数错误:该方法接收数字类型的问题ID,你传入的"Question 1"是问题标题,无法匹配到对应的问题项- 基础语法错误:
var price_selected = form.getItemByID("Price").asMultipleChoiceItem存在两处错误:一是方法名是getItemById(末尾d小写),二是asMultipleChoiceItem后面漏了调用括号(),没有拿到实际的MultipleChoiceItem实例 - 比对逻辑完全错误:
item_selected是ListItem对象,inventory[i]是单元格存储的文本值,两者类型不一致永远不会相等;同理bp_selected也是ListItem对象,和"Yes"字符串比对也永远返回false,你根本没有拿到用户在这两个问题里实际选择的答案内容 - 循环范围错误:你把循环长度
sl写死为8,仅匹配inventory的前8行,大概率找不到对应商品条目 - 未提交修改:构造完修改后的响应后没有调用
submit()方法,修改不会生效
3. 正确实现方案
方案1:直接修改关联电子表格(更简单,无需额外权限)
如果你的最终目的只是把计算出的价格同步到电子表格,不需要修改表单后台留存的响应,直接使用表格侧的onFormSubmit触发器即可:
- 触发器绑定到关联的电子表格,触发事件选择「表单提交」
- 事件对象
e.range就是本次新写入数据的行范围,直接把计算好的价格写入对应价格列单元格即可。
方案2:修改表单本身留存的响应
如果确实需要修改表单里存储的用户作答,需要做以下调整:
- 先在表单设置里开启「允许用户编辑响应」权限
- 表单侧的
onFormSubmit触发器绑定的函数要接收事件对象e,通过e.response拿到用户本次提交的响应实例 - 正确获取用户在两个选择类问题里的实际作答内容,和库存表文本比对计算价格
- 调用响应的
withItemResponse()方法修改对应问题的作答后,调用submit()方法提交修改
修正后的核心逻辑示例:
// 表单侧onFormSubmit触发函数,接收事件对象e function setPrice(e) { // 获取关联表格数据 const ws = SpreadsheetApp.openByUrl("spreadsheet_link"); const ss = ws.getSheetByName("BPS"); // 一次性获取所有库存数据减少API调用 const allData = ss.getRange("A2:C280").getValues(); const form = FormApp.getActiveForm(); // 注意这里替换为你自己的问题数字ID,可通过form.getItems()遍历打印获取 const itemItem = form.getItemById(123456).asListItem(); const bpItem = form.getItemById(789012).asListItem(); const priceItem = form.getItemById(345678).asMultipleChoiceItem(); // 获取本次提交的实际作答内容 const currentResponse = e.response; const itemSelected = currentResponse.getResponseForItem(itemItem).getResponse(); const bpSelected = currentResponse.getResponseForItem(bpItem).getResponse(); // 匹配价格 let thisPrice = 999999999; for (let i = 0; i < allData.length; i++) { if (allData[i][0] === itemSelected) { thisPrice = bpSelected === "Yes" ? allData[i][2] : allData[i][1]; break; } } // 修改价格问题的响应 const priceChoice = priceItem.createChoice(thisPrice.toString()); const priceResponse = priceItem.createResponse(priceChoice); currentResponse.withItemResponse(priceResponse).submit(); }
内容的提问来源于stack exchange,提问作者Bob
相关产品推荐
相关产品推荐

