基于Google Sheets数据的Apps Script发送Gmail无报错但失败
Google Sheets邮件发送脚本故障排查与修复
问题背景
我需要实现自动给Google表格中的收件人列表发送邮件,作为Apps Script和JavaScript新手,跟着教程写了对应代码,但给自己测试时,脚本执行无报错却收不到邮件。
表格结构与规则
表格列说明
| 行号 | A列(People) | B列(Send) | C列(Email) | D列(Subject) | E列(Body) | F列(Blind Carbon Copy) |
|---|---|---|---|---|---|---|
| 1 | 姓名 | 发送(复选框) | 邮箱地址 | 邮件主题 | 邮件正文 | 密送地址 |
| 2 | name01 | ☑ | email01 | subject01 | body01 | common_bcc_address |
| 3 | name02 | ☑ | email02 | subject02 | body02 | |
| 4 | name03 | ☐ | email03 | subject03 | body03 |
规则
- 所有邮件共用F2单元格的BCC地址
- 仅B列复选框勾选时,发送该行对应邮件
- 工作表名称为
People1
原脚本代码
function sendEmails() { var ss = SpreadsheetApp.getActiveSpreadsheet().getSheetByName('People1'); var values = ss.getDataRange().getValues(); var ebcc = ss.getRange(2, 6).getValue() for (var i = 0; i > values.length ;i++){ if (values[i][3] == true) { var theEmail = ss.getRange(i,3).getValue(); var theSubject = ss.getRange(i,4).getValue(); var theBody = ss.getRange(i,5).getValue(); GmailApp.sendEmail(theEmail, theSubject, theBody, {bcc: ebcc}) } } }
问题分析
脚本执行无报错但不发送邮件,核心问题有三个:
- 循环条件逻辑颠倒:
i > values.length导致循环从一开始就不执行,正确条件应为i < values.length - 数组索引错误:
- B列(复选框)对应数组下标为
1(数组从0开始计数),原脚本中values[i][3]取的是D列(主题)的值,和复选框无关 - 表格第1行是表头,数据从第2行开始,循环应从
i=1开始(对应表格行号2)
- B列(复选框)对应数组下标为
- 单元格读取方式低效且错误:循环内重复调用
getRange,且行号索引错误(数组下标i对应表格行号应为i+1),导致读取到错误单元格
修复后的脚本
function sendEmails() { // 获取指定工作表 var sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName('People1'); // 获取所有单元格数据(二维数组) var data = sheet.getDataRange().getValues(); // 读取F2单元格的共用BCC地址(表格行2列6,对应数组索引[1][5]) var commonBcc = data[1][5]; // 从第2行数据开始循环(跳过表头行) for (var i = 1; i < data.length; i++) { var row = data[i]; // 检查B列复选框是否勾选 var shouldSend = row[1]; if (shouldSend === true) { // 从数组中读取当前行的邮件信息 var recipient = row[2]; // C列:邮箱地址 var subject = row[3]; // D列:邮件主题 var body = row[4]; // E列:邮件正文 // 发送邮件,附带BCC参数 GmailApp.sendEmail(recipient, subject, body, {bcc: commonBcc}); } } }
验证步骤
- 首次运行脚本时,完成Gmail和Google Sheets的授权流程
- 将表格中某行的邮箱地址改为自己的邮箱,勾选对应B列复选框
- 运行脚本后,检查收件箱(若未收到,查看垃圾邮件箱)
- 确认F2单元格的BCC地址格式正确,若不需要BCC,可将参数改为
{bcc: commonBcc || ''}避免空值问题
内容的提问来源于stack exchange,提问作者Mikołaj Gano
相关产品推荐
相关产品推荐

