You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

请求协助设置邮件触发:特定用户提交表单时自动发邮件

解决Google表格表单提交触发特定用户邮件通知的方案

我之前处理过几乎一模一样的需求,踩过不少坑,给你一套能解决问题的实操方案:

先排查之前触发器无效的核心原因

你之前用On changeOn EditOn 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

火山引擎 最新活动