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
相关产品推荐
相关产品推荐

