Apps Script发送HTML邮件时如何实现Spreadsheet单元格内容换行
问题根因
Google Apps Script HTML模板的<?= 变量 ?>输出语法默认会对内容中的HTML特殊字符做转义处理,你手动拼接的<br />标签会被转义为普通文本实体,最终在邮件里以明文形式显示,无法被解析为HTML换行标签。
解决方案
两种方案选其一即可,优先选第一种,稳定性更高:
方案1(推荐):利用现有CSS样式自动识别换行,无需手动替换标签
你的HTML模板中承载cmess内容的p标签已经添加了white-space:pre-line;样式,该样式原生支持将文本中的\n换行符直接渲染为页面换行,完全不需要额外把换行符替换为<br />。
操作步骤:- 删除冗余的
splitTest()函数 - 移除
sendMail()函数中调用splitTest、用<br />拼接数组的逻辑,直接读取Settings工作表B4的原始文本赋值给模板变量即可 - 模板中保持
<?= cmess ?>的写法不变,默认的转义逻辑还能避免文本中的特殊字符破坏邮件HTML结构
- 删除冗余的
方案2:改用非转义模板输出语法
如果你坚持要手动拼接<br />标签实现换行,只需要把HTML模板中输出cmess的代码从<?= cmess ?>修改为<?!= cmess ?>即可。语法中增加的感叹号代表强制不转义输出内容,你拼接的<br />标签会被正常解析为HTML元素。注意:该方案下如果文本中包含未处理的HTML特殊字符,可能导致邮件排版错乱,非必要不选。
修正后核心代码(方案1)
function sendMail() { var ename = 3; // 字段对应列号,首列从0开始计数 var cname = 2; var email = 5; var emailTemp = HtmlService.createTemplateFromFile("email"); var ws = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("Recipients"); var wsSettings = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("Settings"); var name = wsSettings.getRange("B2").getValue(); var subject = wsSettings.getRange("B1").getValue(); // 直接读取带原始换行符的文本,无需额外替换 var cMessage = wsSettings.getRange("B4").getValue(); var data = ws.getRange("A2:G" + ws.getLastRow()).getValues(); data = data.filter(function(r){ return r[6] == true}); // 筛选勾选了复选框的收件人 data.forEach(function(row){ emailTemp.cmess = cMessage; var htmlMessage = emailTemp.evaluate().getContent(); GmailApp.sendEmail( row[email], subject, "Bitte öffnen Sie das Html-Format,um die Email zu lesen, Danke!", { name: name, htmlBody: htmlMessage } ); }); };
HTML模板无需任何修改,原有样式和输出逻辑可以直接复用。
内容的提问来源于stack exchange,提问作者Chinese Formosa
相关产品推荐
相关产品推荐

