Google Apps Script邮件合并:如何保留表格数据的换行格式?
解决Google Sheets邮件合并中保留单元格换行的问题
问题背景
我在修改Martin Hawksey的Google Sheets+Gmail邮件合并脚本时遇到问题:表格单元格内的换行格式(比如手动输入的换行、或包含<br>的内容),发送到邮件后会丢失,变成无换行的一行文本。我尝试修改了列定义和替换逻辑,但没有效果。
问题根源
- 数据获取丢失换行:脚本原用
getDisplayValues()获取单元格内容,该方法会将单元格内的换行转换为空格,导致原始换行信息丢失。 - 转义函数干扰:内置的
escapeData_函数会把\n转义为\\n,使HTML邮件无法识别换行符。 - 未区分邮件格式:仅将换行替换为
\n\n只对纯文本邮件有效,HTML邮件需要将换行转换为<br>标签才能生效。
解决方案
1. 修改数据获取逻辑
将getDisplayValues()替换为getValues(),保留单元格原始内容(包括换行符):
// 替换原数据获取代码 const data = dataRange.getValues();
2. 针对纯文本/HTML分别处理换行
在循环处理每行数据时,为两种邮件格式分别生成带换行的内容:
// 替换原row处理代码段 obj.forEach(function(row, rowIdx){ if (row[EMAIL_SENT_COL] == ''){ try { const targetCol = "column details"; // 替换为你的目标列名 // 纯文本邮件:换行转成双换行 row[`${targetCol}_PLAIN`] = row[targetCol].replace(/\n/g, '\n\n'); // HTML邮件:换行转成<br>标签 row[`${targetCol}_HTML`] = row[targetCol].replace(/\n/g, '<br>'); const msgObj = fillInTemplateFromObject_(emailTemplate.message, row); GmailApp.sendEmail(row[RECIPIENT_COL], msgObj.subject, msgObj.text, { htmlBody: msgObj.html, attachments: emailTemplate.attachments, inlineImages: emailTemplate.inlineImages }); out.push([new Date()]); } catch(e) { out.push([e.message]); } } else { out.push([row[EMAIL_SENT_COL]]); } });
3. 调整模板占位符
在Gmail草稿模板中,纯文本部分使用{{column details_PLAIN}},HTML部分使用{{column details_HTML}}(将column details替换为你的实际列名)。
4. 修改转义函数
去掉对\n的转义,避免换行符被破坏:
function escapeData_(str) { return str .replace(/[\\]/g, '\\\\') .replace(/[\"]/g, '\\\"') .replace(/[\/]/g, '\\/') .replace(/[\b]/g, '\\b') .replace(/[\f]/g, '\\f') // 移除该行,保留原始换行符 // .replace(/[\n]/g, '\\n') .replace(/[\r]/g, '\\r') .replace(/[\t]/g, '\\t'); };
注意事项
- 若单元格内已包含
<br>标签,可跳过HTML格式的换行替换逻辑。 - 确保模板占位符与代码中生成的字段名完全匹配,否则替换不会生效。
内容的提问来源于stack exchange,提问作者S C
相关产品推荐
相关产品推荐

