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

如何在URL中传递HTML代码至Google Apps Script的doGet(e)函数?

解决方案:高效传递HTML并优化邮件发送流程

一、改用POST请求传递HTML内容

GET请求受URL长度限制,且HTML中的特殊字符(引号、<br>等)转义极易出错,改用POST请求通过JSON格式传递数据可彻底解决这个问题,同时更适合传输复杂内容。

客户端调用代码

// 生成你的HTML内容(从Sheets收集数据后直接生成)
var htmlContent = "<h1>项目周报</h1><p>本周完成任务:<br>1. 数据整理<br>2. 报表生成</p>";

// 封装邮件参数
var payload = {
  recipient: "user@example.com",
  subject: "本周项目进度",
  htmlBody: htmlContent
};

// 请求配置
var options = {
  method: "post",
  contentType: "application/json",
  payload: JSON.stringify(payload),
  headers: {
    "Authorization": "Bearer " + ScriptApp.getOAuthToken() // 确保调用方有权限访问Web App
  }
};

// 调用Web App
var response = UrlFetchApp.fetch(urlOfwebApp, options);

Web App端doPost函数(所有者账户发布)

function doPost(e) {
  try {
    // 解析POST请求中的JSON数据
    var emailData = JSON.parse(e.postData.contents);
    
    // 发送邮件
    MailApp.sendEmail({
      to: emailData.recipient,
      subject: emailData.subject,
      htmlBody: emailData.htmlBody
    });
    
    // 返回成功响应
    return ContentService.createTextOutput(JSON.stringify({status: "success"}))
      .setMimeType(ContentService.MimeType.JSON);
  } catch (error) {
    // 返回错误信息
    return ContentService.createTextOutput(JSON.stringify({status: "error", message: error.toString()}))
      .setMimeType(ContentService.MimeType.JSON);
  }
}

Web App发布设置:执行身份选择“以账户所有者身份执行”,访问权限根据需求设置(如需外部调用可设为“任何人,甚至匿名”)。

二、优化多封邮件发送效率

避免单封邮件调用一次Web App,改为批量传递邮件数据,减少请求开销:

批量发送的客户端代码

// 批量封装多封邮件数据
var batchEmails = [
  {
    recipient: "user1@example.com",
    subject: "周报(用户1)",
    htmlBody: "<h1>用户1专属报表</h1>"
  },
  {
    recipient: "user2@example.com",
    subject: "周报(用户2)",
    htmlBody: "<h1>用户2专属报表</h1>"
  }
];

var payload = {batch: batchEmails};

var options = {
  method: "post",
  contentType: "application/json",
  payload: JSON.stringify(payload),
  headers: {
    "Authorization": "Bearer " + ScriptApp.getOAuthToken()
  }
};

var response = UrlFetchApp.fetch(urlOfwebApp, options);

Web App端批量处理代码

function doPost(e) {
  try {
    var data = JSON.parse(e.postData.contents);
    
    if (data.batch && Array.isArray(data.batch)) {
      // 循环发送批量邮件
      data.batch.forEach(email => {
        MailApp.sendEmail({
          to: email.recipient,
          subject: email.subject,
          htmlBody: email.htmlBody
        });
      });
    }
    
    return ContentService.createTextOutput(JSON.stringify({status: "success", sentCount: data.batch.length}))
      .setMimeType(ContentService.MimeType.JSON);
  } catch (error) {
    return ContentService.createTextOutput(JSON.stringify({status: "error", message: error.toString()}))
      .setMimeType(ContentService.MimeType.JSON);
  }
}

三、添加工作表作为附件发送

通过导出工作表为PDF/Excel文件,将其作为Blob添加到邮件附件中:

Web App端带附件的邮件处理代码

// 带附件的邮件发送逻辑
function sendEmailWithAttachment(emailData) {
  // 打开目标表格并指定工作表
  var targetSheet = SpreadsheetApp.openByUrl(emailData.sheetUrl)
    .getSheetByName(emailData.sheetName);
  
  // 导出为PDF(如需Excel,MIME类型改为application/vnd.openxmlformats-officedocument.spreadsheetml.sheet)
  var attachmentBlob = targetSheet.getAs("application/pdf");
  attachmentBlob.setName(`${emailData.sheetName}.pdf`);
  
  // 发送带附件的邮件
  MailApp.sendEmail({
    to: emailData.recipient,
    subject: emailData.subject,
    htmlBody: emailData.htmlBody,
    attachments: [attachmentBlob]
  });
}

// 更新doPost函数调用带附件逻辑
function doPost(e) {
  try {
    var data = JSON.parse(e.postData.contents);
    
    if (data.batch && Array.isArray(data.batch)) {
      data.batch.forEach(email => sendEmailWithAttachment(email));
    } else {
      sendEmailWithAttachment(data);
    }
    
    return ContentService.createTextOutput(JSON.stringify({status: "success"}))
      .setMimeType(ContentService.MimeType.JSON);
  } catch (error) {
    return ContentService.createTextOutput(JSON.stringify({status: "error", message: error.toString()}))
      .setMimeType(ContentService.MimeType.JSON);
  }
}

客户端带附件的请求payload示例

var payload = {
  recipient: "user@example.com",
  subject: "周报及附件",
  htmlBody: "<h1>本周报表已附在邮件中</h1>",
  sheetUrl: "https://docs.google.com/spreadsheets/d/xxxxxxxx/edit",
  sheetName: "2024年第X周"
};

注意事项

  • 确保Web App所有者账户有权限访问目标Spreadsheet(如需发送附件)。
  • 注意MailApp的每日发送配额(免费版每日100封,企业版根据账户类型调整)。
  • 调用方脚本需开启https://www.googleapis.com/auth/script.external_request权限,确保能正常发起请求。

内容的提问来源于stack exchange,提问作者Cian

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.31 02:27:45