如何通过WhatsApp将Google Sheets活动工作表以PDF发送至指定号码
Google Sheets导出活动工作表为PDF并通过WhatsApp发送实现方案
你原有代码中的PDF导出逻辑可直接复用,Google Apps Script本身没有内置WhatsApp发送能力,合规稳定的实现方式是对接官方WhatsApp Business Platform接口,完整实现步骤和代码如下:
前置说明
- 自动化发送WhatsApp消息(尤其是带附件的消息)必须使用Meta官方的WhatsApp Business账号,使用非官方模拟登录/爬虫方案会直接导致账号被封禁,无例外。
- 接收号码需带国家区号,代码会自动过滤号码中的空格、横杠、加号等非数字字符,无需手动格式化。
- 提前修改代码中号码存储单元格位置、API凭据等配置项即可直接运行。
完整可运行代码
// ===================== 需自定义配置项 ===================== // 存储接收号码的单元格位置,例如号码存在当前工作表B2单元格即填"B2" const RECEIVER_PHONE_CELL = "B2"; // WhatsApp Business Platform 访问令牌 const WA_ACCESS_TOKEN = "替换为你自己的接口访问令牌"; // 已绑定WhatsApp Business的手机号ID const WA_SENDER_PHONE_ID = "替换为你自己的发送方手机号ID"; // 消息附带的文字说明 const MESSAGE_CAPTION = "您好,附件为本月对应单据,请查收。"; // PDF导出参数,和原有逻辑保持一致,可按需调整 const PDF_CONFIG = { paperSize: "A4", portrait: true, fitToWidth: true, showSheetName: false, showTitle: false, showPageNumber: false, showGridlines: false, skipFrozenRows: false } // ===================== 配置项结束 ===================== /** * 导出当前活动工作表为PDF Blob对象 */ function getActiveSheetPdfBlob() { const ss = SpreadsheetApp.getActiveSpreadsheet(); const activeSheet = ss.getActiveSheet(); const baseExportUrl = `https://docs.google.com/spreadsheets/d/${ss.getId()}/export?`; const exportParams = `exportFormat=pdf&format=pdf` + `&size=${PDF_CONFIG.paperSize}` + `&portrait=${PDF_CONFIG.portrait}` + `&fitw=${PDF_CONFIG.fitToWidth}&source=labnol` + `&sheetnames=${PDF_CONFIG.showSheetName}&printtitle=${PDF_CONFIG.showTitle}` + `&pagenumbers=${PDF_CONFIG.showPageNumber}&gridlines=${PDF_CONFIG.showGridlines}` + `&fzr=${PDF_CONFIG.skipFrozenRows}` + `&gid=${activeSheet.getSheetId()}`; const authToken = ScriptApp.getOAuthToken(); return UrlFetchApp.fetch(baseExportUrl + exportParams, { headers: { Authorization: `Bearer ${authToken}` } }).getBlob().setName(`${activeSheet.getName()}.pdf`); } /** * 上传PDF文件到WhatsApp媒体服务器,返回媒体ID用于发送 */ function uploadPdfToWhatsApp(pdfBlob) { const uploadEndpoint = `https://graph.facebook.com/v19.0/${WA_SENDER_PHONE_ID}/media`; const formPayload = { messaging_product: "whatsapp", file: pdfBlob, type: "application/pdf" }; const res = UrlFetchApp.fetch(uploadEndpoint, { method: "post", headers: { Authorization: `Bearer ${WA_ACCESS_TOKEN}` }, payload: formPayload, muteHttpExceptions: true }); const resData = JSON.parse(res.getContentText()); if (!resData.id) throw new Error(`PDF上传失败: ${res.getContentText()}`); return resData.id; } /** * 主函数:导出PDF并通过WhatsApp发送 */ function sendSheetPdfToWhatsApp() { // 读取并格式化接收号码 const activeSheet = SpreadsheetApp.getActiveSpreadsheet().getActiveSheet(); let receiverPhone = activeSheet.getRange(RECEIVER_PHONE_CELL).getValue().toString(); receiverPhone = receiverPhone.replace(/[^0-9]/g, ""); if (receiverPhone.length < 8) throw new Error("指定单元格未找到有效的带国家区号的手机号"); // 导出PDF const pdfBlob = getActiveSheetPdfBlob(); // 上传PDF获取媒体ID const mediaId = uploadPdfToWhatsApp(pdfBlob); // 发送带附件的消息 const sendEndpoint = `https://graph.facebook.com/v19.0/${WA_SENDER_PHONE_ID}/messages`; const messagePayload = { messaging_product: "whatsapp", to: receiverPhone, type: "document", document: { id: mediaId, caption: MESSAGE_CAPTION, filename: pdfBlob.getName() } }; const sendRes = UrlFetchApp.fetch(sendEndpoint, { method: "post", headers: { Authorization: `Bearer ${WA_ACCESS_TOKEN}`, "Content-Type": "application/json" }, payload: JSON.stringify(messagePayload), muteHttpExceptions: true }); if (sendRes.getResponseCode() !== 200) throw new Error(`消息发送失败: ${sendRes.getContentText()}`); Logger.log("PDF发送成功"); }
配置&使用说明
- 首次使用需到Meta开发者平台创建WhatsApp Business应用,获取对应访问令牌和发送方手机号ID,测试阶段需要把接收号码加入测试白名单才能正常发送。
- 如果需要调整PDF格式(比如改成横向、显示网格线),直接修改
PDF_CONFIG里的对应布尔值或参数即可,和你原有代码的参数逻辑完全一致。 - 脚本第一次运行会弹出授权请求,授予Google Sheets访问、外部网络请求权限即可正常运行。
- 可以给脚本绑定触发器,实现定时自动发送,或者在表格里加按钮绑定主函数,手动点击即可发送。
内容的提问来源于stack exchange,提问作者Rony Joseph
相关产品推荐
相关产品推荐

