You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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列
COMPANYSALUTELASTFIRSTEMAILEmailed onMessage

问题描述

代码从H2单元格提取邮件内容并发送至E列邮箱,但发送过程中自动插入\n,导致邮件在移动端显示正常,但网页端文本被截断。已尝试以下两种方案均未解决:

  • 将文本放在单个单元格而非范围中
  • 强制移除所有\n

实际效果:所有文本被限制在固定宽度的深色区域;预期效果:文本可自适应浅色区域宽度自动换行。

解决方案

问题根源

MailApp.sendEmail默认发送纯文本邮件,网页端邮件客户端会将纯文本中的换行(包括单元格自动换行生成的\n)解析为硬换行,强制文本在固定位置换行,导致内容被截断。

修改代码

将邮件改为HTML格式发送,让文本自适应容器宽度自动换行。修改核心代码如下:

  1. 生成个性化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>`;
  1. 更新邮件发送选项,指定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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.05 20:35:55