
在使用google apps script构建自动化邮件系统时,我们经常需要从google表格中读取文本内容并将其嵌入到html格式的邮件中。一个常见的问题是,当表格单元格中的文本包含换行符(\n)时,我们通常会尝试将其替换为html的换行标签<br />以便在邮件中正确显示。然而,在通过htmlservice.createtemplatefromfile()和evaluate().getcontent()生成最终html内容时,这些<br />标签可能会被转义成html实体(例如
),导致邮件中直接显示文本hello<br />i'm here!而不是实际的换行。
这个问题产生的原因在于HtmlService.evaluate().getContent()方法在处理模板变量时,出于安全考虑,默认会将HTML特殊字符进行转义,以防止跨站脚本攻击(XSS)。这意味着,即使你在Apps Script代码中明确地将\n替换为<br />,当这些内容被注入到HTML模板并通过evaluate().getContent()处理时,<和>字符也会被转义。
解决此问题的核心思路是在evaluate().getContent()生成最终HTML字符串之后,手动将其中被转义的HTML实体(特别是)还原为实际的<和>字符。这样,原本被转义的<br />标签就能恢复其应有的功能。
我们将通过修改sendMail函数来实现这一目标。
首先,我们来看一下原始的Apps Script代码片段,其中尝试将换行符转换为<br />:
立即学习“前端免费学习笔记(深入)”;
// splitTest 函数用于从B4单元格获取文本并按换行符分割
function splitTest() {
var ss = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("Settings");
var str = ss.getRange("B4").getValue(); // 假设B4单元格内容为 "Hello\nI'm here!"
Logger.log(str); // 输出: Hello\nI'm here!
var array1 = str.split("\n"); // 分割成 ["Hello", "I'm here!"]
return array1;
}
// sendMail 函数负责发送邮件
function sendMail() {
// ... 其他变量和设置 ...
var wsSettings = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("Settings");
var name = wsSettings.getRange("B2").getValue();
var subject = wsSettings.getRange("B1").getValue();
var array1 = splitTest();
var cMessage = array1.join("<br />"); // 此时 cMessage 为 "Hello<br />I'm here!"
var emailTemp = HtmlService.createTemplateFromFile("email");
// ... 填充模板变量 ...
emailTemp.cmess = cMessage;
var htmlMessage = emailTemp.evaluate().getContent(); // 此时 htmlMessage 中的 <br /> 已被转义为 <br />
// ... 其他邮件发送逻辑 ...
// 错误的发送方式,htmlMessage中的<br/>未被识别
// GmailApp.sendEmail(
// row[email],
// subject,
// "Bitte öffnen Sie das Html-Format,um die Email zu lesen, Danke!",
// {name: name,
// htmlBody: htmlMessage,
// });
}为了解决上述问题,我们需要在htmlMessage生成之后,但在发送邮件之前,对其进行字符串替换操作。
function sendMail() {
var ename = 3;
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 array1 = splitTest();
var cMessage = array1.join("<br />"); // 此时 cMessage 是 "Hello<br />I'm here!"
var data = ws.getRange("A2:G" + ws.getLastRow()).getValues();
data = data.filter(function(r){ return r[6] == true});
// 在循环外处理模板,避免重复 evaluate() 和 replace()
emailTemp.cmess = cMessage; // 将带有 <br /> 的内容赋值给模板变量
var htmlContentRaw = emailTemp.evaluate().getContent(); // 获取被转义的HTML内容
// 核心解决方案:还原HTML实体
var htmlContentUnescaped = htmlContentRaw.replace(/</g, "<");
htmlContentUnescaped = htmlContentUnescaped.replace(/>/g, ">");
data.forEach(function(row){
GmailApp.sendEmail(
row[email],
subject,
"Bitte öffnen Sie das Html-Format,um die Email zu lesen, Danke!",
{name: name,
htmlBody: htmlContentUnescaped, // 使用还原后的HTML内容
});
});
}HTML模板文件(例如email.html)中接收cmess变量的部分保持不变。重要的是,white-space:pre-line;样式可以帮助处理文本中的原始换行符(\n),但对于被HtmlService转义的<br />标签则无效,因此仍需Apps Script进行处理。
<html>
<head>
<base target="_top">
</head>
<body>
<!-- ... 其他HTML结构 ... -->
<p style="line-height: 1.2; margin-top: 0pt; margin-bottom: 0pt; white-space:pre-line;"><span style="font-size: 11pt; font-family: Arial;">
<?= cmess ?>
</span></p>
<!-- ... 其他HTML结构 ... -->
</body>
</html>通过在Apps Script中对HtmlService.evaluate().getContent()的输出进行后处理,将等HTML实体还原为实际的HTML标签,我们可以有效解决从Google表格中获取的带换行符的文本在HTML邮件中显示异常的问题。这种方法提供了一个实用且可控的方案,确保自动化邮件系统能够按照预期呈现丰富的文本内容。在实施时,务必考虑内容的来源和潜在的安全风险,并进行适当的测试。
以上就是解决Google Apps Script发送HTML邮件中换行符显示异常问题的详细内容,更多请关注php中文网其它相关文章!
HTML怎么学习?HTML怎么入门?HTML在哪学?HTML怎么学才快?不用担心,这里为大家提供了HTML速学教程(入门课程),有需要的小伙伴保存下载就能学习啦!
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号