Google Apps Script发邮件时\n致网页端文本截断问题求助
邮件文本网页端截断问题解决方案
功能说明
以下Google Apps Script代码功能运行正常:
function sendEmails() { var spreadsheet = SpreadsheetApp.getActiveSpreadsheet(); var sheet = spreadsheet.getSheetByName("Active"); var startRow = 2; var numRows = sheet.getLastRow() - 1; var dataRange = sheet.getRange(startRow, 1, numRows, 6); // 提取前6列,包含时间戳列 var data = dataRange.getValues(); var folderId = 'xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx'; var folder = DriveApp.getFolderById(folderId); var files = folder.getFilesByName('xxxxxxxxxxxxxxxxxxxxxxxxxxxxx.pdf'); if (!files.hasNext()) { Logger.log('未找到文件。'); return; } var file = files.next(); var message = sheet.getRange("H2").getValue(); // 从H2单元格提取邮件内容 var sentEmails = {}; // 记录已发送的邮箱 // 按域名分组邮箱 var emailsByDomain = {}; for (var i = 0; i < data.length; ++i) { var row = data[i]; var emailAddress = row[4]; // E列的邮箱地址 var timestamp = row[5]; // F列的时间戳 // 如果已有时间戳、邮箱为空或格式无效则跳过 if (timestamp || !emailAddress || emailAddress.indexOf('@') === -1) { continue; } var domain = emailAddress.split('@')[1]; if (!emailsByDomain[domain]) { emailsByDomain[domain] = []; } emailsByDomain[domain].push({ row: i, email: emailAddress }); } // 处理每个域名 for (var domain in emailsByDomain) { // 过滤已发送的邮箱 var unsentEmails = emailsByDomain[domain].filter(emailInfo => !sentEmails[emailInfo.email]); // 如果该域名下所有邮箱都已发送则跳过 if (unsentEmails.length === 0) continue; var emailToSend = unsentEmails[Math.floor(Math.random() * unsentEmails.length)]; // 随机选择一个邮箱 var name = data[emailToSend.row][3]; // 选中行的姓名 var personalizedMessage = message.replace("{name}", name); var emailAddress = emailToSend.email; var subject = "xxxxxxxxxxxxxxxxxxxxxxxxxxxxx"; var options = { attachments: [file.getAs(MimeType.PDF)] }; try { MailApp.sendEmail(emailAddress, subject, personalizedMessage, options); Logger.log("已发送邮件至 " + name + " (" + emailAddress + ")"); // 发送后将该行背景设为浅绿色 sheet.getRange(startRow + emailToSend.row, 1, 1, sheet.getLastColumn()).setBackgroundRGB(200, 255, 200); // 更新F列的日期 var dateCell = sheet.getRange(startRow + emailToSend.row, 6); // F列是第6列 dateCell.setValue(new Date()); // 标记该邮箱已发送 sentEmails[emailAddress] = true; } catch (e) { Logger.log("发送邮件至 " + name + " (" + emailAddress + ") 失败:" + e.message); } } }
输入说明
输入为Google Sheets的「Active」标签页,表格结构如下:
| A列 | B列 | C列 | D列 | E列 | F列 | ... | H列 |
|---|---|---|---|---|---|---|---|
| COMPANY | SALUTE | LAST | FIRST | Emailed on | Message |
问题描述
代码从H2单元格提取邮件内容并发送至E列邮箱,但发送过程中自动插入\n,导致邮件在移动端显示正常,但网页端文本被截断。已尝试以下两种方案均未解决:
- 将文本放在单个单元格而非范围中
- 强制移除所有
\n
实际效果:所有文本被限制在固定宽度的深色区域;预期效果:文本可自适应浅色区域宽度自动换行。
解决方案
问题根源
MailApp.sendEmail默认发送纯文本邮件,网页端邮件客户端会将纯文本中的换行(包括单元格自动换行生成的\n)解析为硬换行,强制文本在固定位置换行,导致内容被截断。
修改代码
将邮件改为HTML格式发送,让文本自适应容器宽度自动换行。修改核心代码如下:
- 生成个性化HTML内容,添加自适应样式:
var name = data[emailToSend.row][3]; var personalizedMessage = message.replace("{name}", name); // 将纯文本转换为带自适应样式的HTML var personalizedHtmlMessage = `<div style="white-space: pre-wrap; word-wrap: break-word;">${personalizedMessage.replace(/\n/g, '<br>')}</div>`;
- 更新邮件发送选项,指定HTML内容:
var options = { attachments: [file.getAs(MimeType.PDF)], htmlBody: personalizedHtmlMessage, plainTextBody: personalizedMessage // 兼容不支持HTML的邮件客户端 };
修改后完整发送逻辑代码段
var emailToSend = unsentEmails[Math.floor(Math.random() * unsentEmails.length)]; var name = data[emailToSend.row][3]; var personalizedMessage = message.replace("{name}", name); // 生成自适应HTML邮件内容 var personalizedHtmlMessage = `<div style="white-space: pre-wrap; word-wrap: break-word;">${personalizedMessage.replace(/\n/g, '<br>')}</div>`; var emailAddress = emailToSend.email; var subject = "xxxxxxxxxxxxxxxxxxxxxxxxxxxxx"; var options = { attachments: [file.getAs(MimeType.PDF)], htmlBody: personalizedHtmlMessage, plainTextBody: personalizedMessage }; try { MailApp.sendEmail(emailAddress, subject, personalizedMessage, options); Logger.log("已发送邮件至 " + name + " (" + emailAddress + ")"); sheet.getRange(startRow + emailToSend.row, 1, 1, sheet.getLastColumn()).setBackgroundRGB(200, 255, 200); var dateCell = sheet.getRange(startRow + emailToSend.row, 6); dateCell.setValue(new Date()); sentEmails[emailAddress] = true; } catch (e) { Logger.log("发送邮件至 " + name + " (" + emailAddress + ") 失败:" + e.message); }
样式说明
white-space: pre-wrap:保留原文本中的换行格式,同时允许文本超出容器宽度时自动换行word-wrap: break-word:长单词或URL会被拆分换行,避免溢出容器
内容的提问来源于stack exchange,提问作者James Raitsev
相关产品推荐
相关产品推荐

