Google Apps Script: دليل عملي لأتمتة جوجل شيت بمشروع حقيقي

Google Apps Script: دليل عملي لأتمتة جوجل شيت بمشروع حقيقي

شرح Google Apps Script للمبتدئين: أتمتة جوجل شيت بسكربتات JavaScript مجانية من المتصفح

محرر سحابي واحد مجاني، مربوط بكل تطبيقات Workspace: هذا هو الأساس الذي تُبنى عليه سلسلة الـ48 جزءًا كاملةً.

هذا الدليل يأخذك من الصفر إلى أول أتمتة حقيقية تعمل على جوجل شيت — سكربتات فعلية تكتب البيانات، تنسّق الخلايا، تحسب بدالة مخصصة من صنعك، وتعمل تلقائيًا حسب جدول زمني بينما أنت نائم. Google Apps Script هي منصة JavaScript سحابية مجانية من جوجل، وهي مدمجة أصلًا في Sheets وGmail وDrive وDocs وCalendar. لا تثبيت، لا استضافة، ولا أي تكلفة.

إذا كان أسبوعك لا يزال يتكرر فيه نفس المشهد — نسخ بيانات بين الأوراق، إعادة تنسيق نفس الأعمدة كل يوم اثنين، وكتابة نفس إيميل الحالة يدويًا — فأنت تقوم بعمل يستطيع سكربت من عشرة أسطر أن يؤديه بدلًا منك. الاستثمار هنا بسيط: ساعة واحدة مركّزة مع هذا الدليل تخرج منها بثلاث أتمتة تعمل فعليًا، وسجل مصروفات يبني نفسه بنفسه، وخريطة واضحة لبقية الرحلة.

أنا مصطفى أمان، مسؤول تقنية معلومات أول (Senior IT Officer) بخبرة تتجاوز 16 عامًا في إدارة البنية التحتية المؤسسية — من أنظمة التصوير الطبي، إلى شبكات الفروع المتعددة، وسيرفرات Windows وLinux، وعمليات التجارة الإلكترونية — واستخدمت Google Apps Script لسنوات لإلغاء المهام المتكررة عبر Google Workspace. أول مرة سلّمني فيها سكربت مجدول تقريرًا كاملًا دون أن ألمس لوحة المفاتيح، تقلّص وقت تقريري الأسبوعي إلى خمس دقائق مراجعة فقط. هذا المقال هو نقطة الارتكاز لكل السلسلة؛ كل جزء لاحق سيربط عودةً إلى هنا.

📚 سلسلة احتراف Google Apps Script · المرحلة 1: الأساسيات

أنت تقرأ الجزء 001 من 48 — نقطة انطلاق السلسلة. كل جزء لاحق سيربط عودةً إلى هذا المقال، فاحفظه في مفضلتك. الجزء التالي، الجزء 002: دوال الجداول مقابل Google Apps Script، قادم قريبًا وسيُربط هنا فور نشره.

الإجابة السريعة: ما هي Google Apps Script؟

⚡ الإجابة السريعة: Google Apps Script هي منصة JavaScript سحابية مجانية من جوجل لأتمتة Google Workspace. يأخذك هذا الدليل من فتح المحرر داخل جوجل شيت إلى تشغيل أول سكربتات حقيقية — كتابة بيانات، تنسيق، دوال مخصصة، ومشغّلات (Triggers) — لتُتمتة جوجل شيت دون تثبيت أي شيء.

هذه هي النسخة المختصرة. بقية هذا الدليل تُريك كيف تبدو تلك الجملة عمليًا: أين يعيش المحرر، ثلاثة سكربتات جاهزة للنسخ يمكنك تشغيلها اليوم، متى تتفوق ميزات الجداول الجاهزة على الكود، وكيف تحوّل الأجزاء الـ47 المتبقية هذه الأساسيات إلى نظام أتمتة متكامل لـ Workspace.

ما هي Google Apps Script؟ لنرَ المثال أولًا ثم نشرح

تخيّل صباح يوم الاثنين الذي صُمِّمت هذه الأداة من أجله. إيصالات المصروفات متكدسة في البريد، وورقة السجل تحتاج نفس الأعمدة الخمسة بنفس التنسيق للأسبوع التاسع على التوالي، والمدير ينتظر ملخصًا حسب الفئة. في سيناريو العمل اليدوي، هذا يعني ثلاثة تطبيقات، عشرين دقيقة، وفرصتين للصق في الصف الخطأ. مع Apps Script، الأمر كله دالة واحدة — ابنِ السجل، اجمع الفئات، أرسل الملخص — تنتهي قبل أن تنتهي من فنجان قهوتك.

من الداخل، Google Apps Script هي منصة تطوير سريعة مبنية على JavaScript الحديثة (محرك V8، نفس عائلة المحرك خلف Chrome وNode.js). سكربتاتك تعيش في Google Drive الخاص بك وتُنفَّذ على سيرفرات جوجل نفسها، مع خدمات مدمجة لكل منتج من منتجات Workspace. وفقًا لـ الصفحة الرسمية لنظرة عامة على Apps Script من جوجل، هذا يعني أنك تستطيع:

  • قراءة وكتابة وإعادة تنسيق البيانات في جوجل شيت تلقائيًا — وهذا هو محور هذا المقال.
  • إرسال رسائل Gmail مخصصة يُشغّلها محتوى الجدول أو جدول زمني.
  • توليد مستندات Google Docs وعروض Slides من قوالب — عند الطلب أو بمؤقّت.
  • جدولة السكربتات بمشغّلات (Triggers) — يوميًا، كل ساعة، أو عند حدوث تعديل.
  • إضافة قوائم وحوارات وأشرطة جانبية مخصصة إلى Sheets وDocs.
  • سحب بيانات من APIs خارجية مباشرة إلى جدول بيانات، أو نشر السكربتات كتطبيقات ويب.

