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

Google Scripts表单提交触发邮件时如何用表单内容填充主题

问题原因分析
  • 变量title作用域错误:你代码中的title是for循环内部声明的单次表头字符串,不是存储所有表头的数组,因此title[1]本质是取单个字符串的第2位字符,完全不是你需要的第2列表头内容
  • 事件对象e生效前提:只有通过表单提交触发器触发函数时,e对象才会有有效值,直接在脚本编辑器点击运行函数会因为e为undefined直接报错,导致无法发送邮件
  • e.namedValues的键必须和表格第一行的表头文本完全匹配,大小写、空格都不能有差异,否则会返回undefined,调用toString方法时会直接抛出异常
修复后的完整代码
function newResponse(e) {
  var ss = SpreadsheetApp.getActiveSpreadsheet();
  var formName = ss.getSheetByName('Form Responses 1');
  var lastRow = formName.getLastRow();
  var lastColumn = formName.getLastColumn();
  var email = "sample@myemail.com"; 
  var name = "My Email";
  var subject = 'New form response: ';
  var body = '';

  // 预先读取所有表头存储为数组,方便后续调用
  var titles = formName.getRange(1, 1, 1, lastColumn).getDisplayValues()[0];

  for (var i = 1; i <= lastColumn ; i++) {
    var title = titles[i-1]; // 数组索引从0开始,表格列数从1开始,因此做减1处理
    var cell = formName.getRange(lastRow, i).getDisplayValue();
    if (cell != '' && cell != 0) {
      body = body + '<b>'+ title + '</b>: ' + cell + '<br>';
    };
  };

  // 拼装主题,第2/3/4列对应数组索引1/2/3
  subject += e.namedValues[titles[1]].toString() + " (" + e.namedValues[titles[2]].toString()+ ", " + e.namedValues[titles[3]].toString() + ")";

  MailApp.sendEmail({
    to: email,
    name: name,
    subject: subject,
    htmlBody: body
  });
}
配置注意事项
  • 删除原来的表单提交触发器,重新创建新触发器:触发事件选择「表单提交」,触发函数选择newResponse
  • 第一次触发时会弹出授权请求,按照提示完成授权即可正常运行
  • 如果需要直接在编辑器测试运行,可以替换主题拼装逻辑,无需依赖事件对象e:
// 替换上方的主题拼装代码即可,直接从表格读取对应列内容
var item = formName.getRange(lastRow, 2).getDisplayValue();
var company = formName.getRange(lastRow, 3).getDisplayValue();
var country = formName.getRange(lastRow, 4).getDisplayValue();
subject += `${item} (${company}, ${country})`;

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.07 06:57:03