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

Google Apps Script表单提交触发器异常:仅手动编辑字段时触发

问题

我有一个Google Apps Script脚本,当前仅在手动编辑目标字段(需匹配值为"On Campus")时才会触发——得先把该字段改为其他值,再改回"On Campus",脚本才会执行。
我的需求是:设置Form Submit触发器后,当表单提交且指定字段值为"On Campus"时,自动触发该脚本。
已将触发器设置为On Form Submit,请问为何仅手动编辑字段时脚本才生效?

附脚本代码:

function sendEmailSupervisor(e) {
  if (e.range.columnStart != 11 || e.value != "On Campus") return;
  const rData = e.source.getActiveSheet().getRange(e.range.rowStart,1,1,21).getValues();
  let a = rData[0][0];
  let b = rData[0][1];
  let c = rData[0][4];
  let d = rData[0][5];
  let f = rData[0][6];
  let now = new Date().toLocaleString("en-US");
  
  let msg = "Date/Time Submitted: "+ a + "\n \n" + "Email Address:  " + b +  "\n \n" + "Person Requesting? " + c +  "\n \n" + "Name of the event? " + d +  "\n \n" + "Description of the event? " + f + "\n \n" + " Form Submitted:  " + now;
  Logger.log(msg);
  GmailApp.sendEmail("myemail@mydomain.com", "On Campus Event Submitted", msg)
}

附触发器设置截图:触发器设置截图

原因分析

脚本里的判断逻辑依赖e.range.columnStart和e.value,这两个属性是**手动编辑触发(On Edit)事件特有的,而表单提交触发(On Form Submit)**的事件对象e结构完全不同:

  • 表单提交的e没有range和value属性,而是用values数组存储提交的所有字段值,用namedValues存储带字段名的键值对
  • 所以当表单提交时,e.range.columnStart会是undefined,直接触发return语句终止脚本执行
解决方案

修改脚本,同时适配表单提交和手动编辑的事件对象结构:

function sendEmailSupervisor(e) {
  let targetValue;
  // 判断触发类型
  if (e.values) {
    // 表单提交:第11列对应数组索引10(数组从0开始计数)
    targetValue = e.values[10];
  } else if (e.range) {
    // 手动编辑:保留原列判断逻辑
    if (e.range.columnStart !== 11) return;
    targetValue = e.value;
  } else {
    // 未知触发方式,直接返回
    return;
  }

  // 检查目标值是否符合要求
  if (targetValue !== "On Campus") return;

  // 获取当前行数据,兼容两种触发方式
  let rData;
  if (e.range) {
    rData = e.source.getActiveSheet().getRange(e.range.rowStart, 1, 1, 21).getValues()[0];
  } else {
    // 表单提交时,用e.values作为行数据,补充空值避免索引越界
    rData = [...e.values];
    while (rData.length < 21) {
      rData.push("");
    }
  }

  let a = rData[0];
  let b = rData[1];
  let c = rData[4];
  let d = rData[5];
  let f = rData[6];
  let now = new Date().toLocaleString("en-US");
  
  let msg = "Date/Time Submitted: "+ a + "\n \n" + "Email Address:  " + b +  "\n \n" + "Person Requesting? " + c +  "\n \n" + "Name of the event? " + d +  "\n \n" + "Description of the event? " + f + "\n \n" + " Form Submitted:  " + now;
  Logger.log(msg);
  GmailApp.sendEmail("myemail@mydomain.com", "On Campus Event Submitted", msg)
}

额外优化建议

如果想更可靠地获取字段值,可使用e.namedValues(通过表单字段名读取,无需关心列位置),示例如下:

// 表单提交时,直接通过字段名取值
let targetValue = e.namedValues["你的目标字段名称"][0];
let b = e.namedValues["Email Address"][0];

这种方式无需关注列的索引变化,维护性更强。


内容的提问来源于stack exchange,提问作者user247365

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.11 10:45:47