Google表格自动发邮件报错:Failed to send email: no recipient
问题修复:处理空白/无效邮箱避免发送失败
你遇到的Failed to send email: no recipient错误确实是因为脚本尝试发送到空白邮箱地址导致的——GmailApp.sendEmail不允许空字符串作为收件人参数。下面是修复后的代码,同时优化了性能并添加了邮箱有效性验证:
function sendemails() { const ss = SpreadsheetApp.getActiveSpreadsheet(); const emailSheet = ss.getSheetByName("Emails"); const templateText = ss.getSheetByName("Template").getRange(1,1).getValue(); const lr = emailSheet.getLastRow(); // 邮箱列的索引(从1开始) const emailColumns = [6,8,10,12,14,16,18,20,22,24]; for (let i = 3; i <= lr; i++) { // 一次性获取整行数据,提升性能 const rowData = emailSheet.getRange(i, 1, 1, 24).getValues()[0]; const Student = rowData[1]; // 第2列(数组索引从0开始) const ParentName = rowData[2]; // 第3列 const messageBody = templateText.replace("{StudentName}", Student).replace("{Parent}", ParentName); const subjectLine = "Sweetwater Elementary Light It Up! Fundraiser from " + Student; // 遍历所有邮箱列 for (const col of emailColumns) { const email = rowData[col - 1]; // 列索引转数组索引(减1) // 验证邮箱非空且格式有效 if (validateEmail(email)) { GmailApp.sendEmail(email, subjectLine, messageBody); } } } } // 邮箱格式验证函数 function validateEmail(email) { // 非空且符合基本邮箱格式规则 return email && /^[^\s@]+@[^\s@]+\.[^\s@]+$/.test(email); }
关键改进说明
- 拦截无效收件人:通过
validateEmail函数先检查邮箱是否非空、格式合法,只有通过验证的邮箱才会执行发送操作,从根源避免“no recipient”错误 - 优化执行效率:用一次性获取整行数据的方式,替代原代码中多次单独调用
getRange,大幅减少Spreadsheet API请求次数,运行速度更快 - 简化代码结构:把分散的邮箱变量改成数组循环,避免重复的发送代码,后续新增/调整邮箱列只需修改数组即可,更易维护
内容的提问来源于stack exchange,提问作者Sweetwater PTO
相关产品推荐
相关产品推荐

