如何在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
相关产品推荐
相关产品推荐

