將 WhatsApp 訊息記錄到 Google Sheets,並從試算表傳送訊息
將號碼的 Webhook 目的地指向 n8n 工作流程,由其中的 Google Sheets 節點為每則訊息新增一列:寄件人、姓名、內容、訊息 ID 和時間。若要從試算表傳送,可以用 Apps Script 函式逐列處理,並透過 UrlFetchApp 呼叫 Cloud API,使用該號碼的 phone number id 和存取權杖。團隊仍可繼續在 WhatsApp Business 應用程式中回覆。
Google Sheets API 每個使用者、每個專案每分鐘允許的寫入請求數;每個專案為 300。
一般 Google 帳戶的 Apps Script URL Fetch 呼叫次數;Workspace 帳戶為 100,000。
單次 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 分鐘後會停止。請分批處理資料列,並在繼續之前先將每列標記為已傳送,這樣中斷的執行可以從上次停下的地方繼續,不會重複傳送。
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.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,而非幾個月。應用程式在手機上仍可繼續運作。
開始免費試用驗證日期