רישום הודעות WhatsApp ב-Google Sheets ושליחה מתוך גיליון
מכוונים את יעד הוובהוק (Webhook) של המספר לתהליך n8n, שבו צומת Google Sheets מוסיף שורה לכל הודעה: שולח, שם, טקסט, מזהה הודעה וזמן. לשליחה מגיליון, פונקציית Apps Script עוברת על השורות וקוראת ל-Cloud API עם UrlFetchApp, בעזרת המזהה phone number id של המספר ואסימון גישה (Access Token). הצוות ממשיך לענות מאפליקציית WhatsApp Business.
בקשות כתיבה ל-Google Sheets API בדקה למשתמש בכל פרויקט; 300 לפרויקט.
קריאות URL Fetch ב-Apps Script לחשבון Google רגיל; בחשבונות Workspace יש 100,000.
משך הריצה המרבי של הרצת Apps Script אחת לפני שהיא נעצרת.
איך כל הודעת WhatsApp הופכת לשורה?
Meta שולחת כל הודעה במספר ליעד הוובהוק שהגדרתם, כאן צומת Webhook ב-n8n שגם עונה לבקשת האימות של Meta. הצומת הבא הוא Google Sheets עם הפעולה Append Row, שממפה שדות מה-payload לעמודות: מספר השולח, שם הפרופיל, הטקסט, מזהה ההודעה ב-WhatsApp, חותמת הזמן והמזהה phone number id של המספר המקבל.
כדי שניסיונות חוזרים לא יזיקו, השתמשו ב-Append or Update Row עם מזהה ההודעה כמפתח, במקום הוספה רגילה. Meta שולחת הודעה שוב כשהיא חושבת שהמסירה נכשלה, והמפתח הופך את המסירה השנייה לעדכון של אותה שורה.
במספר Coexistence, תשובות שמוקלדות באפליקציית WhatsApp Business מגיעות לאותו וובהוק כאירועי smb_message_echoes. רושמים אותם עם עמודת כיוון, והגיליון מכיל את שני הצדדים.
איפה המכסה של Sheets מגבילה?
בכתיבות לכל משתמש. ה-Sheets API מאפשר 300 בקשות כתיבה בדקה לפרויקט ו-60 בדקה למשתמש בפרויקט, ופרטי הגישה של n8n הם משתמש אחד. תהליך שמוסיף שורה לכל הודעה יכול לכן לטפל בערך בהודעה אחת בשנייה, באופן רציף.
זה די והותר לרוב המספרים של חנויות. זה כבר לא מספיק אחרי שליחת תבנית לקהל רחב, כשכמה מאות לקוחות עונים בתוך דקות. ה-API עונה אז 429 Too Many Requests, ובלי ניסיונות חוזרים שורות הולכות לאיבוד.
שני פתרונות, וכל אחד מהם מספיק. להפעיל ניסיונות חוזרים עם המתנה בצומת Google Sheets, בהתאם להמלצה של Google עצמה להאט בהדרגה. או לאגד: n8n אוסף הודעות במשך שלושים שניות ומוסיף אותן בבקשה אחת, וכך הרבה כתיבות הופכות לאחת.
איך שולחים תבניות מגיליון?
עם Apps Script, מתפריט Extensions של הגיליון. פונקציה קוראת את השורות שעדיין לא נשלחו, פונה לנקודת הקצה messages של Cloud API עם UrlFetchApp עבור כל שורה, וכותבת בשורה את מזהה ההודעה שהוחזר ואת הזמן. טריגר מבוסס זמן יכול להריץ אותה כל כמה דקות, או שאפשר להריץ אותה ידנית מתפריט מותאם אישית.
שומרים את אסימון הגישה בהגדרות הסקריפט (script properties) ולא בקוד, כדי שמי שיכול לצפות בסקריפט לא יראה אותו.
זכרו את המכסות. חשבון Google רגיל מקבל 20,000 קריאות URL Fetch ביום וחשבון Workspace מקבל 100,000, וכל הרצה נעצרת אחרי שש דקות. מעבדים את השורות במקטעים ומסמנים כל שורה כנשלחה לפני שממשיכים, כך שהרצה שנעצרה ממשיכה מהמקום שבו הפסיקה ולא שולחת פעמיים.
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());
}
}טעויות נפוצות
- הוספה בלי מפתח על מזהה ההודעה. הניסיונות החוזרים של Meta כותבים אז את אותה הודעה בשתי שורות.
- כתיבת שורה לכל הודעה דרך פרטי גישה אחד בזמן גל תגובות. מגבלת 60 כתיבות בדקה למשתמש מחזירה 429 ושורות אובדות.
- שליחת טקסט חופשי מהגיליון לאנשים שלא כתבו ב-24 השעות האחרונות. רק תבנית מאושרת נמסרת מחוץ לחלון הזה.
מחברים את המספר ב-easycoexistence.com, מכוונים את יעד הוובהוק שלו לתהליך n8n, ומעתיקים את phone number id ואת האסימון לסקריפט. החל מ-US$ 9 למספר בחודש, ועד US$ 1 ככל שמוסיפים מספרים, עם 3 ימי ניסיון בתחילת הדרך.
שאלות נפוצות
אפשר להשתמש ב-Make או ב-Zapier במקום n8n?
כן. וובהוק מותאם אישית ב-Make או catch hook ב-Zapier מקבלים את ההודעה, והשלב של Google Sheets אצלם מוסיף את השורה.
באיזה חשבון Google כותב n8n?
בחשבון שאישר את פרטי הגישה של n8n ל-Google. לחשבון הזה צריכה להיות הרשאת עריכה לגיליון, ומכסת הכתיבה למשתמש שלו היא זו שהתהליך מנצל.
האם עמודת הטלפון מעוצבת נכון?
שומרים מספרים כטקסט רגיל, ספרות עם קידומת מדינה וללא סימן הפלוס, בצורה שבה Meta שולחת אותם. אחרת Sheets מתייחס אליהם כמספרים, מה שמסיר פלוס מוביל ועלול לשנות את התצוגה של ערכים ארוכים.
האם EasyCoexistence שומרת עותק של ההודעות?
לא. Meta שולחת כל וובהוק לכתובת ה-URL של n8n שלכם, והגיליון הוא העותק היחיד.
המשיכו לקרוא
מוכנים להתחיל?
מגדירים WhatsApp Coexistence בתוך דקות, לא חודשים. האפליקציה ממשיכה לעבוד בטלפון.
התחילו תקופת ניסיון בחינםנבדק ב-