ربط فورم الموقع بـ Google Sheets بدون بلجن
تقدر تعمل ربط الفورم بـ Google Sheets من غير أي إضافة: بتنشر سكريبت Google Apps Script كـ Web App بيستقبل بيانات الفورم (طلب POST)، ويكتبها كصف جديد في الشيت. وفورم الموقع (HTML عادي أو من أي بلجن) بيبعت البيانات للرابط ده، فكل تسجيل ينزل في الشيت فورًا. الطريقة مجانية ومناسبة للفورمات البسيطة (نموذج تواصل، تسجيل ليد، حجز). وفي المقال ده هاشرح الخطوات كاملة بالكود، وإزاي تحميها من السبام، وحدودها، ومتى الأفضل تستخدم إضافة أو أداة جاهزة بدلها.
محتويات المقال
إمتى تستخدم الطريقة دي؟
مناسبة لو:
- عندك فورم بسيط (اسم، تليفون، رسالة) وعايز تتابع الليدز في شيت.
- مش عايز تدفع لإضافة أو خدمة تانية.
- عايز تتحكم في البيانات وتربطها بسكريبتات تانية (تنبيه، تقرير، تنضيف). ولو لسه ما بدأتش مع Apps Script شوف Google Apps Script للمسوّقين.
مش مناسبة لو:
- بتجمع بيانات حساسة (هويات، بيانات مالية، بيانات صحية). الأنسب نظام مصمّم لحماية البيانات، وده كلام عام مش استشارة قانونية.
- عندك ترافيك كبير جدًا وفورمات كتيرة. حدود جوجل (Quotas) ممكن توقفك.
- عايز تكامل جاهز مع CRM ونظام متابعة. فيه أدوات مصممة لده.
وحاجة لازم تعرفها لو الفورم جاي من إعلانات: الليد اللي بينزل في الشيت لازم تتابعه بسرعة. وبعد ما الزائر يضغط على الإعلان، اللي بيحصل في الصفحة والفورم هو اللي بيحدد النتيجة، وده في فصل ما بعد الضغطة.
فكرة الشغل بالبساطة دي
- الزائر بيملأ فورم في موقعك ويضغط إرسال.
- المتصفح بيبعت البيانات لرابط خاص (Web App URL) من Apps Script.
- السكريبت بيستقبل البيانات ويضيف صف جديد في الشيت بالتاريخ.
- (اختياري) السكريبت يبعتلك إيميل تنبيه.
خطوات ربط الفورم بـ Google Sheets
الخطوة 1: جهّز الشيت
- أنشئ ملف Google Sheets جديد.
- سمّي الورقة الأولى
Leads. - في الصف الأول اكتب العناوين:
التاريخوالاسموالتليفونوالرسالةوالمصدر.
عمود «المصدر» مفيد لو بتعمل حملات: تقدر تبعت مع الفورم قيمة UTM من الرابط، وتعرف الليد جه من أنهي حملة. وبالنسبة لتسمية الـUTM شوف نظام UTM.
الخطوة 2: اكتب سكريبت الاستقبال
من الشيت: الإضافات ← Apps Script، وامسح أي كود موجود وحط ده:
function doPost(e) {
var lock = LockService.getScriptLock();
lock.tryLock(10000);
try {
var sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName('Leads');
var p = e.parameter;
// فخ للسبام: حقل مخفي المفروض يفضل فاضي
if (p.website) {
return ContentService.createTextOutput('ok');
}
sheet.appendRow([
new Date(),
p.name || '',
p.phone || '',
p.message || '',
p.source || ''
]);
return ContentService
.createTextOutput(JSON.stringify({ result: 'success' }))
.setMimeType(ContentService.MimeType.JSON);
} catch (err) {
return ContentService
.createTextOutput(JSON.stringify({ result: 'error' }))
.setMimeType(ContentService.MimeType.JSON);
} finally {
lock.releaseLock();
}
}
شرح الكود
doPost(e): الدالة اللي جوجل بيشغّلها لما حد يبعت POST لرابط الـWeb App. والمتغيرe.parameterفيه الحقول المرسلة.LockService: بيمنع تداخل لو اتنين سجلوا في نفس اللحظة، فالصفوف ما تتلخبطش.- حقل
website: فخ للروبوتات. الفورم هيحط الحقل ده مخفي، والإنسان ما بيملاش، لكن الروبوتات غالبًا بتملا كل الحقول. لو اتملا، بنتجاهل الطلب. appendRow: بيضيف صف جديد في آخر الورقة بالترتيب اللي حددناه. ولازم يتطابق مع ترتيب العناوين.
الخطوة 3: انشره كـ Web App
- في محرر Apps Script اضغط نشر (Deploy) ← نشر جديد (New deployment).
- اختار النوع تطبيق ويب (Web app).
- التنفيذ باسم (Execute as): أنا (حسابك). ده اللي بيخلّي السكريبت يكتب في الشيت بصلاحيتك.
- من يملك حق الوصول (Who has access): أي شخص (Anyone). ده لازم عشان زوار موقعك يبعتوا البيانات من غير تسجيل دخول.
- اضغط نشر، ووافق على الصلاحيات (هيطلب إذن الوصول للشيت).
- انسخ رابط تطبيق الويب (Web app URL) اللي بيبدأ بـ
https://script.google.com/macros/s/....
مهم: كل مرة تعدّل في الكود، لازم تعمل نشر جديد أو تحديث النشر من إدارة عمليات النشر، وإلا الرابط هيفضل يشغّل النسخة القديمة. وأسماء الأزرار في واجهة جوجل ممكن تتغيّر شوية.
وكمان خلّي بالك: الرابط ده عام، أي حد يعرفه يقدر يبعت له. وده سبب إن الحماية من السبام مهمة.
الخطوة 4: اعمل الفورم في موقعك
دي نسخة HTML بسيطة. ضيفها في صفحة ووردبريس بكتلة «HTML مخصص» أو في القالب:
<form id="lead-form">
<input type="text" name="name" placeholder="الاسم" required>
<input type="tel" name="phone" placeholder="رقم التليفون" required>
<textarea name="message" placeholder="رسالتك"></textarea>
<!-- فخ السبام: مخفي عن الإنسان -->
<input type="text" name="website" style="display:none" tabindex="-1" autocomplete="off">
<input type="hidden" name="source" id="source">
<button type="submit">إرسال</button>
<p id="form-msg"></p>
</form>
<script>
var URL_WEBAPP = 'ضع_رابط_الويب_آب_هنا';
// خد مصدر الحملة من الرابط لو موجود
var params = new URLSearchParams(window.location.search);
document.getElementById('source').value = params.get('utm_campaign') || '';
document.getElementById('lead-form').addEventListener('submit', function (e) {
e.preventDefault();
var form = e.target;
var msg = document.getElementById('form-msg');
msg.textContent = 'جاري الإرسال...';
fetch(URL_WEBAPP, {
method: 'POST',
body: new URLSearchParams(new FormData(form))
})
.then(function () {
msg.textContent = 'تم الاستلام، هنتواصل معاك قريبًا.';
form.reset();
})
.catch(function () {
msg.textContent = 'حصلت مشكلة، حاول تاني.';
});
});
</script>
ملاحظات على الكود
- بنبعت البيانات كـ
application/x-www-form-urlencoded(الشكل المعتاد للفورمات) عن طريقURLSearchParams. ده أبسط من JSON ويمشي مع Apps Script من غير تعقيد. - استدعاء Apps Script من متصفح موقع تاني ممكن يقابلك قيود CORS في قراءة الرد. بيانات الإرسال بتوصل عادةً، لكن قراءة محتوى الرد ممكن ما تنفعش. عشان كده الكود بيعتمد على نجاح الطلب مش على محتوى الرد. اختبر ده في بيئتك، لأن سلوك المتصفحات ممكن يختلف.
- ما تحطش بيانات حساسة في الرابط (GET).
- لو موقعك على ووردبريس، تأكد إن الكود مش بيتعدّل أو يتشال بإضافة تانية (بعض الإضافات بتفلتر السكريبتات).
الخطوة 5: اختبر كل حاجة
- افتح الصفحة وجرّب تملأ الفورم وتبعت.
- افتح الشيت وتأكد إن الصف نزل بالتاريخ والبيانات الصح.
- جرّب الفورم من موبايل.
- جرّب سيناريو الخطأ: افصل النت قبل الإرسال وشوف الرسالة.
- لو مش بيشتغل، افتح التنفيذات (Executions) في Apps Script وشوف رسالة الخطأ، وافتح أدوات المطور في المتصفح (Console / Network).
الخطوة 6: تنبيه فوري بالإيميل (اختياري لكن مفيد)
أضف داخل دالة doPost بعد appendRow السطر ده:
MailApp.sendEmail('your@email.com', 'ليد جديد من الموقع',
'الاسم: ' + (p.name || '') + 'nالتليفون: ' + (p.phone || '') + 'nالرسالة: ' + (p.message || ''));
كده بتعرف فورًا لما حد يسجل، وتتصل بيه بسرعة. الاستجابة السريعة بتفرق جدًا في تحويل الليدز، خصوصًا في المجالات اللي بتتنافس عليها زي العيادات والعقارات (شوف أمثلة في تسويق العيادات وإعلانات العقارات). بدّل البريد ببريدك، وراعي إن فيه حد يومي للإيميلات في Apps Script.
تحسينات الأمان والجودة
- تحقق من البيانات في السكريبت: طول الاسم، وصيغة رقم التليفون، وحد أقصى للرسالة. ما تثقش في اللي جاي من المتصفح.
- حقل الفخ (Honeypot) بيوقف جزء من الروبوتات، لكن مش كلها. لو السبام زاد، فكّر في reCAPTCHA أو في أداة جاهزة.
- حماية الرابط: الرابط عام. ما تحطش فيه بيانات سرية ولا صلاحيات واسعة. السكريبت بيكتب في الشيت ده فقط.
- حماية الشيت: ما تشاركش الشيت مع ناس كتير. شارك بصلاحية القراءة فقط لمن يحتاج.
- الخصوصية: لو بتجمع بيانات شخصية، وضّح في الفورم وصفحة السياسات إيه اللي بتجمعه وليه، وخد موافقة لو لازم. وما تحتفظش بالبيانات أكتر من اللازم.
- قيود الحصص: فيه حدود يومية على تشغيل السكريبتات وطلبات الويب. راجعها في وثائق جوجل، لأنها بتتغيّر.
- نسخة احتياطية للشيت: الشيت هو قاعدة بياناتك، فنسخة دورية مهمة.
ربط الفورم بحملاتك الإعلانية
لو الفورم صفحة هبوط لحملات، فكّر في:
- تسجيل المصدر: UTM في عمود «المصدر» عشان تعرف الليد من فين.
- تتبع التحويل: تأكد إن حدث «ليد» بيتسجل في البيكسل بعد الإرسال الناجح. بتحتاج تضيف كود الحدث بعد نجاح الإرسال في سكريبت الفورم. وإزاي تتأكد إن الأحداث بتتسجل، شوف اختبار أحداث البيكسل.
- مقارنة الأرقام: عدد الليدز في الشيت لازم يكون قريب من اللي في Ads Manager. لو فيه فرق كبير، راجع فرق أرقام ميتا وGA4.
- الصفحة نفسها: الفورم الطويل أو اللي فيه حقول كتير بيقلل التسجيل. اتكلمت عن ده في صفحة الهبوط مقابل نموذج العملاء.
أخطاء شائعة
- الصلاحية «أي شخص» ما اتحطتش: الفورم بيرجع خطأ أو بيطلب تسجيل دخول.
- نسيان نشر نسخة جديدة بعد تعديل الكود.
- اسم الورقة
Leadsمش مطابق. - ترتيب الأعمدة مختلف عن ترتيب
appendRow. - الاعتماد على قراءة رد السكريبت من المتصفح وتجاهل قيود CORS.
- عدم وجود حماية من السبام.
- جمع بيانات حساسة بالطريقة دي.
- عدم اختبار الفورم على الموبايل.
للتأكد من أحدث التفاصيل، راجع حدود استخدام Apps Script الرسمية (Quotas)، لأن الواجهات والسياسات بتتغيّر باستمرار.
مقالات ذات صلة بتفيدك:
- تنبيهات تليجرام من Google Sheets خطوة بخطوة
- برنامج CRM مجاني لمشروع صغير: الخيارات وإزاي تبنيه في Google Sheets
- سحب بيانات إعلانات ميتا في Google Sheets تلقائيًا
- المشغلات Triggers في Apps Script: الأنواع والحدود
أسئلة شائعة
هل الطريقة دي مجانية؟
متاحة مجانًا مع حساب جوجل، لكن فيها حدود استخدام يومية. للمواقع الصغيرة غالبًا كفاية، ولو ترافيكك كبير راجع الحدود أو استخدم نظام مخصص.
هل ينفع أستخدمها مع فورم Elementor أو Contact Form 7؟
ينفع غالبًا عن طريق Webhook أو إضافة بتبعت البيانات لرابط خارجي، لكن الخطوات بتختلف حسب الأداة، وبتحتاج تضبط أسماء الحقول بحيث تطابق اللي السكريبت بيتوقعه. اقرأ إعدادات الأداة اللي بتستخدمها.
إزاي أمنع السبام؟
حقل الفخ المخفي (Honeypot) خطوة بسيطة. ولو السبام استمر، استخدم reCAPTCHA أو تحقق إضافي. وراجع الشيت بانتظام.
ممكن أبعت الليد لواتساب أو CRM؟
ممكن بسكريبتات إضافية أو أدوات وسيطة، لكن ده أصعب. لو محتاج ده بشكل أساسي، فيه حلول جاهزة أسهل وأكثر أمانًا. وفي مقال أتمتة الواتساب شرحت الخيارات القانونية والمخاطر.
لو عايز أجهز لك فورم بيتربط بالشيت وبحملاتك وبتتبع التحويل، أو أراجع فورم شغال عندك، تقدر تحجز استشارة معايا.
محتاج حد يبصّ على حساباتك؟
ابعتلي على واتساب وقولّي وضعك، وأقولك نبدأ منين.