هناك تفصيلان يوقعان المبتدئين في الحيرة، فلنوضحهما الآن. أولًا، السكربتات تأتي بنوعين: سكربتات مرتبطة (Bound) بجدول بيانات واحد، كما هو الحال معنا اليوم، وسكربتات مستقلة (Standalone) — مشاريع منفصلة تتحدث مع ملفات كثيرة، وهي تطبيقات الويب التي سنصل إليها في المرحلة السادسة. ثانيًا، إذا سبق أن استخدمت أدوات بصرية بدون كود، فأنت تعرف هذا المجال بالفعل: قارنّا Apps Script بمنصات سير العمل في دليل أتمتة n8n، والخلاصة الصريحة أن Apps Script تتفوق في السعر وعمق الوصول لـ Workspace وحرية التخصيص — مقابل كتابة كود بدلًا من رسم مخططات سير العمل.

كيف تفتح المحرر وتشغّل أول سكربت (5 خطوات)

المحرر ليس ملفًا تُحمّله — إنه يعيش داخل جوجل شيت. اتبع هذه الخطوات الخمس بالضبط وستكون لديك شيفرة تعمل خلال عشر دقائق، حتى لو لم تكتب سطر JavaScript واحدًا من قبل.

الخطوة 1 — افتح محرر السكربت. أنشئ جدول بيانات جديدًا في Google Sheets (سيكون هذا هو دفتر مصروفات السلسلة)، ثم اختر الإضافات ← Apps Script من شريط القوائم. يفتح المحرر في تبويب متصفح جديد، مرتبطًا مباشرةً بهذا الجدول بالتحديد.

فتح محرر Google Apps Script من قائمة الإضافات في جوجل شيت لبدء أتمتة جوجل شيت

الإضافات ← Apps Script: بيئة التطوير الكاملة مدمجة أصلًا في جوجل شيت — بلا تثبيت وبلا إعداد.

الخطوة 2 — سمِّ المشروع وتعرَّف على Code.gs. اضغط على "Untitled project" أعلى الصفحة وسمِّه باسم ستتذكره بعد سنة، مثل أتمتة المصروفات — السلسلة. يمنحك المحرر ملفًا واحدًا باسم Code.gs، وهو المكان الذي تعيش فيه شيفرة JavaScript الخاصة بنا. تضيف جوجل الآن أيضًا لوحة مساعد Gemini مباشرةً داخل بيئة التطوير لشرح وتوليد الكود — رفيق إكمال تلقائي مفيد حقًا، رغم أن الجزء 003 من هذه السلسلة سيقدّم جولة كاملة في المحرر.

الخطوة 3 — الصق السكربت الأول. احذف محتوى Code.gs الافتراضي والصق هذا السكربت الكامل والمُعلَّق. إنه يبني سجل مصروفات السلسلة من الصفر: عنوان، صفوف بيانات تجريبية، تنسيق عملة، عمود "شامل الضريبة" يستخدم الدالة المخصصة التي ستضيفها لاحقًا، وصف عنوان مُجمَّد.

/**
 * يبني سجل مصروفات السلسلة من الصفر.
 * شغّله يدويًا من المحرر الآن — قائمة مخصصة
 * ستصل في الجزء 007 من السلسلة.
 */
function setupExpenseLedger() {
  const ss = SpreadsheetApp.getActiveSpreadsheet();
  let sheet = ss.getSheetByName('Expenses') || ss.insertSheet('Expenses');

  // امسح أي محتوى سابق ليكون السكربت متكررًا وآمنًا عند إعادة التشغيل
  sheet.clearContents();

  // 1) صف العنوان: نص أبيض عريض على خلفية باللون الأخضر المميز للمدونة
  sheet.getRange('A1:F1')
       .setValues([['التاريخ', 'الوصف', 'الفئة', 'المبلغ (USD)', 'طريقة الدفع', 'شامل الضريبة']])
       .setFontWeight('bold')
       .setBackground('#13b981')
       .setFontColor('#ffffff');

  // 2) صفوف مصروفات تجريبية — مكتوبة كلها في استدعاء واحد فقط
  sheet.getRange('A2:E6').setValues([
    [new Date(), 'غداء فريق العمل — زيارة عميل', 'وجبات',    48.50,  'بطاقة الشركة'],
    [new Date(), 'تاكسي — نقل من المطار',        'مواصلات',  32.00,  'نقدًا'],
    [new Date(), 'اشتراك برمجي',                 'برمجيات',  120.00, 'بطاقة الشركة'],
    [new Date(), 'مستلزمات مكتبية',              'مستلزمات', 26.75,  'نقدًا'],
    [new Date(), 'تذكرة مؤتمر',                   'تدريب',    250.00, 'بطاقة الشركة']
  ]);

  // 3) عمود الضريبة — يستخدم الدالة المخصصة EXPENSEVAT من هذا المشروع
  sheet.getRange('F2:F6').setFormulas([
    ['=EXPENSEVAT(D2)'],
    ['=EXPENSEVAT(D3)'],
    ['=EXPENSEVAT(D4)'],
    ['=EXPENSEVAT(D5)'],
    ['=EXPENSEVAT(D6)']
  ]);

  // 4) تنسيق عملة لعمودي المبالغ معًا
  sheet.getRange('D2:D1000').setNumberFormat('$#,##0.00');
  sheet.getRange('F2:F1000').setNumberFormat('$#,##0.00');

  // 5) تجميد صف العنوان وتوسيع الأعمدة تلقائيًا لسهولة القراءة
  sheet.setFrozenRows(1);
  sheet.autoResizeColumns(1, 6);

  Logger.log('سجل المصروفات جاهز.');
}

