Google Sheets使用Apps Script向对应代理发送带抄送的定制报告问题
修正方案
核心问题根因
你对数据只取1行的判断是正确的,getRange(行起始位置, 列起始位置, 总行数, 总列数) 中第三个参数你设置为1,仅读取第1行数据,同时原代码存在三个额外问题:
- 未将每行的产品参数传递给HTML模板,导致所有邮件内容一致
row[mail]写法错误,mail为未定义变量,需要替换为邮箱所在列的数字索引(列索引从0开始计数,A列对应0、B列对应1,以此类推)- cc字段写死为固定值,无法匹配不同代理的抄送需求
前置准备
先确认你的Request工作表列结构,参考示例列顺序如下(可根据你实际的表格调整对应索引):
| 列号 | 列内容 | 对应索引 |
|---|---|---|
| A | 代理主收件邮箱 | 0 |
| B | 该代理专属抄送邮箱 | 1 |
| C | 代理负责产品名称 | 2 |
| D | 产品详情内容 | 3 |
注:第一行为表头,实际数据从第二行开始
修正后完整代码
function myFunction() { var ws = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("Request"); // 读取所有有效数据:从第2行第1列开始,行数为总行数-1(跳过表头),列数为总列数 var data = ws.getRange(2, 1, ws.getLastRow()-1, ws.getLastColumn()).getValues(); data.forEach(function(row){ // 每次循环读取新的模板实例,避免参数覆盖 var emailTemp = HtmlService.createTemplateFromFile("responsing"); // 给模板传递当前行的产品参数 emailTemp.productName = row[2]; emailTemp.productDetail = row[3]; // 渲染模板得到专属HTML内容 var htmlMessage = emailTemp.evaluate().getContent(); // 发送邮件,取当前行的主收件邮箱和抄送邮箱 GmailApp.sendEmail( row[0], "Report", "Your browser doesn't support HTML", {name:"VUC-GISOCC", htmlBody:htmlMessage, cc: row[1] || "" } ); }); }
HTML模板调整说明
你需要在responsing.html文件中对应位置插入占位符,即可调用代码中传递的参数,示例模板内容参考:
<!DOCTYPE html> <html> <body> <p>您好:</p> <p>这是您负责的产品*<?= productName ?>*的专属报告:</p> <div><?= productDetail ?></div> <p>如有疑问请联系运营团队。</p> </body> </html>
注意事项
- 如果你的表格列顺序和示例不一致,只需调整代码中
row[n]的n为对应列的索引即可 - 首次运行脚本需要根据提示完成Sheet读取、Gmail发送的权限授权
- 正式批量发送前建议先将
row[0]替换为自己的测试邮箱,验证内容、收件人、抄送规则是否符合预期
内容的提问来源于stack exchange,提问作者Moses
相关产品推荐
相关产品推荐

