邮件序列脚本故障:无法识别回复并终止发送及记录时间戳
问题诊断
你的脚本当前仅实现了定时发送邮件序列的逻辑,但完全缺失监听客户回复并更新表格的核心功能——脚本没有对接Gmail的收件箱检查,自然无法识别客户是否回复,也就无法触发终止发送和记录时间戳的操作。
解决方案步骤
1. 添加Gmail回复监听函数
创建专门检查客户回复的函数,通过Gmail筛选目标邮件的回复,匹配表格邮箱并更新C列时间戳:
function checkCustomerReplies() { var sheet = SpreadsheetApp.openByUrl('https://docs.google.com/spreadsheets/d/1gRjF4QjLunF5jRE1qGj2hTSlIwyvPsI3h78bacJBDHI/edit#gid=0').getSheetByName('Sheet1'); var data = sheet.getRange('A2:C').getValues(); // 筛选收件箱中针对我们发送的前两封邮件的回复 var threads = GmailApp.search('in:inbox is:reply (subject:"First Email Subject" OR subject:"Second Email Subject")'); for (var i = 0; i < threads.length; i++) { var messages = threads[i].getMessages(); var latestReply = messages[messages.length - 1]; // 提取纯邮箱地址(排除姓名部分) var senderEmail = latestReply.getFrom().match(/<(.*)>/)[1]; // 匹配表格中的客户并更新回复时间 for (var j = 0; j < data.length; j++) { var customerEmail = data[j][0]; var responseRecorded = data[j][2]; if (customerEmail === senderEmail && !responseRecorded) { sheet.getRange(j + 2, 3).setValue(new Date(latestReply.getDate())); break; } } } }
2. 设置自动监听触发器
给checkCustomerReplies加定时触发器,确保及时捕获回复:
- 打开脚本编辑器→左侧「触发器」图标→添加触发器
- 选择函数:
checkCustomerReplies - 事件源选「时间驱动」,类型选「小时计时器」,间隔设为「每1小时」
3. 修复原sendEmails脚本的逻辑漏洞
原脚本的邮件发送顺序判断错误(第三封的判断在第二封之前,会跳过第二封),同时优化判断逻辑:
function sendEmails() { var sheet = SpreadsheetApp.openByUrl('https://docs.google.com/spreadsheets/d/1gRjF4QjLunF5jRE1qGj2hTSlIwyvPsI3h78bacJBDHI/edit#gid=0').getSheetByName('Sheet1'); var data = sheet.getRange('A2:C').getValues(); var subject1 = 'First Email Subject'; var body1 = 'First Email Body'; var subject2 = 'Second Email Subject'; var body2 = 'Second Email Body'; var subject3 = 'Third Email Subject'; var body3 = 'Third Email Body'; const ONE_DAY = 24 * 60 * 60 * 1000; const THREE_DAYS = 3 * ONE_DAY; for (var i = 0; i < data.length; i++) { var email = data[i][0]; var sentDate = data[i][1]; var responseDate = data[i][2]; // 空邮箱或已回复的直接跳过 if (!email || responseDate) continue; if (!sentDate) { // 发送第一封邮件 MailApp.sendEmail(email, subject1, body1); sheet.getRange(i + 2, 2).setValue(new Date()); Utilities.sleep(1000); } else if (new Date() - sentDate > ONE_DAY && new Date() - sentDate <= THREE_DAYS) { // 第一封发送后1-3天无回复,发第二封 MailApp.sendEmail(email, subject2, body2); // 建议新增D列记录第二封发送时间,不要覆盖第一封的时间 // sheet.getRange(i + 2, 4).setValue(new Date()); Utilities.sleep(1000); } else if (new Date() - sentDate > THREE_DAYS) { // 第一封发送后3天以上无回复,发第三封并标记完成 MailApp.sendEmail(email, subject3, body3); sheet.getRange(i + 2, 3).setValue(new Date()); Utilities.sleep(1000); } } }
4. 表格结构优化建议
原表格仅用B列记录发送时间无法区分邮件阶段,建议调整:
- A列:客户邮箱
- B列:第一封邮件发送时间
- C列:客户回复时间戳
- D列:第二封邮件发送时间
- E列:第三封邮件发送时间
这样能更清晰追踪每个邮件节点,也方便脚本逻辑判断。
内容的提问来源于stack exchange,提问作者Eric Morandeau
相关产品推荐
相关产品推荐

