请求协助设置邮件触发:特定用户提交表单时自动发邮件
解决Google表格表单提交触发特定用户邮件通知的方案
我之前处理过几乎一模一样的需求,踩过不少坑,给你一套能解决问题的实操方案:
先排查之前触发器无效的核心原因
你之前用On change、On Edit、On form submit没效果,大概率是这两个问题:
- 触发器绑定错了工作表:
On form submit必须绑定到接收表单提交数据的那张原始工作表,而不是你提取特定用户数据的工作表,否则监听不到表单提交事件 - 没有做重复发送的防重逻辑,导致测试时出现重复邮件,误以为触发器失效
具体实现步骤
1. 编写Google Apps Script核心代码
打开你的Google表格,点击「扩展程序」→「Apps脚本」,创建新脚本,替换成以下代码(根据你的实际表格结构调整参数):
function sendTargetUserEmail(e) { // 获取表单提交的行对象 const submittedRow = e.range; const sourceSheet = submittedRow.getSheet(); const rowIndex = submittedRow.getRow(); // 1. 配置关键参数(根据你的表格修改!) const targetUsers = ['user1@yourdomain.com', 'user2@yourdomain.com']; // 目标用户邮箱 const submitterEmailCol = 2; // 表单中收集用户邮箱的列索引(比如第2列) const emailStatusCol = 6; // 用来标记是否已发邮件的列(提前在表格里加一列,比如叫「邮件状态」) // 2. 提取提交用户信息并校验 const submitterEmail = sourceSheet.getRange(rowIndex, submitterEmailCol).getValue(); const hasSentEmail = sourceSheet.getRange(rowIndex, emailStatusCol).getValue() === '已发送'; // 3. 仅当是目标用户且未发送过邮件时执行 if (targetUsers.includes(submitterEmail) && !hasSentEmail) { // 构造邮件内容(根据你的表单字段调整) const emailSubject = `[通知] 目标用户${submitterEmail}提交了表单`; const emailBody = ` 用户邮箱:${submitterEmail} 提交时间:${new Date().toLocaleString()} 表单内容: - 问题1:${sourceSheet.getRange(rowIndex, 3).getValue()} - 问题2:${sourceSheet.getRange(rowIndex, 4).getValue()} `; // 发送邮件(替换成你的收件人邮箱) MailApp.sendEmail('your-admin@yourdomain.com', emailSubject, emailBody); // 标记已发送,防止重复触发 sourceSheet.getRange(rowIndex, emailStatusCol).setValue('已发送'); } }
2. 正确配置触发器
这一步是关键,别再绑错工作表了:
- 在Apps脚本页面,点击左侧的「触发器」图标(时钟形状)
- 点击「添加触发器」,按以下配置:
- 选择要运行的函数:
sendTargetUserEmail - 选择部署类型:
Head deployments(如果是新创建的脚本,默认选这个) - 选择事件源:
从电子表格 - 选择事件类型:
On form submit - 点击「保存」,按照提示完成权限授权(需要允许脚本访问你的邮箱和表格)
- 选择要运行的函数:
3. 测试验证
用目标用户的账号提交一次表单,检查:
- 收件邮箱是否收到通知邮件
- 原始表单工作表的「邮件状态」列是否被标记为「已发送」
- 再次提交同一份表单(如果允许重复提交),不会重复发送邮件
额外注意事项
- 如果你的表单没有收集用户邮箱,可以用
Session.getActiveUser().getEmail()来获取提交者的邮箱,但这个要求用户必须登录Google账号提交表单,且脚本需要额外的权限 - 确保「邮件状态」列是提前在原始表单工作表中添加的,不要放到提取数据的工作表里
- 如果遇到权限问题,在脚本编辑器中点击「运行」→「运行函数」→
sendTargetUserEmail,手动触发一次授权流程
内容的提问来源于stack exchange,提问作者Juan Pablo Marroquin




