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

如何通过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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.27 01:54:28