登入開始免費試用
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 收集 30 秒內的訊息,再以一次請求寫入,把多次寫入合併為一次。

如何從試算表傳送範本?

使用 Apps Script,從試算表的「擴充功能」選單進入。函式會讀取尚未傳送的資料列,為每一列透過 UrlFetchApp 呼叫 Cloud API 的 messages 端點,並將回傳的訊息 ID 和時間寫回該列。您可以設定定時觸發器,每隔幾分鐘執行一次,也可以從自訂選單手動執行。

請將存取權杖儲存在指令碼屬性中,而不要寫在程式碼裡,這樣能檢視指令碼的人也看不到它。

請留意配額。一般 Google 帳戶每日有 20,000 次 URL Fetch 呼叫,Workspace 帳戶為 100,000 次,而每次執行在 6 分鐘後會停止。請分批處理資料列,並在繼續之前先將每列標記為已傳送,這樣中斷的執行可以從上次停下的地方繼續,不會重複傳送。

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 整合