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

如何在表格多标签页运行表单提交触发的行数据邮件脚本?

实现多工作表新增行自动发送邮件方案

因为你用QUERY函数动态生成排序后的数据,这类动态更新的行无法通过表单提交触发器直接捕获,得用单元格更改触发器结合历史行数记录来实现,具体步骤和代码如下:

核心思路

  1. 用一个隐藏工作表记录每个目标标签页的历史行数,每次触发时对比当前行数和历史行数,判断是否有新增行
  2. 通过onChange触发器监控表格的所有更改,一旦检测到目标工作表有新增行,提取数据并发送邮件
  3. 更新历史行数记录,避免重复发送

具体实现步骤

1. 创建历史记录表(自动生成)

运行下面的代码后,会自动创建一个名为RowHistory的隐藏工作表,用于存储每个目标标签页的最后行数。

2. 完整脚本代码

function checkNewRowsAndSendEmail() {
  // 替换成你需要监控的工作表名称数组
  const targetSheets = ["已排序表1", "已排序表2", "已排序表3"];
  const ss = SpreadsheetApp.getActiveSpreadsheet();
  let historySheet = ss.getSheetByName("RowHistory");

  // 初始化历史表(第一次运行时执行)
  if (!historySheet) {
    historySheet = ss.insertSheet("RowHistory");
    historySheet.getRange("A1:B1").setValues([["SheetName", "LastRow"]]);
    // 写入初始行数
    targetSheets.forEach(sheetName => {
      const sheet = ss.getSheetByName(sheetName);
      if (sheet) historySheet.appendRow([sheetName, sheet.getLastRow()]);
    });
    // 隐藏历史表
    ss.setSheetHidden(historySheet.getSheetId(), true);
    return;
  }

  // 读取历史行数映射
  const historyData = historySheet.getDataRange().getValues();
  const historyMap = new Map();
  for (let i = 1; i < historyData.length; i++) {
    historyMap.set(historyData[i][0], historyData[i][1]);
  }

  // 遍历监控每个目标工作表
  targetSheets.forEach(sheetName => {
    const sheet = ss.getSheetByName(sheetName);
    if (!sheet) return;

    const currentLastRow = sheet.getLastRow();
    const lastRecordedRow = historyMap.get(sheetName) || 0;

    // 检测到新增行
    if (currentLastRow > lastRecordedRow) {
      // 获取所有新增行数据
      const newRows = sheet.getRange(lastRecordedRow + 1, 1, currentLastRow - lastRecordedRow, sheet.getLastColumn()).getValues();
      
      // 逐行发送邮件(可根据需求调整邮件内容)
      newRows.forEach(row => {
        const subject = `【${sheetName}】新增数据通知`;
        // 自定义邮件内容,比如提取特定列、格式化显示
        const body = `新增数据详情:\n${row.map((val, idx) => `第${idx+1}列:${val}`).join("\n")}`;
        const recipient = "你的收件邮箱@xxx.com"; // 替换成实际收件人邮箱
        MailApp.sendEmail(recipient, subject, body);
      });

      // 更新历史行数
      for (let i = 1; i < historyData.length; i++) {
        if (historyData[i][0] === sheetName) {
          historySheet.getRange(i+1, 2).setValue(currentLastRow);
          break;
        }
      }
    }
  });
}

3. 设置触发器

  1. 打开脚本编辑器(点击表格顶部「扩展程序」→「Apps 脚本」)
  2. 点击左侧菜单的「触发器」图标(时钟形状)
  3. 点击「添加触发器」,设置如下:
    • 选择要运行的函数:checkNewRowsAndSendEmail
    • 选择部署类型:「Head」
    • 选择事件源:「从电子表格」
    • 选择事件类型:「更改时」
  4. 保存触发器,授权脚本所需权限

注意事项

  • 请根据实际需求修改targetSheets数组、收件人邮箱、邮件主题和内容格式
  • 第一次运行脚本时会自动初始化历史表,后续无需手动操作
  • 触发器会在表格任何单元格更改时触发,但脚本只会处理目标工作表的新增行,不会重复发送邮件
  • 确保QUERY函数能正确随表单提交更新,否则目标工作表不会新增行,脚本也不会触发邮件发送

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.29 20:15:23