Google Sheets Apps Script生日提醒:设置排除寿星的团队收件人
解决生日提醒程序的收件人筛选与多寿星处理问题
修改后的完整代码
function main() { var sheet = SpreadsheetApp.getActive().getSheetByName("Geburtstage"); var numRows = sheet.getLastRow(); // 加载所有成员数据(第2行到最后一行,4列) var allMembers = sheet.getRange(2, 1, numRows - 1, 4).getValues(); // 1. 提取所有成员邮箱,同时构建姓名-邮箱映射表 var allEmails = []; var nameToEmail = {}; allMembers.forEach(member => { var name = member[0]; var email = member[2]; allEmails.push(email); nameToEmail[name] = email; }); // 2. 收集今天所有过生日的成员 var todaysBirthdayPeople = []; allMembers.forEach(member => { var name = member[0]; var birthday = member[3]; if (isBirthdayToday(birthday)) { todaysBirthdayPeople.push(name); } }); // 3. 如果今天有寿星,发送提醒邮件 if (todaysBirthdayPeople.length > 0) { // 生成排除所有寿星的收件人列表 var recipients = allEmails.filter(email => { return !todaysBirthdayPeople.some(name => nameToEmail[name] === email); }).join(","); // 构建邮件内容(支持多个寿星的情况) var subject = "Geburtstagerinnerung: " + todaysBirthdayPeople.join(", "); var body; if (todaysBirthdayPeople.length === 1) { body = `${todaysBirthdayPeople[0]} hat heute Geburtstag!`; } else { body = `Heute haben folgende Kollegen Geburtstag: ${todaysBirthdayPeople.join(", ")}!`; } // 发送邮件(确保有收件人时才执行) if (recipients) { MailApp.sendEmail(recipients, subject, body); } } } // 检查生日是否为当天 function isBirthdayToday(birthday) { var today = new Date(); return today.getDate() === birthday.getDate() && today.getMonth() === birthday.getMonth(); }
关键逻辑说明
- 预加载全量成员数据:一次性读取所有成员信息,构建邮箱列表和姓名-邮箱映射表,避免循环中重复操作表格,提升效率的同时方便后续筛选。
- 批量收集当日寿星:先遍历所有成员筛选出当天过生日的人,统一处理而非逐个发送,自然解决多人同日生日的场景,避免重复发送冗余邮件。
- 精准筛选收件人:使用
filter方法从全量邮箱列表中排除所有寿星的邮箱,再转为邮件服务支持的逗号分隔字符串,确保不会给寿星本人发提醒。 - 适配多寿星的邮件内容:根据当日寿星数量动态调整邮件主题和正文,让提醒信息更清晰直观。
- 避免无效发送:添加收件人非空判断,防止全员都是寿星时发送空收件人的无效邮件。
内容的提问来源于stack exchange,提问作者Domdaniel
相关产品推荐
相关产品推荐

