登录开始免费试用
Meta Tech Provider

将 WhatsApp 消息记录到 Google Sheets,并从表格发送

将号码的 Webhook 目标地址指向一个 n8n 工作流,由其中的 Google Sheets 节点为每条消息追加一行:发送者、姓名、文本、消息 ID 和时间。若要从表格发送,可以编写 Apps Script 函数,逐行循环并用 UrlFetchApp 调用 Cloud API,使用该号码的 phone number id 和访问令牌。团队仍可继续在 WhatsApp Business 应用中回复。

60 / min

Google Sheets API 每个用户每个项目每分钟允许的写入请求数;每个项目为 300。

20,000 / day

消费者 Google 账户的 Apps Script URL Fetch 调用次数;Workspace 账户为 100,000。

6 min

单次 Apps Script 执行被停止前的最长运行时间。

每条 WhatsApp 消息如何变成一行数据?

Meta 会把号码上的每条消息发送到您设置的 Webhook 目标地址,这里是一个 n8n Webhook 节点,它同时负责响应 Meta 的验证请求。下一个节点是使用 Append Row 操作的 Google Sheets,把负载中的字段映射到各列:发送者号码、资料名称、文本、WhatsApp 消息 ID、时间戳,以及接收消息的 phone number id。

如果希望重试不产生副作用,请使用以消息 ID 为键的 Append or Update Row,而不是普通追加。Meta 认为投递失败时会重新投递消息,以 ID 为键后,第二次投递只会更新同一行。

在 Coexistence 号码上,您在 WhatsApp Business 应用中输入的回复,会以 smb_message_echoes 事件的形式到达同一个 Webhook。用一个方向列把它们记录下来,表格就同时包含双方的消息。

Sheets 的配额在哪里会成为限制?

限制在每个用户的写入次数。Sheets API 允许每个项目每分钟 300 次写入请求,每个用户每个项目每分钟 60 次,而一个 n8n 凭据对应一个用户。因此,每条消息追加一行的工作流,持续运行时大约每秒只能处理一条消息。

对大多数商店号码来说,这已经足够。但在群发模板之后,几百位客户在几分钟内回复时就不够了。此时 API 会返回 429 Too Many Requests,如果没有重试,就会丢行。

有两种修复方法,任选其一即可。一是在 Google Sheets 节点上开启重试并设置等待时间,这与 Google 自己建议的指数退避一致。二是批量处理:让 n8n 收集三十秒内的消息,再用一次请求全部追加,把多次写入合并为一次。

如何从表格发送模板?

使用 Apps Script,从表格的 Extensions 菜单进入。函数读取尚未发送的行,对每一行用 UrlFetchApp 调用 Cloud API 的 messages 端点,并把返回的消息 ID 和时间写回该行。您可以用定时触发器每隔几分钟运行一次,也可以通过自定义菜单手动运行。

请把访问令牌存放在脚本属性中,而不是写进代码,这样能查看脚本的人也看不到它。

请留意配额。消费者 Google 账户每天有 20,000 次 URL Fetch 调用,Workspace 账户为 100,000 次,而且每次执行在六分钟后会停止。请分块处理各行,并在继续之前把每一行标记为已发送,这样中断的运行会从停止处继续,而不会重复发送。

Apps Script: send one approved template per unsent row
function sendPending() {
  const token = PropertiesService.getScriptProperties().getProperty("WHATSAPP_TOKEN");
  const sheet = SpreadsheetApp.getActive().getSheetByName("Send");
  const rows = sheet.getDataRange().getValues();
  for (let i = 1; i < rows.length; i++) {
    const [phone, name, sentAt] = rows[i];
    if (sentAt) continue;
    const res = UrlFetchApp.fetch("https://graph.facebook.com/v23.0/<PHONE_NUMBER_ID>/messages", {
      method: "post",
      contentType: "application/json",
      headers: { Authorization: "Bearer " + token },
      payload: JSON.stringify({
        messaging_product: "whatsapp", to: String(phone), type: "template",
        template: { name: "order_ready", language: { code: "en" },
          components: [{ type: "body", parameters: [{ type: "text", text: name }] }] },
      }),
    });
    sheet.getRange(i + 1, 3).setValue(new Date());
  }
}

常见错误

  • 追加时没有以消息 ID 为键。Meta 重试后,同一条消息会被写入两行。
  • 在回复高峰期通过单一凭据每条消息写一行。每用户每分钟 60 次写入的限制会返回 429,导致丢行。
  • 向 24 小时内没有联系过您的人从表格发送自由文本。只有已获批准的模板才能在该时间窗口之外送达。
使用 EasyCoexistence 完成这些操作

在 easycoexistence.com 连接号码,把其 Webhook 目标地址指向 n8n 工作流,并将 phone number id 和访问令牌复制到脚本中。每个号码每月 US$ 9 起,随号码增加降至 US$ 1,前 3 天免费。

常见问题

可以用 Make 或 Zapier 代替 n8n 吗?

可以。Make 的自定义 Webhook 或 Zapier 的 catch hook 都能接收消息,再由其 Google Sheets 步骤添加一行。

n8n 以哪个 Google 账户写入?

以授权 n8n Google 凭据的那个账户。该账户需要有表格的编辑权限,工作流消耗的正是它的每用户写入配额。

电话号码列的格式正确吗?

请把号码存为纯文本,即带国家代码、不含加号的数字,这也是 Meta 发送的格式。否则 Sheets 会把它们当作数字处理,去掉开头的加号,还可能改变较长数值的显示格式。

EasyCoexistence 会保存消息副本吗?

不会。Meta 把每个 Webhook 直接投递到您的 n8n URL,表格是唯一的副本。

继续阅读

准备开始了吗?

几分钟即可设置 WhatsApp Coexistence,而不是几个月。应用会继续在手机上运行。

开始免费试用

验证时间

WhatsApp 与 Google Sheets:基于 Cloud API