You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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:修改表单本身留存的响应

如果确实需要修改表单里存储的用户作答,需要做以下调整:

  1. 先在表单设置里开启「允许用户编辑响应」权限
  2. 表单侧的onFormSubmit触发器绑定的函数要接收事件对象e,通过e.response拿到用户本次提交的响应实例
  3. 正确获取用户在两个选择类问题里的实际作答内容,和库存表文本比对计算价格
  4. 调用响应的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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.01 05:30:03