Google表格脚本发邮件报错Failed to send email: no recipient
问题根因
sheet.getLastRow()会将带有格式残留、编辑痕迹的空白行计入统计,导致代码读取到空的收件人地址,触发Failed to send email: no recipient报错。
修复方案(仅给最后一条有效记录发邮件)
从A列(邮箱列)底部向上遍历,定位到第一个存在有效邮箱地址的行后再读取数据发件,直接替换原有主逻辑代码即可:
function sender_mail(adress, name, chpri, chteh, chch, chzsis, chho) { MailApp.sendEmail({ to: adress, subject: "Результат по опросу на профориентацию для " + name, htmlBody: "Здравствуйте предлагаем вам результат опроса на профориентацию" + "<br><br>" + "Человек-природа: " + chpri + "<br>" + "Человек-техника: " + chteh + "<br>" + "Человек-человек: " + chch + "<br>" + "Человек-знаковая система: " + chzsis + "<br>" + "Человек-художественный образ: " + chho + "<br>" + "- «Человек-Природа» - все профессии, связанные с растениеводством,животноводством, лесным хозяйством, с охраной окружающей среды." + "<br>" + "- «Человек-Техника» - все профессии, связанные с техникой." + "<br>" + "- «Человек-Человек» - все профессии, связанные с обслуживанием людей." + "<br>" + "- «Человек-Знаковая система» - все профессии, связанные с подсчетами, цифровыми и буквенными знаками." + "<br>" + "- «Человек-Художественный образ» - все творческие специальности." + "<br>" }); } function sendLastValidMail() { const ss = SpreadsheetApp.getActiveSpreadsheet(); const sheet = ss.getSheetByName('mail'); const lastRow = sheet.getLastRow(); let validRowIndex = 0; // 从最后一行往上查找有效邮箱行,i初始值为2代表跳过第1行表头,无表头可改为i=1 for (let i = lastRow; i >= 2; i--) { const addr = sheet.getRange(i, 1).getValue().toString().trim(); // 校验非空且包含@符号,过滤无效内容 if (addr && addr.includes('@')) { validRowIndex = i; break; } } // 未找到有效收件人直接终止运行 if (!validRowIndex) return; // 读取有效行数据发件 const rowData = sheet.getRange(validRowIndex, 1, 1, 7).getValues()[0]; sender_mail(rowData[0], rowData[1], rowData[2], rowData[3], rowData[4], rowData[5], rowData[6]); }
扩展方案(批量给所有有效行发邮件)
如果需要给表格内所有有效记录批量发邮件,可一次性读取整段数据后逐行校验收件人有效性,跳过空白/无效行,执行效率更高:
function sendBatchValidMails() { const ss = SpreadsheetApp.getActiveSpreadsheet(); const sheet = ss.getSheetByName('mail'); const lastRow = sheet.getLastRow(); // 从第2行开始读取7列数据,跳过表头 const allData = sheet.getRange(2, 1, lastRow - 1, 7).getValues(); allData.forEach(row => { const addr = row[0].toString().trim(); // 收件人无效直接跳过当前行 if (!addr || !addr.includes('@')) return; sender_mail(row[0], row[1], row[2], row[3], row[4], row[5], row[6]); }) }
注意:如果你的表格没有表头,把代码里遍历起始行
i >= 2、读取范围的起始行2改成对应起始行号即可。
内容的提问来源于stack exchange,提问作者Nuar Fran
相关产品推荐
相关产品推荐

