如何在表格多标签页运行表单提交触发的行数据邮件脚本?
实现多工作表新增行自动发送邮件方案
因为你用QUERY函数动态生成排序后的数据,这类动态更新的行无法通过表单提交触发器直接捕获,得用单元格更改触发器结合历史行数记录来实现,具体步骤和代码如下:
核心思路
- 用一个隐藏工作表记录每个目标标签页的历史行数,每次触发时对比当前行数和历史行数,判断是否有新增行
- 通过
onChange触发器监控表格的所有更改,一旦检测到目标工作表有新增行,提取数据并发送邮件 - 更新历史行数记录,避免重复发送
具体实现步骤
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. 设置触发器
- 打开脚本编辑器(点击表格顶部「扩展程序」→「Apps 脚本」)
- 点击左侧菜单的「触发器」图标(时钟形状)
- 点击「添加触发器」,设置如下:
- 选择要运行的函数:
checkNewRowsAndSendEmail - 选择部署类型:「Head」
- 选择事件源:「从电子表格」
- 选择事件类型:「更改时」
- 选择要运行的函数:
- 保存触发器,授权脚本所需权限
注意事项
- 请根据实际需求修改
targetSheets数组、收件人邮箱、邮件主题和内容格式 - 第一次运行脚本时会自动初始化历史表,后续无需手动操作
- 触发器会在表格任何单元格更改时触发,但脚本只会处理目标工作表的新增行,不会重复发送邮件
- 确保
QUERY函数能正确随表单提交更新,否则目标工作表不会新增行,脚本也不会触发邮件发送
内容的提问来源于stack exchange,提问作者Andrew Waranoff
相关产品推荐
相关产品推荐

