Javascript padStart()在弹窗生效但Dynamics 365 CRM邮件记录不生效问题
问题原因与解决方案
根本原因
你拼接的是纯文本字符串,但CRM生成的邮件默认以HTML格式渲染,HTML规范会自动合并所有连续的空白字符(普通空格、换行符\n、制表符等),仅显示为单个空格,所以padStart添加的连续空格会被吞掉。alert弹窗走的是纯文本渲染逻辑,所以可以正常显示空格。
可行解决思路
方案1:替换为HTML不换行空格(改造成本最低)
把padStart填充的普通空格替换为HTML的不换行空格实体 ,同时把换行符\n替换为HTML换行标签<br>,即可保留空格和换行效果。
修改后代码示例:
for(var i = 0; i < ltRecordSnsAndLocations.length; i++) { if(i < ltRecordSnsAndLocations.length - 1) { injectionString += (i+1).toString() + ". " + ltRecordSnsAndLocations[i][0].toString() + String("System Location: ").padStart(String("System Location: ").length+10,' ') + ltRecordSnsAndLocations[i][1].toString() + "<br>"; } }
注意:如果你的CRM写入邮件时会自动转义HTML实体,需要切换使用CRM提供的「不转义HTML内容」的写入参数/接口,避免 被转义为普通文本显示。
方案2:用HTML表格排版(兼容性最好,排版更整齐)
如果需要严格对齐,推荐直接拼接HTML表格来实现间距控制,不用硬凑空格,不会因为邮件客户端字体宽度不同导致对齐错位:
// 先拼接表格头部 injectionString += "<table style='border:none;border-collapse:collapse;'>"; for(var i = 0; i < ltRecordSnsAndLocations.length; i++) { if(i < ltRecordSnsAndLocations.length - 1) { injectionString += "<tr><td style='padding:0;border:none;'>" + (i+1).toString() + ". " + ltRecordSnsAndLocations[i][0].toString() + "</td><td style='padding:0 0 0 30px;border:none;'>System Location: " + ltRecordSnsAndLocations[i][1].toString() + "</td></tr>"; } } injectionString += "</table>";
这里通过<td>的左内边距padding-left控制间距,30px的宽度大致等于10个空格的宽度,你可以根据需要调整数值。
方案3:切换邮件为纯文本模式
如果你的CRM支持设置邮件内容类型,把邮件的内容格式从默认的HTML改为text/plain,原有拼接的纯文本空格和换行就可以直接保留,无需修改字符串拼接逻辑,缺点是无法使用任何富文本格式。
内容的提问来源于stack exchange,提问作者J.S.Orris
相关产品推荐
相关产品推荐

