求助:基于邮箱域名的Google Apps Script条件邮件回复脚本编写
如何在Google Apps Script中根据邮箱域名分支发送不同邮件
我来帮你搞定这个if/else分支逻辑,其实核心步骤就是获取用户提交的邮箱地址→检查域名是否在禁用列表→根据结果调用不同的邮件发送函数。下面是具体的修改方案:
第一步:准备工作
首先,你需要:
- 确认电子表格中存储用户邮箱的列名(比如叫「邮箱」,请替换成你实际的表头名称)
- 整理好需要禁用的域名列表
第二步:修改后的完整代码
我重构了你的原有代码,添加了分支判断逻辑,同时保留了所有原有功能:
// 全局配置:根据你的实际情况修改 var formID = 'FormID'; var sheetName = 'Form Responses'; var columnNameEditUrl = 'Edit Url'; var columnNameEmail = '邮箱'; // 替换成你表单里的邮箱列表头 var startRow = 2; const blockedDomains = ['domain1.com', 'domain2.com']; // 禁用域名列表,可按需添加 // 主函数:表单提交后触发,先更新编辑链接,再判断发送邮件 function expCalc(){ // 先确保编辑链接已写入表格,同时获取最新的编辑链接 const editUrl = getEditResponseUrls(); // 获取最新提交的用户邮箱地址 const userEmail = getUserEmail(); // 核心分支判断逻辑 if (isBlockedDomain(userEmail)) { // 禁用域名:发送引导修改邮箱的邮件(带编辑链接) ReplyEmail1(userEmail, editUrl); } else { // 正常域名:发送带PDF附件的邮件 ReplyEmail2(userEmail); } } // 获取最新提交的用户邮箱地址 function getUserEmail() { var sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName(sheetName); var headers = sheet.getRange(1, 1, 1, sheet.getLastColumn()).getValues()[0]; var emailColumnIndex = headers.indexOf(columnNameEmail); // 读取表格最后一行(最新表单提交)的邮箱值 return sheet.getRange(sheet.getLastRow(), emailColumnIndex + 1).getValue(); } // 检查邮箱是否属于禁用域名 function isBlockedDomain(email) { if (!email) return false; // 空邮箱直接跳过判断 const domain = email.split('@')[1]?.toLowerCase(); // 提取@后的域名并转小写,避免大小写判断误差 return blockedDomains.includes(domain); } // 原有功能:更新编辑链接,返回最新的编辑链接(优化为只处理最新一行,提升性能) function getEditResponseUrls(){ var sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName(sheetName); var headers = sheet.getRange(1, 1, 1, sheet.getLastColumn()).getValues()[0]; var columnIndex = headers.indexOf(columnNameEditUrl); var lastRow = sheet.getLastRow(); var data = sheet.getRange(lastRow, 1, 1, sheet.getLastColumn()).getValues()[0]; var editResponseUrl = ''; if(data[0] != '' && data[columnIndex] == '') { var timestamp = data[0]; var form = FormApp.openById(formID); var formSubmitted = form.getResponses(timestamp); if(formSubmitted.length > 0) { editResponseUrl = formSubmitted[0].getEditResponseUrl(); sheet.getRange(lastRow, columnIndex + 1).setValue(editResponseUrl); } } else { // 如果已经存在编辑链接,直接读取返回 editResponseUrl = data[columnIndex]; } return editResponseUrl; } // 发送引导修改邮箱的邮件(带编辑链接) function ReplyEmail1(toEmail, editUrl) { const subject = "请修改您的表单邮箱地址"; const htmlBody = ` <p>您好,您提交的邮箱域名不符合要求,请点击下方链接修改表单邮箱:</p> <p><a href="${editUrl}">修改我的表单提交</a></p> `; MailApp.sendEmail({ to: toEmail, subject: subject, htmlBody: htmlBody }); } // 发送带PDF附件的邮件(原有功能,调整为动态接收用户邮箱) var htmlBody = HtmlService.createHtmlOutputFromFile('mail_template').getContent(); var file1 = DriveApp.getFileById('File id1'); var file2 = DriveApp.getFileById('File id2'); function ReplyEmail2(toEmail) { MailApp.sendEmail({ to: toEmail, subject: "提交成功", htmlBody: htmlBody, attachments: [file1.getAs(MimeType.PDF), file2.getAs(MimeType.PDF)] }); }
关键逻辑说明
- 获取用户邮箱:
getUserEmail函数通过表头匹配找到邮箱列,直接读取表格最后一行的邮箱值(表单提交后最新数据默认在最后一行)。 - 域名判断:
isBlockedDomain函数拆分邮箱地址提取域名,转小写后检查是否在禁用列表中,避免大小写导致的判断误差。 - 分支执行:主函数
expCalc先确保编辑链接已生成,再根据域名判断结果调用对应的邮件函数,逻辑清晰。 - 邮件函数优化:把两个邮件函数改成接收动态参数(用户邮箱、编辑链接),避免硬编码收件人,适配不同场景。
注意事项
- 请务必把
columnNameEmail替换成你电子表格中实际的邮箱列表头。 - 如果需要新增禁用域名,直接在
blockedDomains数组里添加即可。 - 如果你的表单是通过「提交时触发函数」运行,记得把触发器绑定到
expCalc上。
内容的提问来源于stack exchange,提问作者BMulf
相关产品推荐
相关产品推荐

