سجّل رسائل WhatsApp في Google Sheets وأرسل من جدول
وجّه وجهة خطاف الويب (webhook) الخاصة بالرقم إلى سير عمل n8n تضيف فيه عقدة Google Sheets صفًا لكل رسالة: المرسل والاسم والنص ومعرّف الرسالة والوقت. وللإرسال من الجدول، يمكن لدالة Apps Script المرور على الصفوف واستدعاء Cloud API، وهي واجهة برمجة التطبيقات (API) في WhatsApp، عبر UrlFetchApp باستخدام phone_number_id ورمز الوصول (token) الخاصين بالرقم. ويواصل الفريق الرد من تطبيق WhatsApp Business.
الحد المسموح به لطلبات الكتابة في Google Sheets API في الدقيقة لكل مستخدم في كل مشروع؛ و300 لكل مشروع.
عدد استدعاءات URL Fetch في Apps Script للحساب الشخصي في Google؛ وتحصل حسابات Workspace على 100,000.
أطول مدة يُسمح فيها بتنفيذ واحد في Apps Script قبل أن يتوقف.
كيف تتحول كل رسالة WhatsApp إلى صف؟
تُرسل Meta كل رسالة على الرقم إلى وجهة webhook التي حدّدتها، وهي هنا عقدة Webhook في n8n التي تردّ أيضًا على طلب التحقق من Meta. العقدة التالية هي Google Sheets بعملية Append Row، وتربط حقول الحمولة بالأعمدة: رقم المرسل، واسم الملف الشخصي، والنص، ومعرّف رسالة WhatsApp، والطابع الزمني، ومعرّف رقم الهاتف المستقبِل.
استخدم Append or Update Row بالاعتماد على معرّف الرسالة بدل الإضافة العادية إذا أردت أن تكون إعادة المحاولة بلا أثر. تعيد Meta تسليم الرسالة حين تظن أن التسليم فشل، والاعتماد على المعرّف يحوّل التسليم الثاني إلى تحديث للصف نفسه.
على رقم Coexistence، تصل الردود المكتوبة في تطبيق WhatsApp Business إلى webhook نفسه على هيئة أحداث smb_message_echoes. سجّلها مع عمود للاتجاه، فيحتوي الجدول على الطرفين.
أين تظهر حدود الحصة في Sheets؟
في الكتابة لكل مستخدم. تسمح Sheets API بـ 300 طلب كتابة في الدقيقة لكل مشروع و60 في الدقيقة لكل مستخدم في كل مشروع، وبيانات اعتماد n8n تمثّل مستخدمًا واحدًا. لذلك يستطيع سير عمل يضيف صفًا لكل رسالة أن يستوعب نحو رسالة واحدة في الثانية بصورة مستمرة.
وهذا كافٍ لمعظم أرقام المتاجر. لكنه لا يكفي بعد إرسال قالب جماعي، حين يردّ بضع مئات من العملاء خلال دقائق. عندها تستجيب API بالخطأ 429 Too Many Requests، وتضيع صفوف إذا لم تُفعَّل إعادة المحاولة.
هناك حلّان، ويكفي أحدهما. فعّل إعادة المحاولة مع مهلة انتظار في عقدة Google Sheets، وهذا يوافق نصيحة Google نفسها بالتراجع تدريجيًا. أو اجمع الرسائل في دفعة: اجعل n8n يجمعها ثلاثين ثانية ثم يضيفها في طلب واحد، فتتحول كتابات كثيرة إلى كتابة واحدة.
كيف ترسل القوالب من جدول؟
باستخدام Apps Script من قائمة Extensions في الجدول. تقرأ دالة الصفوف التي لم تُرسل بعد، وتستدعي نقطة النهاية (endpoint) الخاصة بالرسائل في Cloud API عبر UrlFetchApp لكل صف، ثم تكتب معرّف الرسالة والوقت المُعادَين في الصف. يمكن لمشغّل زمني أن ينفّذها كل بضع دقائق، أو يمكنك تشغيلها يدويًا من قائمة مخصصة.
احفظ token في خصائص السكربت لا في الشيفرة، حتى لا يراه كل من يستطيع عرض السكربت.
انتبه إلى الحصص. يحصل الحساب الشخصي في 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، ووجّه وجهة webhook الخاصة به إلى سير عمل n8n، ثم انسخ phone_number_id وtoken إلى السكربت. من US$ 9 لكل رقم شهريًا، وينخفض إلى US$ 1 مع إضافة المزيد من الأرقام، مع أول 3 أيام مجانًا.
الأسئلة الشائعة
هل يمكنني استخدام Make أو Zapier بدل n8n؟
نعم. يستقبل webhook مخصص في Make أو catch hook في Zapier الرسالة، وتضيف خطوة Google Sheets فيهما الصف.
بأي حساب Google يكتب n8n؟
الحساب الذي منح n8n صلاحية Google. يحتاج هذا الحساب إلى صلاحية تعديل على الجدول، وحصة الكتابة لكل مستخدم الخاصة به هي التي يستهلكها سير العمل.
هل عمود الهاتف منسّق بشكل صحيح؟
احفظ الأرقام كنص عادي: أرقامًا مع رمز الدولة ودون علامة الجمع، وهذه هي الصيغة التي ترسلها Meta. وإلا عاملها Sheets كأرقام، فيحذف علامة الجمع في البداية وقد يغيّر تنسيق القيم الطويلة.
هل تحتفظ EasyCoexistence بنسخة من الرسائل؟
لا. تسلّم Meta كل webhook إلى عنوان URL الخاص بـ n8n لديك، والجدول هو النسخة الوحيدة.
تابع القراءة
هل أنت مستعد للبدء؟
أعد إعداد WhatsApp Coexistence خلال دقائق، وليس أشهر. يواصل التطبيق العمل على الهاتف.
ابدأ الفترة التجريبية المجانيةتم التحقق في