如何仅向Google Form最新提交条目的联系人发送邮件回执?
问题根因
现有代码会遍历表格中所有历史提交行批量发送邮件,每次新提交触发时都会重复给所有历史采购学生发回执,不符合需求。
方案1:仅发送最新提交记录(极简适配)
你需要先把脚本的触发器调整为表单提交触发(代替原来的定时触发/其他触发方式),直接读取最后一行提交记录发送即可,修改后代码如下:
function sendAutomatedEmails() { var spreadSheet = SpreadsheetApp.getActiveSheet(); var dataRange = spreadSheet.getDataRange(); var data = dataRange.getValues(); // 直接取最后一行的最新提交数据,跳过表头 var latestRow = data[data.length - 1]; var emailAddress = latestRow[3]; var message = 'At '+ latestRow[0] + 'You purchased the following:' + '\n\n' + latestRow[4] + '\n' + latestRow[5] + '\n' + latestRow[6] + '\n' + latestRow[7] + '\n' + latestRow[8] + '\n' + latestRow[9] + '\n' + 'Your total cost is $' + latestRow[10]; var subject = 'Personal Purchase Reciept'; MailApp.sendEmail(emailAddress, subject, message); }
注意事项
- 该方案适合提交频率低、不会出现短时间内多人同时提交的场景
- 如果存在1分钟内多笔提交的情况,可能会出现漏发
方案2:带发送标记的稳妥方案(推荐)
不会漏发也不会重复发,还方便对账岗位核对:
- 在你的表格最后新增一列(比如第12列,对应数组索引为11),列名设为「邮件发送状态」
- 替换为以下代码,逻辑为每次触发时只发送状态为空的记录,发送成功后自动标记为「已发送」:
function sendAutomatedEmails() { var spreadSheet = SpreadsheetApp.getActiveSheet(); var dataRange = spreadSheet.getDataRange(); var data = dataRange.getValues(); // 遍历所有行,只发送未标记已发送的记录 for (var i = 1; i < data.length; i++) { var row = data[i]; // 第12列是新增的发送状态列,为空代表未发 if (row[11] === '') { var emailAddress = row[3]; var message = 'At '+ row[0] + 'You purchased the following:' + '\n\n' + row[4] + '\n' + row[5] + '\n' + row[6] + '\n' + row[7] + '\n' + row[8] + '\n' + row[9] + '\n' + 'Your total cost is $' + row[10]; var subject = 'Personal Purchase Reciept'; MailApp.sendEmail(emailAddress, subject, message); // 发送成功后标记为已发送,对应表格行号是i+1,列号是12(表格行列从1开始计数) spreadSheet.getRange(i + 1, 12).setValue('已发送'); } } }
优势
- 哪怕短时间多笔提交也不会漏发、重复发
- 对账岗位可以直接通过「邮件发送状态」列核对哪些采购记录已经给学生发了回执,和银行到账记录对应更方便
内容的提问来源于stack exchange,提问作者Jennifer Surdi
相关产品推荐
相关产品推荐