الخطوة 4 — احفظ وشغّل. اضغط Ctrl+S، ثم اضغط Run في شريط الأدوات مع اختيار setupExpenseLedger. في أول تشغيل، ستطلب جوجل تصريحًا — الشاشة التي يسألني عنها كل مبتدئ. بعد انتهائه، سيُظهر العمود F أخطاء #NAME? — وهذا متوقع، لأن الدالة المخصصة EXPENSEVAT غير موجودة بعد. ستضيفها في قسم الدوال المخصصة أدناه، وبمجرد إضافتها ستتحدث هذه الخلايا تلقائيًا.

⚠️ عن شاشة التصريح: ستحذّرك جوجل أن التطبيق "غير موثّق". أنت هنا توثّق سكربتك الخاص على بياناتك الخاصة، فاختر Advanced ← Go to project (unsafe) ووافق. الأذونات المطلوبة (قراءة وتعديل هذا الجدول) تظهر لأن السكربت يستخدمها فعلًا — لا شيء أكثر. إذا طلب منك سكربت لم تكتبه أنت صلاحيات أوسع من ذلك يومًا ما، توقف وتحقق أولًا.

الخطوة 5 — تحقق من النتيجة. ارجع إلى تبويب جدول البيانات: ستجد ورقة Expenses بعنوان أخضر وبيانات تجريبية منسّقة وعمودًا سادسًا بعنوان "شامل الضريبة" (يظهر #NAME? مؤقتًا — سيُحل تلقائيًا بمجرد لصق دالة EXPENSEVAT أدناه). في المحرر، افتح Executions (أو View ← Logs) لترى سجل التشغيل وسطر "سجل المصروفات جاهز." — هذه اللوحة هي مكانك لتشخيص أي فشل مستقبلي.

سجل المصروفات الناتج بصف عنوان أخضر ومبالغ منسّقة وعمود شامل الضريبة، من أول أتمتة Google Apps Script

النتيجة: سجل مصروفات منسّق بعمود "شامل الضريبة" — بُني خلال ثوانٍ، ويعيد بناء نفسه مطابقًا في كل مرة يعمل فيها السكربت.

قراءة وكتابة البيانات: العادة الواحدة التي تفصل السكربتات السريعة عن البطيئة

الآن بعد أن أصبح السجل موجودًا، لنجعل السكربت يفعل شيئًا مفيدًا به: جمع المصروفات حسب الفئة. في الطريق ستتعلم أهم عادة أداء في Apps Script — لأن الفرق بين سكربت ينتهي خلال ثانية وآخر يزحف ليس في ذكاء الكود، بل في طريقة حديثك مع جدول البيانات.

/**
 * يقرأ السجل باستدعاء واحد فقط ويجمع المصروفات حسب الفئة.
 * الملخص المُعاد سيغذّي الحوارات والإيميلات والتقارير
 * في أجزاء لاحقة من السلسلة.
 */
function summarizeExpenses() {
  const sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName('Expenses');
  const lastRow = sheet.getLastRow();

  // حماية: لا يوجد شيء لتلخيصه بعد
  if (lastRow < 2) {
    Logger.log('ورقة Expenses فارغة — شغّل setupExpenseLedger أولًا.');
    return 'لا توجد مصروفات مسجّلة بعد.';
  }

  // اقرأ مرة واحدة: اسحب كل الصفوف إلى الذاكرة معًا، وليس خلية بخلية
  const data = sheet.getRange(2, 1, lastRow - 1, 4).getValues();

  const totals = {};
  for (const row of data) {
    const category = row[2]; // العمود C
    const amount = row[3];   // العمود D
    if (category && amount) {
      totals[category] = (totals[category] || 0) + amount;
    }
  }

  let summary = 'المصروفات حسب الفئة:\n';
  for (const category in totals) {
    summary += '  ' + category + ': $' + totals[category].toFixed(2) + '\n';
  }

  Logger.log(summary);
  return summary;
}

شغّله، ثم افتح سجل التنفيذ: وجبات: 48.50$، برمجيات: 120.00$… محسوبة خلال أجزاء من الثانية. غرفة المحرك هنا هي getValues()، التي تسحب النطاق كاملًا إلى الذاكرة كمصفوفة JavaScript برحلة واحدة فقط. الخطأ الشائع الذي أراه في كود المبتدئين هو استدعاء getValue() داخل حلقة — كل استدعاء هو محادثة منفصلة مع سيرفرات جوجل، وبعد بضع مئات من الصفوف يصبح السكربت بطيئًا أو متعطلًا. القاعدة التي تصمد أمام كل درس أداء في هذه السلسلة (يقيسها الجزء 008 حيًا): اقرأ مرة، احسب في الذاكرة، اكتب مرة.

💡 نصيحة: هذا لا يعني أن الصيغ أصبحت عديمة الفائدة. إذا كانت مهمتك دمجًا أو بحثًا لمرة واحدة، فالميزات الجاهزة لا تزال الإجابة الأسرع — وثّقت عدة أمثلة منها في دليل حيل جوجل شيت، ومنها دمج الأوراق باستخدام VSTACK وHSTACK. السكربتات تستحق وقتها عندما تكون المهمة متكررة أو تحتاج الوصول لتطبيقات أخرى.

ميزات جوجل شيت الجاهزة مقابل Apps Script: اختيار الأداة الصحيحة

السؤال الأول الذي يجب أن يطرحه كل مبتدئ ليس "كيف أُبرمج هذا؟" بل "هل يستحق البرمجة أصلًا؟". جوجل شيت يأتي أصلًا بأدوات جاهزة قوية، واللجوء إلى الكود حيث توجد ميزة بنقرتين فقط يضيف عبء صيانة بلا داعٍ. هذه المقارنة هي عدسة القرار المتكررة في السلسلة — سنعود إليها في كل مرحلة.

المهمة واجهة جوجل شيت الجاهزة Apps Script السكربت يتفوق عندما…
تنسيق عمود قائمة Format، نقرتان setNumberFormat() في الكود يجب أن يُعاد تطبيق التنسيق تلقائيًا كل مرة تصل فيها بيانات جديدة
جمع حسب الفئة SUMIF أو جدول محوري دالة دفعة واحدة من اثني عشر سطرًا الملخص يتكرر عبر أوراق متعددة أو يغذّي إيميلًا أو تقريرًا
إدخال بيانات كتابة صفوف أو نموذج مرتبط مشغّلات النماذج تكتب صفوفًا مُتحقَّقًا منها يجب أن يُحدِّث الإرسال تطبيقات أخرى فورًا
تقرير أسبوعي نسخ، لصق، إرفاق، وإرسال يدويًا مشغّل زمني يبنيه ويرسله تلقائيًا شخص يعيد بناءه كل فترة — أقوى إشارة على الإطلاق

القاعدة التي أعطيها لكل فريق: إذا كان شخص يعيد بناء المهمة كل فترة، برمجها؛ وإذا كانت تجيب عن سؤال لمرة واحدة، فالميزات الجاهزة تفوز. صيغ جوجل شيت لها أيضًا سقف — لا صيغة يمكنها إرسال إيميل، أو إنشاء مستند، أو الاستجابة لإرسال نموذج — وهذا السقف بالضبط هو حيث يبدأ باقي هذا الدليل.

الدوال المخصصة: صيغك الخاصة داخل جدول البيانات

Apps Script لا يكتفي بتحريك البيانات — يمكنه أيضًا توسيع شريط الصيغ نفسه. الدالة المخصصة هي سكربت تستدعيه من خلية تمامًا مثل =SUM()، وهو مثالي للحسابات التي يعيد فريقك إنشاءها باستمرار. إليك واحدة لدفتر مصروفاتنا: دالة تضيف الضريبة يمكنك استخدامها كـ =EXPENSEVAT(120) أو =EXPENSEVAT(120, 0.05).

/**
 * يضيف ضريبة القيمة المضافة إلى مبلغ مصروف صافٍ.
 * يعمل مع رقم واحد أو نطاق كامل،
 * مثال: =EXPENSEVAT(120) أو =EXPENSEVAT(D2:D10).
 * @param {number} amount المبلغ الصافي أو نطاق من المبالغ.
 * @param {number} [rate] نسبة الضريبة كرقم عشري (الافتراضي 0.15).
 * @return المبلغ (أو المبالغ) بعد إضافة الضريبة.
 * @customfunction
 */
function EXPENSEVAT(amount, rate) {
  // اعتبر "عدم التمرير" كأنه النسبة الافتراضية 15%
  rate = (rate === undefined || rate === null || rate === '') ? 0.15 : rate;

  // العملية الحسابية المطبَّقة على كل قيمة
  function applyVat(value) {
    const number = parseFloat(value);
    if (isNaN(number)) {
      return 'أدخل رقمًا، مثال: =EXPENSEVAT(120)';
    }
    return number * (1 + rate);
  }

  // النطاق يصل كمصفوفة ثنائية الأبعاد — طبّق الضريبة على كل خلية
  if (Array.isArray(amount)) {
    return amount.map(function (row) {
      return row.map(applyVat);
    });
  }
  return applyVat(amount);
}

الصقها في نفس المشروع واحفظ (Ctrl+S). إذا كنت قد شغّلت setupExpenseLedger() بالفعل، أعد تشغيلها الآن: العمود F ("شامل الضريبة") سيمتلئ فورًا بالمبالغ شاملة الضريبة — 55.78$، 36.80$، وهكذا — لأن سكربت السجل يكتب صيغ =EXPENSEVAT(D2) في هذا العمود تلقائيًا. يمكنك أيضًا كتابة =EXPENSEVAT(120) في أي خلية فارغة للتأكد: 138.00. تعليقات JSDoc (أسطر @param و@customfunction) ليست زخرفة — إنها ما يجعل الإكمال التلقائي يعرض دالتك وتلميحاتها داخل جدول البيانات. الدالة تقبل أيضًا نطاقًا كاملًا (=EXPENSEVAT(D2:D10)) وتتعامل مع الخلايا الفارغة أو الخاطئة بلطف بدل تعطيل الصيغة.

💡 إذا أظهرت =EXPENSEVAT() خطأً بدل رقم، تحقق من هذه النقاط بالترتيب:
  • #NAME? — الأكثر شيوعًا. تم لصق السكربت في المكان الخطأ أو لم يُحفظ. يجب أن يعيش السكربت في مشروع فُتح عبر الإضافات ← Apps Script من داخل هذا الجدول نفسه — مشروع مستقل أُنشئ من script.google.com لن يسجّل دواله في هذا الملف. ثم احفظ المشروع (Ctrl+S) وجرّب مجددًا؛ الاستدعاء الأول قد يستغرق بضع ثوانٍ ليظهر.
  • الإملاء والإكمال التلقائي. اكتب =EXPENSE — إذا لم تظهر EXPENSEVAT في قائمة الاقتراحات، فمشروع السكربت غير مرتبط بهذا الجدول.
  • فواصل الإعدادات المحلية (Locale). بعض إعدادات اللغة تستخدم فاصلة منقوطة: =EXPENSEVAT(120; 0,05).
  • تظل "تُحمَّل"؟ الدوال المخصصة قادرة على الحساب فقط — إذا أضفت استدعاء إيميل أو واجهة داخلها، فلن تنتهي أبدًا (راجع الحدود أدناه).
استخدام الدالة المخصصة EXPENSEVAT داخل خلية في جوجل شيت لإضافة ضريبة القيمة المضافة إلى مبلغ مصروف

=EXPENSEVAT(120) يُعيد 138.00 — صيغتك الخاصة، مُعرَّفة في أسطر قليلة، قابلة للاستخدام من أي شخص يفتح الجدول.

للدوال المخصصة حدود موثّقة تستحق معرفتها من اليوم الأول، وفقًا لـ دليل الدوال المخصصة من جوجل: يمكنها فقط إعادة قيمة — لا إرسال إيميل، لا فتح حوارات، لا خدمات تتطلب تصريحًا — والنتائج تُعاد حسابها عند تغيّر محتوى الجدول، وهذا قد يتراكم على الجداول الكبيرة. صمّم كل دالة لتُستدعى مرة واحدة لكل نطاق بدل سحبها عبر ألف خلية. الجزء 005 يبني هذا الموضوع في درس كامل بدوال تحويل عملة خاصة بالسلسلة.

المشغّلات (Triggers): أتمتة تعمل وأنت نائم

كل ما سبق يعمل عندما تضغط Run. القوة الخارقة الحقيقية تبدأ عندما تُشغِّل السكربتات نفسها. يسمّي Apps Script هذه المشغّلات، وهي على نوعين. المشغّلات البسيطة (Simple) — دوال باسم onOpen() أو onEdit() — تعمل تلقائيًا لكن بصلاحيات محدودة: لا تستطيع إرسال إيميل أو لمس خدمات تتطلب تصريحًا. المشغّلات القابلة للتثبيت (Installable) تُنشأ من صفحة Triggers، وتعمل بصلاحياتك المُعتمَدة، وتدعم أحداثًا أكثر، منها إرسال النماذج والجداول الزمنية. هذا الفرق مهم للتصميم، ويُشرَّح كل نوع مشغّل بالتفصيل في الجزء 009.

لنُوصِّل المثال الكلاسيكي: إيميل ملخص صباحي. أضف هذه الدالة إلى المشروع.

/**
 * يعمل تلقائيًا كل صباح عبر مشغّل زمني.
 * يرسل إيميلًا واحدًا بملخص المصروفات — تحقق من حصص
 * الإيميل الرسمية قبل توسيع هذا لفريق كبير.
 */
function sendDailyExpenseSummary() {
  const summary = summarizeExpenses(); // إعادة استخدام الدالة التي بنيتها بالفعل
  MailApp.sendEmail(
    Session.getEffectiveUser().getEmail(), // إيميل صاحب المشغّل — أو ثبّت إيميلك، مثل '[email protected]'
    'ملخص المصروفات اليومي',
    summary
  );
}

ثم، في المحرر، اضغط أيقونة Triggers (الساعة، في الشريط الجانبي) ← Add Trigger ← اختر sendDailyExpenseSummary، مصدر الحدث Time-driven، النوع Day timer، الساعة 7–8 صباحًا ← Save. صرِّح مرة واحدة، ومن صباح الغد سيصلك الملخص في بريدك دون أي تدخل من أحد. تفصيل متعمَّد واحد: السكربت يستخدم Session.getEffectiveUser() — هوية صاحب المشغّل — لأن الدالة المشابهة getActiveUser() قد تُعيد عنوانًا فارغًا للحسابات الشخصية، ما قد يُعطِّل استدعاء الإيميل. إذا كنت تفضّل عدم الغموض تمامًا، استبدل هذا الوسيط بعنوانك الخاص بين علامتي اقتباس. لأنه يعمل على سيرفرات جوجل، يستمر حتى لو كان جهازك مغلقًا — لكن لاحظ أن تطبيق Sheets للجوال لا يستطيع تشغيل سكربتات أو الضغط على أزرار مخصصة عند الطلب؛ فقط المشغّلات التي تعمل من جهة السيرفر تستمر أثناء التنقل.

إضافة مشغّل زمني في محرر Google Apps Script لإرسال ملخص مصروفات يومي لجوجل شيت بالبريد

لوحة Triggers: دالة واحدة، جدول زمني واحد، والأتمتة تتوقف عن الاعتماد على أن يتذكّر أحد تشغيلها.

⚠️ صمّم ضمن حصص المنصة: كل تنفيذ سكربت على الحسابات الشخصية محدود بحوالي ست دقائق، والحصص اليومية تُطبَّق لكل حساب، وحدود إرسال الإيميل أقل بكثير على الحسابات الشخصية منها على خطط Google Workspace المدفوعة. تحتفظ جوجل بالأرقام الحالية في صفحتها الرسمية حصص Apps Script — تحقق منها قبل تصميم أي شيء يُرسل لمئات الأشخاص أو يعالج بيانات ضخمة. مهمة تموت عند جدار الست دقائق في الإنتاج (موضوع الجزء 021 بالكامل) هي طقس عبور كلاسيكي.
❤️

ادعم المحتوى

تبرعك يساعدنا على الاستمرار

الأخطاء الأربعة التي يقع فيها كل مبتدئ أولًا (وحلولها)

بعد سنوات من إعداد السكربتات لزملاء غير تقنيين، أستطيع التنبؤ أين سيخطئ الأسبوع الأول. أصلح هذه الأربعة الآن وستتجنب معظم الإحباط.

1. الذعر عند شاشة التصريح

أول تشغيل لأي سكربت يطلب صلاحية، وتحذير "لم تتحقق جوجل من هذا التطبيق" يُقنع كثيرًا من القرّاء أنهم كسروا شيئًا. أنت لم تكسر شيئًا. بالنسبة لسكربتاتك الخاصة، اتبع Advanced ← Go to project مرة واحدة لكل سكربت. ما يستحق الحذر فعلًا هو سكربت أرسله لك شخص آخر — اقرأ قائمة الصلاحيات قبل الموافقة على أي شيء لا تستطيع تفسيره.

2. تعديل الكود وتشغيل الدالة الخطأ

المحرر يُشغِّل أي دالة مُختارة في القائمة المنسدلة بشريط الأدوات، وبعد لصق عدة دوال يستمر المبتدئون في إعادة تشغيل الدالة القديمة ويتساءلون لماذا لم يتغيّر شيء. قبل الضغط على Run، تحقق من القائمة المنسدلة. هذه العادة الواحدة تمنع معظم رسائل "الكود عندي معطّل".

3. التحدث مع جدول البيانات داخل حلقة

قابلت هذا الخطأ أعلاه، لكنه يستحق التكرار لأنه يسبب سكربتات بطيئة وأخطاء حصص معًا: كل getValue() أو setValue() داخل حلقة هو رحلة سيرفر منفصلة. اجمع بـ getValues() وsetValues()، احسب في الذاكرة، واكتب النتيجة مرة واحدة.

4. الاختبار على بيانات حية ومشتركة

النسخة الأولى من أي سكربت يجب أن تعمل على نسخة من جدول البيانات، وليس أبدًا على السجل الذي يستخدمه محاسبك بالفعل. التجارب المدمِّرة (حذف صفوف، الكتابة فوق نطاقات، إيميلات جماعية) مكانها نسخة اختبار — وحين تجدول لاحقًا مهامًا مدمِّرة، نمط "التشغيل التجريبي" في الجزء 020 سيحميك.

خريطة السلسلة: 8 مراحل من أول سكربت إلى أتمتة Workspace كاملة

معظم محتوى Apps Script يُعلِّم حيلًا منفصلة؛ هذه السلسلة تُعلِّم بناءً واحدًا مترابطًا. كل جزء يدفع نفس دراسة الحالة قُدمًا — شركة صغيرة تُؤتمت سير عمل تقديم مصروفاتها والموافقة عليها وإعداد تقاريرها — بحيث ما تبنيه اليوم يظل يعمل، مُطوَّرًا لا مُعادَ كتابته، في الأجزاء الأخيرة. إليك الطريق الكامل عبر 48 جزءًا في ثماني مراحل:

المرحلة الأجزاء المحور ماذا ستبني
1. الأساسيات (أنت هنا) 001–012 المحرر، الدوال المخصصة، القوائم، معالجة البيانات، المشغّلات، الحماية سجل المصروفات، مُؤتمَتًا على مستوى الجدول
2. نماذج جوجل 013–017 FormApp، معالجة الردود، بدائل الواجهة الأمامية نموذج تقديم مصروفات ← خط أنابيب إلى السجل الحي
3. Gmail 018–023 البحث والتصنيفات، الحصص، الدمج البريدي سير عمل موافقة على المصروفات عبر الإيميل
4. مستندات جوجل 024–028 DocumentApp، تقارير بقوالب، تصدير PDF تقارير مصروفات PDF مُولَّدة تلقائيًا
5. مواقع جوجل 029–032 Google Sites الحديث، تطبيقات ويب مضمَّنة لوحة مصروفات ذاتية الخدمة على موقع
6. تطبيقات الويب 033–039 HTML Service، النشر، الأمان تطبيق ويب للموافقة على المصروفات
7. واجهات مضمَّنة 040–042 حوارات وأشرطة جانبية داخل Sheets/Docs شريط جانبي لإدارة المصروفات داخل السجل
8. ما بعد الكتاب 043–048 V8، clasp وGitHub، الإضافات، Gemini، اختيارات التقنية مشروع ختامي: النظام الكامل مُجمَّعًا

على طول الطريق، تُصدر كل مرحلة دعمًا قابلًا للتنزيل — جداول بيانات بداية، مكتبات مقتطفات كود، قوالب مستندات، واختبارات مرحلية — يُعلَن عنها داخل الأجزاء المعنية فور نشرها. مستخدمو Gmail يحصلون على مكافأة مبكرة أيضًا: عندما تصل المرحلة الثالثة، سنربطها بدليل تصنيفات وفلاتر Gmail الموجود بالفعل على المدونة، حتى يمتلك غير المبرمجين في فريقك طريقًا أيضًا.

💡 هل تريد النسخة المختصرة أولًا؟ إذا كنت تفضّل شرحًا تمهيديًا سريعًا قبل الدخول في مشروع كامل، راجع دليلنا شرح Google Apps Script للمبتدئين، ثم عد إلى هنا لتبدأ المشروع العملي الكامل خطوة بخطوة.

اختبار سريع وتحدٍ عملي

قبل الملخص، تمرينان قصيران لتحويل هذا المقال من مادة قراءة إلى ذاكرة عضلية. الأول يختبر مفهوم المشغّل؛ الثاني يُجهِّز المادة الخام للجزء 002.

🧠 اختبار سريع: أنشأت دالة باسم onEdit() في مشروعك تُسجِّل رسالة كلما تغيّرت أي خلية — ولم تفتح صفحة Triggers أبدًا. هل ستعمل عند تعديل الجدول؟ وهل يمكن لنفس الدالة استدعاء MailApp.sendEmail() بشكل قانوني؟ اكتب إجابتك في التعليقات — كلا الإجابتين موجودتان في قسم المشغّلات أعلاه.
🛠️ تحدٍ عملي: أنشئ دفتر المصروفات، شغّل السكربتات الثلاثة من هذا الدليل، وجدول مشغّل الملخص اليومي. ثم اكتب المهمة الأسبوعية الواحدة التي ستؤتمتها أولًا لو سمح الكود بذلك. هذه القائمة هي مدخل الجزء 002، الذي يحسم بالضبط متى تتفوق الصيغة على السكربت — وأين يتفوق الاثنان معًا.

الملخص وقائمة التحقق العملية

تمتلك الآن الأساس الكامل للسلسلة: نموذج المنصة، بيئة تطوير تعمل، ثلاثة سكربتات جاهزة للاستخدام الفعلي، والحكمة لمعرفة متى لا تُبرمج. قبل الانتقال، تأكد من كل نقطة:

  • فتحت المحرر من الإضافات ← Apps Script داخل دفتر مصروفاتك.
  • شغّلت setupExpenseLedger()، صرّحت مرة واحدة، ورأيت السجل المنسَّق يظهر.
  • شغّلت summarizeExpenses() وقرأت إجماليات الفئات في سجل التنفيذ.
  • حافظت على وصول مُجمَّع للبيانات — استدعاء واحد لـ getValues()، لا حلقة من getValue().
  • أضفت EXPENSEVAT() واستخدمتها داخل خلية حقيقية كدالة مخصصة.
  • جدولت مشغّلًا زمنيًا واحدًا وتأكدت من التشغيل في لوحة Triggers/Executions.
  • تحققت من صفحة الحصص الرسمية قبل التفكير في أي شيء يُرسل إيميلات أو يعمل طويلًا.
  • حفظت هذا المقال في المفضلة — إنه نقطة الارتكاز التي يعود إليها كل جزء لاحق.

كل جزء مستقبلي يفترض تحقق هذه النقاط الثماني. إذا شعرت بعدم اليقين في أي منها، أعد تشغيل الخطوة المطابقة — السكربتات مصمَّمة لتكون متكررة وآمنة، فإعادة بناء السجل لا تكلّفك شيئًا.

الأسئلة الشائعة

❓ هل Google Apps Script مجانية الاستخدام؟

نعم. Google Apps Script مجانية تمامًا مع أي حساب Google شخصي أو اشتراك Google Workspace، وتعمل السكربتات على سيرفرات جوجل نفسها. لا شيء يحتاج تثبيتًا. تُطبَّق حصص استخدام عادل — وقت التنفيذ، حجم الإيميلات، وعدد المشغّلات تختلف بين الحسابات الشخصية وحسابات Workspace — لذا تحقق من صفحة الحصص الرسمية لجوجل قبل التوسّع.

❓ هل أحتاج معرفة JavaScript لمتابعة هذا الدليل؟

معرفة JavaScript الأساسية تساعد، لكنك لا تحتاج خلفية برمجية. تشرح هذه السلسلة كل مفهوم JavaScript في أول ظهور له، وكل درس يأتي بسكربتات كاملة جاهزة للنسخ واللصق. إذا كنت تستطيع كتابة صيغة جدول بيانات ومتابعة خطوات مرقّمة، فبإمكانك تشغيل كل مثال في هذا الدليل وفهم ما يفعله.

❓ هل تستطيع Google Apps Script إرسال إيميلات تلقائيًا؟

نعم. دوال مثل MailApp.sendEmail() تسمح للسكربتات بإرسال رسائل Gmail من أي مشغّل — بجدول زمني، بعد إرسال نموذج، أو عند تغيّر جدول بيانات. الحسابات الشخصية لها حدود إيميل يومية أصغر بكثير من حسابات Workspace المدفوعة، لذا صمّم سير العمل الجماعي حول حصص جوجل الموثّقة بدل افتراض إرسال بلا حدود.

❓ ما الفرق بين المشغّلات البسيطة والقابلة للتثبيت؟

المشغّلات البسيطة مثل onOpen() وonEdit() تعمل تلقائيًا بصلاحيات محدودة — لا تستطيع إرسال إيميلات أو استدعاء خدمات تتطلب تصريحًا. المشغّلات القابلة للتثبيت تُنشأ يدويًا من صفحة Triggers، وتعمل بكامل صلاحيات حسابك المُمنوحة، وتدعم أحداثًا أكثر مثل onFormSubmit والجداول الزمنية، وتظهر في لوحة التنفيذ الخاصة بك.

❓ كم يمكن أن يستمر تشغيل سكربت Google Apps Script؟

الحسابات المجانية لها حد ست دقائق لكل تنفيذ — أحد أول الجدران التي يصطدم بها المبتدئون. حسابات Workspace المدفوعة لها حدود أطول، ويختلف إجمالي وقت التشغيل اليومي حسب نوع الحساب. يجب تصميم المهام الطويلة لتتوقف وتستأنف عبر عدة تنفيذات، وهذا بالضبط ما يغطيه الجزء 021 من السلسلة بعمق.

❓ هل تستطيع Apps Script أتمتة Gmail وDocs وDrive — وليس فقط Sheets؟

نعم — وهذا الوصول عبر التطبيقات هو قوتها الحقيقية. سكربت واحد يمكنه قراءة ردود نموذج، تحديث جدول بيانات، توليد تقرير Google Docs، حفظه في Drive، وإرسال إيميل لمدير عبر Gmail. تبني السلسلة بالضبط خط الأنابيب هذا مرحلةً بعد مرحلة، بدءًا من أساسيات Sheets التي أعددتها في هذا المقال.

الخلاصة: سكربت واحد، ساعات ترجع إليك

Google Apps Script تحوّل العمل الذي تكرره إلى عمل يعمل بنفسه — والآن لديك الدليل في جدول بياناتك: سجل يبني نفسه، ملخص يحسب نفسه، دالة مخصصة يستطيع زملاؤك كتابتها كأي صيغة، ومشغّل يُسلِّم التقرير الصباحي دون أن يفتح أحد متصفحًا. لم يتطلب أي من هذا تثبيت شيء أو إنفاق أي مبلغ.

خطوتك التالية متعمَّدة، لا عشوائية: أحضر مهامك الثلاث الأكثر تكرارًا في جدول البيانات إلى الجزء 002: دوال الجداول مقابل Google Apps Script (قادم قريبًا)، حيث نحسم — ببناءات جنبًا إلى جنب — متى تكون الصيغة الإجابة الصحيحة ومتى يستحق الكود مكانه. العادة التي تُثبِّتها اليوم، برمجة الأشياء التي يعيد شخص بناءها كل فترة، هي نفس العادة التي توسّعها سلسلة الـ48 جزءًا بالكامل إلى نظام أتمتة متكامل لـ Workspace.

🚀 سلسلة احتراف Google Apps Script · الجزء 001 مكتمل

هذا يُنهي الجزء 001 من 48 — المقال المرتكز للسلسلة. أعددت المحرر، بنيت ولخّصت سجل مصروفات السلسلة، أنشأت دالة مخصصة، وجدولت أول مشغّل. القادم: الجزء 002: دوال الجداول مقابل Google Apps Script والجزء 003: محرر Google Apps Script — بيئتك السحابية، الإكمال التلقائي والتصحيح (كلاهما ينشر قريبًا؛ سيُربطان هنا فور نشرهما).

أنت تقرأ نقطة انطلاق السلسلة — احفظ هذه الصفحة في المفضلة؛ ستُضاف روابط كل جزء جديد هنا فور نشره.

🔁 وجدت هذا الدليل مفيدًا؟

شاركه مع زميل لا يزال يعيد بناء نفس جدول يوم الاثنين — واترك تعليقًا تخبرنا فيه أي مهمة ستؤتمتها أولًا لو توقفت السكربتات عن المقاومة.

📬
مختبر احتراف Apps Script

ابنِ أول أتمتة Workspace معنا

احصل على كل جزء جديد من سلسلة "احتراف Google Apps Script" في بريدك — سكربتات جاهزة للنسخ، جداول بيانات بداية، وقوائم تحقق للأتمتة، مجانًا.

🔒 مجاني 100%. بلا إزعاج أبدًا. إلغاء الاشتراك بنقرة واحدة في أي وقت.

أضف وادي التكنولوجيا كمصدر مفضّل على جوجل

اجعل مقالاتنا تظهر لك أولًا في نتائج البحث والأخبار

أضفنا الآن
مصطفى أمان
مصطفى أمان
صانع محتوى تعليمي تقني على مدونتي وعلى قناة اليوتيوب. وهدفي من هذا المحتوى هو محو الأمية المتعلقة بمجال تكنولوجيا المعلومات حتى نبدأ من حيث انتهى الأخرين.
تعليقات



    /*إشعار رسالة الكوكيز*/