تحليل البياناتجداول بيانات جوجلدوال الحوسبة السحابية

جداول بيانات جوجل: كيفية الاستعلام باستخدام الشهر

دليل أكاديمي متكامل لشرح كيفية استخراج وتصفية البيانات بناءً على الشهر في جداول بيانات جوجل باستخدام دالة QUERY وفهم الفهرسة الصفرية.

تاريخ النشر

تمثل معالجة البيانات وتحليل السلاسل الزمنية ركيزة جوهرية في منظومة ذكاء الأعمال وصناعة القرارات المؤسسية المعاصرة. وتبرز بيئة جداول بيانات جوجل (Google Sheets) كواحدة من أكثر المنصات السحابية مرونة وفاعلية في إدارة البيانات الضخمة، حيث تتيح للمحللين والمهندسين أدوات فائقة القدرة تتجاوز الوظائف الحسابية التقليدية. ومن بين هذه الأدوات، تتصدر دالة الاستعلام الشاملة المعروفة باسم QUERY واجهة التطبيقات المتقدمة، بوصفها محركاً برمجياً متكاملاً يتيح معالجة مجموعات البيانات المعقدة وتصفيتها وهيكلتها استناداً إلى لغة برمجية شبه متطابقة مع لغة الاستعلامات البنيوية (SQL).

تكتسب عمليات الاستعلام الزمني المعتمدة على الأشهر أهمية بالغة عند التعامل مع السجلات المالية، وسجلات الأنشطة التشغيلية، ومؤشرات الأداء الوظيفي، حيث تتطلب هذه المهام تجميع المعاملات وتفكيكها دورياً لفهم الاتجاهات ومراقبة التقلبات الموسمية. وعلى الرغم من المظهر البسيط لصياغة الدوال، فإن الاستعلام عن الأشهر داخل جداول بيانات جوجل ينطوي على تعقيدات تقنية فريدة تنبع من طبيعة المعمارية التحتية لمحرك Google Visualization API Query Language، والذي يعتمد نظام الفهرسة الصفرية (Zero-Based Indexing) في قراءة الشهور، مما يخلق فجوة منهجية شائعة بين الترقيم الحسابي البشري للتقويم والمصفوفات البرمجية الداخلية للنظام.

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

Google sheets query month
Google sheets query month
جدول المحتويات

1. مقدمة تأسيسية حول دالة QUERY وأهميتها في تحليل السلاسل الزمنية

1.1 المفهوم النظري لدالة QUERY ولغة استعلام تصوير البيانات (GViz API)

تستند دالة QUERY في جداول بيانات جوجل إلى معيار برمجي طورته شركة جوجل يُعرف باسم Google Visualization API Query Language (واجهة برمجة تطبيقات تصوير البيانات من جوجل). تم تصميم هذه اللغة لتوفير واجهة تفاعلية موحدة تتيح للمستخدمين تنفيذ عمليات المعالجة البنيوية والتنقية والفرز والتجميع الحسابي على البيانات الجدولية بسرعة فائقة، مستعيرة البنية النحوية الأساسية للغة الاستعلام الهيكلية الشهيرة SQL، ولكن مع مواءمتها لتناسب بيئة الجداول الحسابية الموزعة سحابياً.

عند إجراء مقارنة هيكلية بين دالة QUERY ودوال التصفية التقليدية مثل دالة FILTER أو دوال البحث والمطابقة مثل VLOOKUP و INDEX/MATCH، يتجلى الفارق الجوهري في الكفاءة والقدرة التجميعية؛ فبينما تتطلب الدوال الكلاسيكية تركيب صيغ متداخلة ومعقدة لأداء مهام التصفية المشروطة المصحوبة بحساب المتوسطات أو المجاميع، تقوم دالة QUERY بجميع هذه العمليات المعقدة في عبارة نصية استعلامية واحدة ومضغوطة. هذا النمط المعماري يقلل من الحمل الحسابي على متصفح الويب وخوادم السحابة، مما يعزز سرعة استرجاع النتائج ويقلل زمن الاستجابة في قواعد البيانات الضخمة التي تحتوي على عشرات الآلاف من الصفوف الزمنية.

إن الميزة الأبرز للمعالجة الزمنية عبر دالة QUERY تكمن في قدرتها على التجريد الحسابي للبيانات المؤرخة؛ حيث يقوم محرك GViz بتحليل القيم التاريخية المخزنة كأرقام تسلسلية وتفكيكها إلى مكوناتها الأولية (اليوم، الشهر، السنة، الساعة) بصورة مباشرة داخل الذاكرة المؤقتة لمحرك الاستعلام، دون الحاجة لإنشاء أعمدة مساعدة في ورقة العمل الأصلية، مما يحافظ على نظافة التصميم الهيكلي للملفات ويزيد من مرونة التحليل التراكمي للسلاسل الزمنية.

1.2 طبيعة تمثيل التواريخ في بيئة جداول بيانات جوجل

لفهم الآلية التي يتعامل بها محرك الاستعلام مع الشهور، لا بد من استيعاب النموذج الرياضي الذي تتبناه جداول بيانات جوجل في تمثيل التواريخ. تماماً كأغلب أنظمة الجداول الحسابية الحديثة، يتم تخزين التاريخ داخلياً كـ رقم تسلسلي نسبي يعبر عن عدد الأيام المنقضية منذ اليوم المرجعي الأساسي، وهو تاريخ 30 ديسمبر 1899. فعلى سبيل المثال، يمثل الرقم التسلسلي 1 تاريخ 31 ديسمبر 1899، ويمثل الرقم 44927 تاريخ 1 يناير 2023. أما الأوقات والكسور الزمنية، فتُخزن ككسور عشرية ملحقة بالرقم التسلسلي، حيث يمثل الجزء العشري 0.5 مرور نصف يوم أي الساعة الثانية عشرة ظهراً.

تنشأ العديد من الإشكاليات التحليلية نتيجة الخلط بين تنسيق العرض المرئي للخلية (Visual Formatting) و القيمة المخزنة الفعلية (Underlying Value). قد تظهر خلية ما نصاً منسقاً مثل “15-فبراير-2023” أو “2023/02/15″، بينما في البنية الداخلية للجدول هي مجرد رقم صحيح مجرد. يتعامل محرك الاستعلام GViz مع هذا النوع الأصلي للبيانات بعد التعرف عليه تلقائياً كنوع “Date” أو “DateTime”، ولا يلتفت إلى طريقة التنسيق الظاهرية في الخلية، ما لم يتم تحويل التاريخ عمداً إلى نص بواسطة إدخال خاطئ أو استخدام دوال نصية.

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

1.3 أهداف الاستعلام الزمني المبني على الأشهر ومجالات تطبيقه

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

علاوة على التطبيقات المالية، يمتد نطاق الاستعلام الشهري إلى قطاعات التسويق وإدارة علاقات العملاء (CRM)، حيث يُستخدم في تجزئة الأنشطة السلوكية للمستهلكين ومراقبة الظواهر الموسمية كارتفاع الطلب في شهور الإجازات أو تراجعه في فترات أخرى. يتيح الاستعلام عبر الأشهر تتبع مؤشرات الأداء الحيوية (KPIs) مثل معدل الاحتفاظ بالعملاء، ومعدلات التحويل، وحجم التفاعل مع الحملات الترويجية المرتبطة بمناسبات زمنية محددة، مما يمنح متخذي القرار رؤى عميقة مبنية على الأدلة الرقمية.

كما يلعب الاستعلام الشهري دوراً محورياً في تنظيم وتدقيق البيانات الضخمة (Big Data) الموزعة على فترات زمنية ممتدة؛ فبدلاً من تحميل الجداول بملايين العمليات وتصفيتها يدوياً، تتيح جمل الاستعلام تقسيم هذه المستودعات الرقمية إلى شرائح زمنية متجانسة يسهل أرشفتها وفهرستها ومراجعتها، مما يحد من تراكم السجلات التالفة ويسرع عمليات استخلاص المعرفة من البيانات التاريخية.

2. الأسس البرمجية لمعالجة الأشهر: فك شفرة الفهرسة الصفرية (Zero-Index System)

2.1 المنطق الحاسوبي وراء الفهرسة من الصفر في دالة Month()

يعد مفهوم الفهرسة الصفرية (Zero-Based Indexing) أحد المفاهيم الأساسية في علوم الحاسوب وهندسة البرمجيات، حيث تبدأ مصفوفات البيانات من الرقم 0 بدلاً من الرقم 1. ونظراً لأن محرك Google Visualization API مبني في أصله بالاعتماد على بيئة لغة JavaScript، فقد ورث المحرك القواعد الصارمة المتبعة في كائن التاريخ (Date Object) القياسي في جافاسكريبت، والتي تعود جذورها التاريخية إلى معايير لغة البرمجة C ومكتبات POSIX القديمة لتنسيق الوقت.

وفقاً لهذا النظام البرمجي، يتم تمثيل أشهر السنة بمصفوفة تتراوح عناصرها الحسابية بين 0 و 11 حصراً. وبناءً على ذلك، يتم إسناد القيمة الرقمية 0 إلى شهر يناير (كانون الثاني)، والقيمة 1 إلى شهر فبراير (شباط)، وصولاً إلى القيمة 11 التي تمثل شهر ديسمبر (كانون الأول). هذا التوزيع يولد صدمة معرفية لدى العديد من مستخدمي جداول البيانات المعتادين على المنطق التقويمي البشري، الذي يعتبر يناير هو الشهر رقم 1 وديسمبر هو الشهر رقم 12.

ينعكس هذا الترقيم الصفري مباشرة على المنطق الشرطي عند صياغة عبارة الاستعلام داخل دالة QUERY. فإذا كتب المحلل شرطاً برمجياً بصيغة month(A) = 1 معتقداً أنه يستخرج سجلات شهر يناير، فإن المحرك سيقوم في الواقع بإرجاع سجلات شهر فبراير بالكامل، نظراً لأن القيمة 1 هي الفهرس البرمجي لشهر فبراير. هذا التباين يستوجب وعياً تقنياً دقيقاً لتفادي تشويه المؤشرات الإحصائية ومخرجات التقارير المؤسسية.

2.2 التحليل الرياضي لقاعدة التعويض الإزاحي (+1)

لردم الهوة بين الفهرسة الصفرية البرمجية لمحرك GViz والترقيم الطبيعي المعتمد عالمياً للأشهر، تم ابتكار وتثبيت ما يُعرف بـ قاعدة التعويض الإزاحي الحسابي (+1 Offset Rule). تقوم هذه القاعدة الرياضية البسيطة على إضافة المقدار الصحيح (1+) إلى ناتج الدالة الداخلية month() ضمن نص الاستعلام، وذلك لإعادة مواءمة القيم البرمجية المسترجعة (0 إلى 11) لتتطابق تماماً مع القيم التقويمية القياسية (1 إلى 12).

تتم صياغة المعادلة الرياضية داخل جملة الشرط على النحو التالي: month(A) + 1 = N، حيث يمثل الحرف A العمود المستهدف المحتوي على التواريخ، ويمثل الرمز N الرقم التقويمي الحقيقي للشهر المستهدف (مثلاً: 1 ليناير، 2 لفبراير، 3 لمارس، وهكذا حتى 12 لديسمبر). عندما يستقبل المحرك هذا التعبير، يقوم أولاً بتنفيذ دالة month(A) التي تستخرج الفهرس الصفري للخلية، ثم يضيف 1 إلى هذا الناتج في خطوة حسابية وسيطة، وأخيراً يقارن الناتج المجمع بالرقم N المعطى في الشرط.

تتجلى خطورة إغفال المعامل الإزاحي (+1) في التحليلات التراكمية الدورية؛ فعند كتابة month(A) = 12 دون إضافة الواحد، لن يُرجع الاستعلام أي نتائج على الإطلاق لأن محرك GViz لا ينتج أبداً الفهرس 12، مما يوهم المستخدم خطأً بعدم وجود بيانات لشهر ديسمبر، في حين أن كتابة month(A) = 0 ستسترجع بيانات يناير بنجاح ولكن عبر كود غامض يفتقر لمقروئية الصيانة البرمجية ويثير الالتباس لدى المراجعين الآخرين للجدول.

2.3 مقارنة سلوك دوال التاريخ الأصلية مقابل دوال التاريخ داخل QUERY

تتضمن بيئة جداول بيانات جوجل مجموعتين متمايزتين من الدوال للتعامل مع التواريخ: الدوال الأصلية المباشرة لأوراق العمل (Built-in Sheet Functions)، والدوال القياسية المدمجة داخل محرك الاستعلام (GViz Query Functions). من الضروري للغاية إدراك الفوارق السلوكية والبنيوية العميقة بين هذين النموذجين لتفادي الخلط الإجرائي أثناء بناء النماذج المعقدة.

تعتمد الدالة الأصلية MONTH(cell) المعرفة في واجهة الجدول الأساسية نظام الترقيم البشري المباشر (1-12)؛ فإذا طبقت الدالة على خلية تحتوي تاريخاً في شهر يناير، ستكون النتيجة فوراً هي الرقم 1. في المقابل، فإن دالة month(column) المكتوبة داخل جملة نص الاستعلام تخضع حصراً لقواعد GViz الفهرسية وتنتج قيماً بين 0 و 11. هذا التناقض الصارخ يعني أن استخدام نفس المسمى اللغوي يحمل دلالات ومعالجات مختلفة تماماً باختلاف البيئة التنفيذية.

لحماية التراكيب البرمجية من التشويش الدلالي، يجب معاملة نص الاستعلام كبيئة معزولة برمجياً (Sandbox Engine). لا يمكن إدراج دوال الجدول المباشرة مثل YEAR() أو TODAY() داخل نص الاستعلام مباشرة إلا عبر تقنيات الدمج النصي، بينما تقتصر الدوال المسموح بها داخل الجملة الشرطية على المعايير المصرح بها في توثيق دوال المقاييس العددية القياسية لـ GViz مثل year(), month(), day(), now(), curdate().

3. الصيغة التركيبية الأساسية للاستعلام عن شهر محدد في جداول بيانات جوجل

3.1 التشريح الدقيق لمعادلة الاستعلام القياسية

تتألف دالة QUERY من ثلاثة وسائط برمجية رئيسية تُكتب بالصيغة الهيكلية العامة التالية: =QUERY(data, query, [headers]). لفهم كيفية استخراج شهر محدد بكفاءة، يجب تشريح كل مكون من هذه المكونات بعناية فائقة وتحديد دوره الوظيفي في توجيه تدفق البيانات المعالجة.

يمثل الوسيط الأول data النطاق الجغرافي للبيانات المصدرية في ورقة العمل (مثال: A1:E1000). يتم تمرير هذا النطاق كمرجع مصفوفي يقرأ منه المحرك سجلات البيانات. أما الوسيط الثاني query، فهو النص التوجيهي المحاط بعلامات اقتباس مزدوجة، والذي يحتوي على أوامر SQL المصغرة. يتضمن هذا النص عبارة SELECT لتحديد الأعمدة المراد إظهارها في المخرجات، متبوعة بعبارة WHERE التي تستضيف المنطق الشرطي لتصفية السجلات بناءً على دالة الشهر.

تتكامل العناصر داخل الوسيط النصي لتشكل جملة استعلام محكمة، مثل: “select A, B, C where month(A) + 1 = 3”. في هذا التركيب، تفيد عبارة select A, B, C باسترجاع الأعمدة الثلاثة الأولى فقط من النطاق المصدري، بينما تلزم عبارة where month(A) + 1 = 3 المحرك بفحص كل صف في العمود A وتطبيق المعامل الإزاحي على شهره، واستبقاء الصفوف التي يكون ناتجها مساوياً للرقم 3 (أي شهر مارس) فقط، مع استبعاد بقية الصفوف من مصفوفة الإخراج النهائية.

3.2 إدارة وترميز وسيطة صفوف العناوين (Headers Argument)

يعد الوسيط الثالث الاختياري في دالة الاستعلام، وهو وسيط headers، أحد أكثر المعاملات إثارة للأخطاء الصامتة عند إهماله. يقبل هذا الوسيط قيمة رقمية صحيحة تمثل عدد الصفوف الموجودة في أعلى النطاق المصدري والمخصصة لعناوين الأعمدة (Header Rows)، والتي يجب استثناؤها من عمليات المقارنة المنطقية والتصفية الرياضية.

عند تعيين القيمة 1 لهذا الوسيط، يفهم محرك الاستعلام صراحةً أن الصف الأول في النطاق المحدد (مثل الصف A1:C1) يحتوي على تسميات نصية وصفية، فيقوم بتثبيتها وعرضها في مخرجات الاستعلام كترويسة دون محاولة تمريرها عبر دالة month(A). أما إذا تم تعيين القيمة إلى 0، فإن المحرك سيعامل جميع الصفوف كبيانات خام، وهو ما يُستخدم عندما لا يتضمن النطاق الممرر أي ترويسات علوية.

تكمن الخطورة في ترك هذا الوسيط فارغاً (القيمة الافتراضية -1)؛ إذ يلجأ المحرك في هذه الحالة إلى التخمين التلقائي لنوع البيانات بناءً على الأغلبية الإحصائية في العمود. فإذا احتوى عمود التاريخ على صف عناوين نصي واحد وآلاف التواريخ، فقد يقوم المحرك بدمج خلايا نصية متعددة في خلية عنوان واحدة مشوهة، أو قد يحاول تطبيق دالة الشهر على الخلية النصية في الصف الأول مما يسبب تشوهاً في هيكل التقرير المستخرج، لذا توصي أفضل الممارسات الهندسية دائماً بتحديد وسيط العناوين صراحة برقم ثابت (عادة 1).

3.3 خطوات التنفيذ العملي لاستخراج بيانات شهر محدد (فبراير نموذجاً)

لتطبيق هذه المفاهيم نظرياً وعملياً، نفترض وجود قاعدة بيانات للمبيعات تقع في النطاق A1:D100، حيث يحتوي العمود A على تواريخ الفواتير، والعمود B على أسماء العملاء، والعمود C على فئات المنتجات، والعمود D على القيمة الإجمالية للصفقة. الهدف هو استخراج كافة المعاملات التجارية التي تمت حصراً خلال شهر فبراير.

تتم كتابة المعادلة التنفيذية في الخلية المستهدفة لبدء التقرير وفق الصياغة الصارمة التالية:

=QUERY(A1:D100, “select A, B, C, D where month(A) + 1 = 2”, 1)

تبدأ خوارزمية التنفيذ بقراءة النطاق A1:D100 مع عزل الصف رقم 1 كترويسة ثابتة للمخرجات. بعد ذلك، يقوم المحرك بمسح تسلسلي لكافة الصفوف من 2 إلى 100 في العمود A، حيث يحول كل تاريخ إلى رقمه التسلسلي الداخلي، ثم يمرره لدالة month() التي تعيد القيمة 1 لتواريخ فبراير، ثم يضيف المعامل الإزاحي (+1) ليصبح المجموع 2، مما يحقق الشرط 2 = 2 (True)، فيتم نسخ بيانات الأعمدة A و B و C و D الخاصة بذلك الصف ونقلها إلى الجدول النهائي.

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

4. الاستعلام المتعدد: استخراج البيانات عبر فترات زمنية ومجموعات أشهر مركبة

4.1 استخدام المعامل المنطقي البديل OR لدمج أشهر متعددة منفصلة

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

تتخذ الصياغة البرمجية لهذا النمط التركيب الموضح أدناه:

=QUERY(A1:D100, “select * where month(A) + 1 = 2 or month(A) + 1 = 10”, 1)

يقوم محرك الاستعلام هنا بتقييم جدول الصواب المنطقي (Boolean Logic Evaluation) لكل صف بصورة منفصلة؛ فإذا تحقق الشرط الأول (الشهر هو فبراير) أو تحقق الشرط الثاني (الشهر هو أكتوبر)، يتم تضمين الصف فوراً في مخرجات الاستعلام. أما إذا كان التاريخ ينتمي إلى أي شهر آخر (مثل مارس أو يوليو)، فإن التعبير المنطقي ككل يُرجع قيمة كاذبة (False) ويتم استبعاد الصف تلقائياً.

تجدر الإشارة إلى أن سلاسل الشروط المنطقية المربوطة بالمعامل OR تتطلب مراعاة دقيقة للأداء؛ فبينما لا تشكل إضافة شرطين أو ثلاثة أي عبء ملحوظ، فإن بناء سلاسل طويلة تحتوي على عشرات المعاملات المنطقية المتفرقة قد يؤدي إلى إبطاء وقت المعالجة في المستندات الكبيرة، مما يستدعي التفكير في حلول بنيوية بديلة تعتمد على النطاقات المجمعة كلما أمكن ذلك.

4.2 تحديد النطاقات الشهرية المتصلة باستخدام المعاملات العلائقية (>= و <=)

عندما تكون الشهور المستهدفة متتالية زمنياً وتشكل فترات ربع سنوية (Quarters) أو نصف سنوية (Semiannual Periods)، تصبح كتابة المعاملات المنطقية المنفصلة غير فعالة وتفتقر للأناقة البرمجية. في هذه السيناريوهات، يُفضل استخدام المعاملات العلائقية مثل الأكبر من أو يساوي (>=) والأصغر من أو يساوي (<=) مدمجة مع المعامل المنطقي الجامع AND.

لتصفية بيانات الربع الأول من العام (شهور يناير، فبراير، مارس أي الأشهر 1، 2، 3)، تُصاغ المعادلة على النحو الآتي:

=QUERY(A1:D100, “select * where month(A) + 1 >= 1 and month(A) + 1 <= 3”, 1)

تؤسس هذه الصياغة مجالاً مغلقاً يضمن استيعاب كافة التواريخ التي تقع أرقام شهورها التعويضية ضمن الفاصل المغلق [1, 3]. يقوم المعامل AND بفرض شرطين متلازمين: يجب أن يكون رقم الشهر أكبر من أو مساوياً للرقم 1 وفي الوقت ذاته أصغر من أو مساوياً للرقم 3. هذا الأسلوب يقلل من احتمالية الأخطاء البشرية في كتابة الشروط ويوفر صيغة مرنة يسهل تعديل حدودها الزمنية لاحقاً لتغطية الربع الثاني [4, 6] أو الربع الثالث [7, 9] أو الربع الرابع [10, 12].

من الأخطاء المنطقية الشائعة هنا استخدام المعامل OR بدلاً من AND عند حصر النطاقات المتصلة؛ فكتابة month(A)+1 >= 1 or month(A)+1 <= 3 ستؤدي حسابياً إلى استرجاع كافة شهور السنة بلا استثناء، نظراً لأن أي شهر في السنة هو حتماً إما أكبر من 1 أو أصغر من 3، مما يبطل مفعول التصفية كلياً.

4.3 المطابقة المتعددة المتقدمة باستخدام عبارات المطابقة المنطقية

توفر لغة استعلام GViz إمكانات إضافية لتنفيذ المطابقات المنطقية المعقدة دون الإفراط في تكرار اسم العمود ودالة الشهر. على الرغم من أن لغة GViz لا تدعم معامل IN التقليدي الموجود في SQL القياسية للتعامل مع الدوال الرياضية، إلا أنه يمكن تحقيق نفس النتيجة التقنية من خلال استخدام الأقواس التجميعية وتنظيم الأولويات المنطقية بصورة محكمة.

عند الرغبة في استخراج بيانات فترات متباعدة تتبع أرباعاً سنوية متعددة في استعلام واحد، مثل استخراج الربعين الأول والثالث معاً، يمكن دمج المجموعات المنطقية بواسطة الأقواس لضمان عدم حدوث تضارب في أسبقية العمليات (Operator Precedence):

=QUERY(A1:D100, “select * where (month(A) + 1 >= 1 and month(A) + 1 <= 3) or (month(A) + 1 >= 7 and month(A) + 1 <= 9)”, 1)

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

5. الفصل الزمني المزدوج: عزل الأشهر بالتزامن مع السنوات (Multi-Year Isolation)

5.1 معضلة التكرار السنوي للأشهر في قواعد البيانات التاريخية

تعد معضلة التكرار السنوي للأشهر واحدة من أخطر المصائد التحليلية التي يقع فيها المبتدئون عند التعامل مع السلاسل الزمنية متعددة السنوات في جداول بيانات جوجل. تنشأ هذه المشكلة لأن دالة month(A) تستخرج رقم الشهر المجرد فقط (من 0 إلى 11) متجاهلة بالكامل السنة الميلادية التي ينتمي إليها ذلك التاريخ.

إذا كانت قاعدة البيانات تغطي العمليات التشغيلية للأعوام 2021 و 2022 و 2023، وتم تطبيق استعلام بسيط يبحث عن شهر مارس بالصيغة where month(A) + 1 = 3، فإن المخرجات ستتضمن مزيجاً عشوائياً يدمج مبيعات مارس 2021، ومارس 2022، ومارس 2023 في جدول واحد. هذا الخلط يقود إلى تضخيم غير حقيقي للأرقام ويجعل التقارير الشهرية مضللة تماماً للإدارة المالية وأصحاب المصلحة.

من الناحية المنهجية، لا يمكن اعتبار التصفية الشهرية معزولة ومكتملة ما لم يتم تأطيرها ضمن سياقها السنوي الدقيق. يتطلب تصحيح هذا المسار تطبيق استراتيجية التصفية متعددة المستويات (Multi-Tier Filtering)، والتي تفرض شروطاً متزامنة تعزل السنة والشهر معاً في آن واحد لضمان النقاء الزمني للبيانات المسترجعة.

5.2 الدمج التركيبي بين دالتي month() و year() في جملة WHERE

لتحقيق العزل السنوي التام، تتيح لغة GViz دالة قياسية موازية مخصصة للسنة هي دالة year(). تأخذ هذه الدالة مرجع عمود التاريخ وتعيد السنة الميلادية كقيمة رقمية صحيحة رباعية الأرقام (مثل 2023) دون أي إزاحة صفرية، حيث يتطابق ناتجها مباشرة مع السنة الحقيقية للتاريخ.

تتم صياغة الاستعلام المزدوج لعزل شهر مايو من عام 2023 عبر دمج الدالتين باستخدام المعامل المنطقي AND كما يلي:

=QUERY(A1:D100, “select * where month(A) + 1 = 5 and year(A) = 2023”, 1)

يقوم المحرك هنا بتطبيق مرشح ثنائي الاتجاه؛ حيث يستبعد أولاً أي صف لا ينتمي لعام 2023، ومن ثم يفحص الصفوف المتبقية ليستخلص منها فقط السجلات التي تقع في الشهر الخامس (مايو). ينتج عن هذا الدمج التركيبي شريحة بيانات متجانسة تمثل حصراً نافذة زمنية مدتها 31 يوماً تبدأ من 1 مايو 2023 وتنتهي في 31 مايو 2023.

يمكن أيضاً توسيع هذا التركيب ليغطي نطاقات ممتدة عبر سنوات محددة، مثل استخراج الربع الأخير من عام 2022 كاملاً بكتابة: where year(A) = 2022 and month(A) + 1 >= 10 and month(A) + 1 <= 12، مما يوفر تحكماً دقيقاً في أبعاد المصفوفة المسترجعة.

5.3 بناء المقارنات السنوية للشهر ذاته (Year-over-Year Analysis)

يمثل تحليل المقارنة السنوية (Year-over-Year – YoY) أحد أهم الأساليب الإحصائية لتقييم النمو وتجاوز التأثيرات الموسمية؛ حيث تتم مقارنة أداء شهر معين في العام الحالي بنفس الشهر في العام أو الأعوام السابقة لقياس التغير الحقيقي في المبيعات أو الأرباح.

لبناء استعلام يستخرج بيانات شهر أبريل لعامي 2022 و 2023 معاً جنباً إلى جنب تمهيداً لمقارنتهما، يتم دمج الشروط المنطقية باستخدام الأقواس لتنظيم العلاقة بين المعاملين AND و OR:

=QUERY(A1:D100, “select A, B, D where month(A) + 1 = 4 and (year(A) = 2022 or year(A) = 2023) order by A asc”, 1)

يتيح هذا الاستعلام استخراج كافة معاملات شهر أبريل لكلا العامين مرتبة زمنياً تصاعدياً عبر عبارة ORDER BY. يمكن بعد ذلك تغذية هذه البيانات المسترجعة في معادلات حسابية خارجية لحساب نسبة النمو السنوي وفق الصيغة الاقتصادية القياسية: ((قيمة 2023 – قيمة 2022) / قيمة 2022) * 100، مما يوفر للإدارة رؤية دقيقة لحجم التوسع التشغيلي بمعزل عن التقلبات الدورية لباقي شهور السنة.

6. الاستعلام الديناميكي المعتمد على مراجع الخلايا وتغيير المدخلات تلقائياً

6.1 تقنيات ربط وسائط الاستعلام بقيم الخلايا الخارجية (Dynamic Cell Referencing)

على الرغم من فاعلية كتابة الأرقام الثابتة داخل نصوص الاستعلام (Hardcoding)، إلا أن التطبيقات المهنية ولوحات التحكم التفاعلية تتطلب جعل الاستعلامات ديناميكية، بحيث تتغير معايير التصفية تلقائياً بمجرد قيام المستخدم بتغيير قيمة خلية معينة في ورقة العمل دون الحاجة لتعديل نص المعادلة يدوياً في كل مرة.

لتحقيق هذا الربط الديناميكي مع الأرقام، يتم استخدام معامل الدمج النصي (&) لقطع السلسلة النصية للاستعلام وحقن القيمة المخزنة في الخلية الخارجية. إذا افترضنا أن المستخدم يدخل رقم الشهر المستهدف (مثلاً: 6) في الخلية F1، فإن معادلة الاستعلام الديناميكية تُصاغ بالشكل التالي:

=QUERY(A1:D100, “select * where month(A) + 1 = ” & F1, 1)

تقوم جداول بيانات جوجل أولاً بتقييم قيمة الخلية F1 (وهي الرقم 6)، ثم دمجها نصياً مع الجزأين المحيطين بها، لتتحول العبارة بالكامل داخل الذاكرة إلى النص القياسي: “select * where month(A) + 1 = 6” قبل تمريرها إلى محرك GViz. من الأهمية بمكان الانتباه إلى أن القيم الرقمية لا تتطلب علامات اقتباس مفردة حولها داخل نص الاستعلام، بخلاف القيم النصية الصريحة التي تتطلب تغليفها بعلامات اقتباس إضافية مثل “‘ ” & F1 & ” ‘”.

6.2 إنشاء قوائم اختيار منسدلة لتحديد الأشهر تفاعلياً (Data Validation)

للارتقاء بتجربة المستخدم وتفادي أخطاء الإدخال اليدوي، يُنصح بربط مرجع الخلية الديناميكية بـ قائمة منسدلة تفاعلية (Dropdown Menu) مبنية باستخدام أدوات التحقق من صحة البيانات (Data Validation). يتم إنشاء قائمة تحتوي على أسماء الأشهر أو أرقامها من 1 إلى 12 في خلية التحكم المخصصة.

إذا كانت القائمة المنسدلة تحتوي على أسماء الأشهر النصية باللغة العربية (مثل: يناير، فبراير، مارس…) في الخلية E1، فلن نتمكن من تمرير النص العربي مباشرة إلى دالة month(A)+1 التي تتوقع رقماً حسابياً. في هذا السيناريو، يتم استخدام دالة وسيطة مثل دالة البحث MATCH داخل معادلة الدمج لتحويل الاسم النصي فوراً إلى رقمه التسلسلي كما يلي:

=QUERY(A1:D100, “select * where month(A) + 1 = ” & MATCH(E1, {“يناير”; “فبراير”; “مارس”; “أبريل”; “مايو”; “يونيو”; “يوليو”; “أغسطس”; “سبتمبر”; “أكتوبر”; “نوفمبر”; “ديسمبر”}, 0), 1)

تقوم دالة MATCH بالبحث عن موقع اسم الشهر المختار في المصفوفة النصية المعطاة، وتعيد رقمه الترتيبي من 1 إلى 12 بدقة متناهية، والذي يُحقن بدوره داخل نص استعلام GViz. يتيح هذا النموذج للمستخدمين غير التقنيين التفاعل بسلاسة مع لوحة التحكم واختيار الأشهر باللغة الطبيعية مع بقاء المحرك البرمجي الخلفي يعمل بأعلى كفاءة رقمية.

6.3 التعامل مع المدخلات الفارغة وتفادي أخطاء الاستعلام التفاعلي

تتمثل إحدى العقبات الشائعة في الاستعلامات الديناميكية في انهيار المعادلة وظهور خطأ #VALUE! عندما يترك المستخدم خلية التحكم فارغة دون تحديد أي شهر. في هذه الحالة، يتحول نص الاستعلام إلى عبارة مبتورة مثل “where month(A) + 1 = “، وهو تركيب نحوي غير صالح يرفضه محرك GViz فوراً.

لمعالجة هذه المشكلة وبناء استعلام مرن، يتم دمج دالة IF الشرطية لتوجيه مسار الاستعلام؛ بحيث يتم استرجاع كافة البيانات إذا كانت خلية التحديد فارغة، بينما يتم تطبيق شرط الشهر فقط في حال إدخال قيمة محددة:

=QUERY(A1:D100, “select * ” & IF(ISBLANK(F1), “”, “where month(A) + 1 = ” & F1), 1)

علاوة على ذلك، يمكن تغليف الاستعلام بالكامل داخل دالة الحماية IFERROR لعرض رسالة توجيهية مهنية مثل “يرجى اختيار شهر صالح” بدلاً من إظهار رموز الأخطاء البرمجية المربكة للمستخدم النهائي، مما يعزز مناعة واستقرار التطبيقات ولوحات القيادة التنفيذية.

7. التجميع والتلخيص الإحصائي للبيانات الشهرية (Aggregation & GROUP BY)

7.1 تجميع المؤشرات الشهرية باستخدام جملة GROUP BY

لا تقتصر قوة دالة QUERY على استخراج وتصفية السجلات الفردية فحسب، بل تمتد لتشمل قدرات استثنائية في تلخيص البيانات وتوليد المؤشرات التراكمية عبر استخدام عبارة GROUP BY. تتيح هذه العبارة تجميع مئات الآلاف من الصفوف في صفوف ملخصة تعبر عن مجاميع أو متوسطات الشهور المختلفة في خطوة واحدة فائقة السرعة.

لحساب إجمالي المبيعات الشهرية لعمود القيم (D) وتوزيعه بحسب شهور السنة اعتماداً على عمود التاريخ (A)، يتم صياغة الاستعلام التجميعي المتقدم التالي:

=QUERY(A1:D100, “select month(A) + 1, sum(D) where A is not null group by month(A) + 1”, 1)

تعتمد آلية عمل هذا الاستعلام على تقسيم السجلات إلى 12 حزمة تجميعية كحد أقصى تمثل شهور السنة. يقوم المحرك بتطبيق دالة الجمع sum(D) على القيم المالية لكل حزمة شهرية على حدة. تشترط قواعد لغة GViz الصارمة أن أي عمود أو تعبير رياضي يظهر في عبارة SELECT دون أن يكون محاطاً بدالة تجميعية (مثل sum أو avg أو count) يجب بالضرورة إدراجه نصاً في عبارة GROUP BY، وإلا سيفشل الاستعلام ويطلق خطأ هيكلياً.

يمكن أيضاً دمج دوال تجميعية متعددة في استعلام واحد لحساب مقاييس إحصائية شاملة، مثل: select month(A)+1, count(B), sum(D), avg(D) group by month(A)+1، مما ينتج جدولاً إحصائياً متكاملاً يتضمن عدد العمليات، وإجمالي القيمة، ومتوسط حجم الصفقة لكل شهر على حدة.

7.2 إعادة تسمية الأعمدة المحسوبة باستخدام عبارة LABEL

عند استخدام الدوال التجميعية مثل sum(D) أو التعبيرات الحسابية مثل month(A)+1، يقوم محرك GViz تلقائياً بتوليد تسميات ترويسية افتراضية معقدة ومزعجة بصرياً في الجدول الناتج، مثل “month(Date)+1” أو “sum Total Amount”. تفتقر هذه التسميات للمهنية وتؤثر سلباً على وضوح التقارير الموجهة للإدارة.

لحل هذه المشكلة، توفر لغة الاستعلام عبارة LABEL التي تسمح بتخصيص وإعادة تسمية ترويسات الأعمدة المحسوبة بسهولة بالغة وبنصوص عربية صريحة وواضحة:

=QUERY(A1:D100, “select month(A) + 1, sum(D) where A is not null group by month(A) + 1 label month(A) + 1 ‘الشهر التقويمي’, sum(D) ‘إجمالي المبيعات (ر.س)'”, 1)

يتم وضع التسميات المخصصة بين علامات اقتباس مفردة بعد تحديد التعبير المراد تسميته. كما تتيح عبارة LABEL إمكانية إخفاء عنوان أي عمود كلياً من خلال ترك علامات الاقتباس المفردة فارغة مثل label sum(D) ”، وهو ما يُعد مفيداً للغاية عند الرغبة في دمج مخرجات الاستعلام تحت ترويسات مصممة مسبقاً في ورقة العمل دون تكرار الصفوف التعريفية.

7.3 فرز وتنسيق الجداول التلخيصية الشهرية باستخدام ORDER BY

تكتمل قوة التقارير الإحصائية بالقدرة على إعادة ترتيب وتنسيق مخرجات التجميع وفق معايير رقمية أو زمنية واضحة عبر عبارة ORDER BY. تتيح هذه العبارة توجيه الفرز إما تصاعدياً باستخدام المعامل ASC (الافتراضي) أو تنازلياً باستخدام المعامل DESC.

إذا كان الهدف هو فرز التقرير التلخيصي لتحديد الأشهر الأعلى تحقيقاً للإيرادات وترتيبها من الأكثر مبيعاً إلى الأقل مبيعاً، تُكتب المعادلة بالشكل الآتي:

=QUERY(A1:D100, “select month(A) + 1, sum(D) where A is not null group by month(A) + 1 order by sum(D) desc”, 1)

يقوم المحرك هنا بحساب المجاميع أولاً، ثم إعادة ترتيب الصفوف المسترجعة بحيث يظهر الشهر صاحب أعلى مبيعات في الصف الأول من التقرير. يمكن أيضاً دمج عبارة LIMIT لتحديد عدد السجلات المعروضة، مثل إضافة limit 3 في نهاية الاستعلام لحصر المخرجات في “أفضل 3 أشهر أداءً خلال العام”، مما يحول الاستعلام إلى أداة تنفيذية بالغة الأهمية لتقييم النتائج التشغيلية وتقديم ملخصات سريعة للإدارة العليا.

8. الجداول المحورية داخل الاستعلام: استخدام عبارة PIVOT مع الأشهر

8.1 تحويل الأشهر إلى أعمدة أفقية لتسهيل المقارنة المرئية

تعد عبارة PIVOT في لغة استعلام GViz إحدى أقوى الميزات التحليلية المتقدمة، حيث تتيح تحويل السجلات الرأسية للشهور إلى أعمدة أفقية ممتدة عرضياً، مما يعيد تشكيل مصفوفة البيانات ثنائية الأبعاد في هيئة جدول محوري (Pivot Table) ديناميكي دون الحاجة إلى إنشاء كائنات الجداول المحورية التقليدية المنفصلة.

لحساب إجمالي المبيعات لكل مندوب مبيعات (العمود B) موزعاً عبر شهور السنة كأعمدة أفقية، يتم استخدام التركيب المحوري التالي:

=QUERY(A1:D100, “select B, sum(D) where A is not null group by B pivot month(A) + 1”, 1)

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

8.2 التحليل المتقاطع متعدد المتغيرات (الفئات والأشهر والسنوات)

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

إذا أردنا عرض مبيعات فئات المنتجات (العمود C) في الصفوف، مع توزيع الأعمدة الأفقية لتشمل الأشهر مقترنة بالسنوات لسنوات متعددة، يمكن كتابة الاستعلام كالتالي:

=QUERY(A1:D100, “select C, sum(D) where A is not null group by C pivot year(A), month(A) + 1”, 1)

ينتج عن تمرير متغيرين إلى عبارة PIVOT (وهما السنة والشهر) توليد ترويسة أفقية مزدوجة متعددة المستويات، حيث يتم تصنيف الأعمدة أولاً بحسب السنة (مثل: 2022، 2023)، ويندرج تحت كل سنة أعمدة الشهور الخاصة بها من 1 إلى 12. في حال عدم وجود معاملات لمنتج معين في شهر محدد، يترك المحرك تقاطع الخلية فارغاً، مما يعكس غياب النشاط بدقة متناهية دون تشويه المجاميع الفرعية.

8.3 تطوير لوحات القيادة التحليلية اعتماداً على مخرجات PIVOT

توفر الجداول الناتجة عن عبارة PIVOT بنية هيكلية مثالية لتغذية الرسوم البيانية التفاعلية (Interactive Charts) داخل لوحات قيادة جداول بيانات جوجل. ونظراً لأن مخرجات الاستعلام تتمدد وتتقلص ديناميكياً بناءً على البيانات المتوفرة، فإن الرسوم البيانية المتصلة بها تتحدث تلقائياً بمجرد إضافة بيانات أشهر جديدة دون الحاجة لإعادة ضبط نطاقات السلاسل البيانية يدوياً.

يمكن ربط مخرجات الاستعلام بمخططات الخطوط البيانية المتعددة (Multi-Line Charts) أو المخططات العمودية المكدسة (Stacked Column Charts) لتصور مسار الإيرادات الشهرية عبر السنوات المختلفة ومقارنة المنحنيات التراكمية. هذا التكامل المباشر بين محرك الاستعلام ومحرك التصوير البياني يقلص الوقت اللازم لصيانة لوحات المتابعة الشهرية بنسبة هائلة ويوفر للمؤسسة بيئة تقارير آلية وذاتية التحديث بشكل كامل.

9. معالجة التحديات والأخطاء الشائعة أثناء الاستعلام عن الشهور (Troubleshooting)

9.1 حل مشكلة اختلاط أنواع البيانات (Data Type Mismatch)

تعتبر مشكلة اختلاط أنواع البيانات (Data Type Mismatch) في عمود التاريخ المصدري السبب الأول والأساسي وراء فشل استعلامات الشهور. تفرض لغة GViz معياراً صارماً يقضي بأن العمود في النطاق يجب أن يحتوي على نوع بيانات واحد مهيمن؛ فإذا احتوى عمود التاريخ على تواريخ قياسية مدمجة مع بعض الخلايا المخزنة كنصوص (String)، فإن المحرك سيحدد نوع العمود بناءً على النسبة الغالبة ويتجاهل النوع الآخر بالكامل.

إذا اعتبر المحرك العمود نصياً بسبب كثرة الإدخالات النصية، فإن محاولة تطبيق دالة month(A) ستؤدي إلى انهيار الاستعلام أو إرجاع قيم فارغة (Nulls)، نظراً لأن دالة الشهر تقبل حصراً قيم التاريخ الحقيقية. لتشخيص هذه الخلايا المعطوبة في الجدول المصدري، يمكن استخدام معادلة الفحص المنطقي المساعدة في عمود مجاور:

=ARRAYFORMULA(IF(A2:A=””, “”, ISDATE(A2:A)))

ستقوم هذه المعادلة بإرجاع القيمة FALSE أمام أي خلية تحتوي على تاريخ مكتوب بتنسيق نصي غير صالح. يتم حل المشكلة عبر تصحيح تلك القيم يدوياً أو استخدام قائمة تنسيق > رقم > تاريخ لإعادة فرض النسق القياسي على العمود بأكمله، مما يضمن تجانس البيانات وقدرة محرك GViz على قراءتها وتطبيق شروط الأشهر عليها بسلاسة.

9.2 تشخيص ومعالجة خطأ الاستعلام الشهير #VALUE! و #ERROR!

يظهر الخطأ #VALUE! مصحوباً برسالة التوقف الشهيرة: “Unable to parse query string for Function QUERY” عند وجود خطأ تركيبي أو نحوي في نص الاستعلام الممرر. تتنوع أسباب هذا الخطأ عند التعامل مع الشهور، ولكن أكثرها شيوعاً هو نسيان علامات الاقتباس، أو استخدام فواصل غير صحيحة، أو ارتكاب أخطاء إملائية في أسماء الدوال البرمجية.

لتشخيص وإصلاح الأخطاء التركيبية بفاعلية، يُنصح باتباع الخطوات التدقيقية المنهجية التالية:

  • فحص كتابة الدوال: التأكد من كتابة الدالة بحروف صغيرة month() أو year() داخل نص الاستعلام وتجنب إدراج أسماء دوال غير مدعومة من GViz.
  • مراجعة الفواصل الإقليمية: في بعض الإعدادات الإقليمية للبلدان التي تستخدم الفاصلة العشرية بدلاً من النقطة، يجب استخدام الفاصلة المنقوطة (;) لفصل وسائط دالة QUERY بدلاً من الفاصلة العادية (,).
  • تدقيق علامات الاقتباس في الدمج الديناميكي: التأكد من إغلاق علامات الاقتباس المزدوجة بدقة قبل وبعد معاملات الدمج النصي (&) وفحص السلسلة الناتجة للتأكد من عدم وجود مسافات ناقصة تسبب التصاق الكلمات مثل wheremonth.

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

9.3 التعامل مع الخلايا الفارغة والصفوف غير المكتملة في عمود التاريخ

عندما يحتوي عمود التاريخ على صفوف فارغة تتخلل السجلات، قد يفسر محرك الاستعلام هذه الفراغات بطرق غير متوقعة إذا لم يتم تحصين الشرط مسبقاً، مما يؤدي إلى تشويه نتائج التجميع أو إدراج صفوف شاذة في المخرجات.

لمنع هذا السلوك غير المرغوب فيه وضمان نظافة النتائج الإحصائية، يجب تضمين شرط الاستبعاد الصريح where A is not null كجزء أساسي وثابت في كافة استعلامات الشهور المركبة:

=QUERY(A1:D100, “select month(A) + 1, sum(D) where A is not null and month(A) + 1 = 5 group by month(A) + 1”, 1)

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

10. التكامل والدمج المتقدم: التنسيق الشرطي والتعامل مع النصوص العربية للشهور

10.1 تحويل أسماء الأشهر النصية (يناير، فبراير…) إلى استعلامات رقمية

في العديد من قواعد البيانات المستوردة من منصات خارجية أو ملفات CSV غير المعيارية، قد تَرِد الشهور مخزنة كنصوص صريحة باللغة العربية (مثل: “يناير”، “مارس”) في عمود منفصل بدلاً من حقول التواريخ التسلسلية الكاملة. في هذه الحالة، لا يمكن استخدام دالة month() لأن البيانات ليست من نوع Date أصلاً.

للاستعلام عن شهر محدد في بيئة نصية، يتم التعامل مع العمود كنص عادي باستخدام المقارنات النصية المباشرة المحاطة بعلامات اقتباس مفردة داخل جملة الاستعلام:

=QUERY(A1:D100, “select * where B = ‘فبراير’ “, 1)

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

10.2 الدمج مع دوال الصفوف الديناميكية (ARRAYFORMULA و MAP)

تمثل الدوال المصفوفية الحديثة مثل ARRAYFORMULA و MAP و LAMBDA في جداول بيانات جوجل أدوات جبارة لأتمتة المعالجة التسلسلية على امتداد أوراق العمل الضخمة. يمكن دمج هذه الدوال المتقدمة مع دالة QUERY لإنشاء خطوط معالجة بيانات ديناميكية بالغة التعقيد والسرعة.

على سبيل المثال، يمكن استخدام دالة MAP مع دالة LAMBDA لتكرار تنفيذ استعلامات شهرية محددة عبر مصفوفة من الشهور واستخراج إجمالي كل شهر بصورة تلقائية في نطاق ممتد:

=MAP(SEQUENCE(12, 1, 1, 1), LAMBDA(m, IFERROR(QUERY(A1:D100, “select sum(D) where month(A) + 1 = ” & m & ” label sum(D) ””, 0), 0)))

تولد دالة SEQUENCE(12, 1, 1, 1) مصفوفة رأسية بالأرقام من 1 إلى 12 تمثل شهور السنة. تقوم دالة MAP بتمرير كل شهر كمتغير m إلى دالة LAMBDA التي تنفذ استعلام QUERY لحساب إجمالي ذلك الشهر بدقة متناهية. يتميز هذا النمط التجريدي بقدرته على توليد ملخص سنوي كامل في صيغة خلية واحدة مفردة دون الحاجة لسحب المعادلات يدوياً، مما يعزز الكفاءة التشغيلية ويقلل من استهلاك موارد الحوسبة للملف.

10.3 إبراز المخرجات الشهرية بصرياً عبر التنسيق الشرطي (Conditional Formatting)

يكتمل التكامل الوظيفي للبيانات المسترجعة عبر تعزيز وضوحها البصري باستخدام قواعد التنسيق الشرطي (Conditional Formatting). يتيح التنسيق الشرطي تمييز سجلات أشهر معينة بألوان مخصصة تلقائياً، أو تسليط الضوء على المعاملات الاستثنائية والقيم المتطرفة ضمن بيانات الشهر المسترجع.

لتمييز صفوف شهر معين (مثلاً: شهر رمضان أو شهر الإغلاق المالي) في الجدول المستخرج بلون خلفية مميز، يتم تطبيق قاعدة تنسيق شرطي تعتمد على صيغة مخصصة (Custom Formula) مطبقة على النطاق المستهدف A2:D100 وفق المعادلة التالية:

=MONTH($A2) = 3

لاحظ هنا استخدام الدالة الأصلية لورقة العمل MONTH() بنظامها التقويمي العادي (1-12) مع تثبيت العمود بعلامة الدولار ($A2) لضمان تلوين الصف بالكامل. يتيح هذا التنسيق البصري للفرق التنفيذية والمراجعين رصد الفترات المستهدفة فورياً، والتعرف على الأنماط الشاذة أو الانحرافات في الأداء المالي دون إجهاد بصري في تتبع الأرقام المجردة.

11. حالات دراسية وسيناريوهات تطبيقية واقعية من بيئة الأعمال

11.1 النموذج المالي: استخراج ومراجعة التدفقات النقدية الشهرية

في بيئة الإدارة المالية للشركات، يتطلب إعداد تقرير بيان التدفقات النقدية الشهري (Monthly Cash Flow Statement) عزل المقبوضات والمدفوعات بدقة لكل شهر مالي للتحقق من السيولة ومطابقة الأرصدة البنكية وتجهيز قيود الإغلاق الشهري الدورية.

نفترض وجود دفتر الأستاذ العام في النطاق A1:F5000، حيث يمثل العمود A تاريخ القيد، والعمود B رقم الحساب، والعمود C البيان المحاسبي، والعمود D المقبوضات (Inflow)، والعمود E المدفوعات (Outflow). لإعداد تقرير الإغلاق المالي لشهر ديسمبر 2023 مع حساب صافي التدفق النقدي المحقق، يتم بناء الاستعلام المركب التالي:

=QUERY(A1:F5000, “select B, C, D, E, (D – E) where month(A) + 1 = 12 and year(A) = 2023 and A is not null label (D – E) ‘صافي التدفق النقدي'”, 1)

يقوم هذا الاستعلام بعزل معاملات شهر ديسمبر 2023 حصراً، وإجراء عملية حسابية آنية على مستوى الصف بطرح المدفوعات من المقبوضات (D – E) لحساب صافي حركة السيولة لكل بند وتسميته مهنياً. يوفر هذا النموذج لفريق التدقيق المالي أداة فورية لمراجعة الحركات المالية الشهرية واعتماد الحسابات الختامية بأعلى درجات الموثوقية والدقة المحاسبية.

11.2 نموذج الموارد البشرية: تتبع الحضور وساعات العمل والغياب الشهري

تواجه أقسام الموارد البشرية (HR) تحدياً مستمراً في معالجة سجلات الحضور والانصراف الضخمة لحساب مستحقات الرواتب الشهرية وساعات العمل الإضافي ومعدلات الغياب لكل دورة دفع (Payroll Cycle).

إذا كانت قاعدة بيانات البصمة اليومية مسجلة في النطاق A1:E10000 (A: التاريخ، B: الرقم الوظيفي، C: اسم الموظف، D: ساعات العمل الفعلية، E: ساعات العمل الإضافي)، فإن استخراج ملخص ساعات العمل الإضافي لشهر مارس 2023 مجمعاً لكل موظف يتم عبر صياغة الاستعلام التجميعي الآتي:

=QUERY(A1:E10000, “select B, C, sum(D), sum(E) where month(A) + 1 = 3 and year(A) = 2023 and A is not null group by B, C label sum(D) ‘إجمالي الساعات الفعلية’, sum(E) ‘إجمالي الساعات الإضافية'”, 1)

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

11.3 نموذج إدارة المبيعات: تتبع الطلبيات وسلوك المستهلك الموسمي

في قطاع التجارة الإلكترونية وإدارة سلاسل الإمداد، يعد فهم التقلبات الموسمية في سلوك الشراء أمراً حيوياً لتخطيط المخزون وتحديد الميزانيات التسويقية المناسبة لكل فترة من فترات السنة.

لتحليل سلوك الشراء في موسم التخفيضات لشهر نوفمبر عبر ثلاثة أعوام متتالية (2021، 2022، 2023)، وتصنيف المبيعات بحسب فئة المنتج (العمود C) وقيمة الطلبيات (العمود D)، يتم تطبيق استعلام الجدولة المتقاطعة التالي:

=QUERY(A1:D50000, “select C, sum(D) where month(A) + 1 = 11 and year(A) >= 2021 and year(A) <= 2023 group by C pivot year(A)”, 1)

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

12. أفضل الممارسات المنهجية وإرشادات تحسين الأداء في قواعد البيانات الكبيرة

12.1 تحسين سرعة الاستجابة ومنع بطء جداول البيانات (Performance Optimization)

عندما تتسع قواعد البيانات لتضم عشرات الآلاف من الصفوف، فإن الاستخدام غير المنضبط لدوال QUERY قد يؤدي إلى بطء ملحوظ في إعادة حساب ورقة العمل وتراجع استجابة واجهة المستخدم. لتحسين سرعة الأداء وضمان المعالجة السريعة للسلاسل الزمنية، يجب تطبيق مجموعة من القواعد الهندسية الصارمة:

  • حصر النطاقات المرجعية: تجنب استخدام النطاقات المفتوحة اللانهائية مثل A:Z؛ حيث يجبر هذا النطاق المحرك على مسح ملايين الخلايا الفارغة في أسفل الجدول. بدلاً من ذلك، حدد النطاق بدقة مثل A1:D15000 أو استخدم النطاقات المسماة الديناميكية (Dynamic Named Ranges).
  • تقليل الاستعلامات المتكررة: تجنب كتابة استعلامات QUERY متعددة ومكررة في نفس الصفحة لجلب أجزاء صغيرة من البيانات؛ واعتمد بدلاً من ذلك على استعلام واحد رئيسي يقوم بالتجميع وتوزيع المخرجات دفعة واحدة.
  • استخدام أوراق وسيطة للتخزين المؤقت: في النماذج المعقدة، يُفضل إنشاء ورقة وسيطة مخصصة لاستخراج وتخزين النتائج الشهرية المعالجة مسبقاً، والرجوع إليها في لوحات العرض بدلاً من إعادة تشغيل محرك GViz الثقيل عند كل تحديث بسيط.

12.2 توثيق وتنظيم بنية الاستعلامات المعقدة لتسهيل صيانتها وتطويرها

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

يُنصح بوضع تعليقات توضيحية (Comments) فوق الخلايا التي تستضيف الاستعلامات الرئيسية تشرح الغرض من التقرير، والمدخلات المطلوبة، والمنطق المستخدم في التعويض الإزاحي (+1). كما يفضل تنسيق كتابة الاستعلام النصي بطريقة مقروءة عبر استخدام المسافات المناسبة والفصل الواضح بين الكلمات المفتاحية (SELECT, WHERE, GROUP BY, PIVOT, LABEL)، مما يقلل من الوقت اللازم لفهم الاستعلام وتطويره مستقبلاً.

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

12.3 دليل الصيانة الوقائية والتدقيق الدوري لسلامة الاستعلامات الزمنية

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

يتضمن بروتوكول التدقيق الدوري مراجعة النقاط الحيوية التالية بانتظام:

  • فحص التغييرات الإقليمية (Locale Settings): التأكد من أن إعدادات لغة المستند والبلد في ملف > الإعدادات لم تتغير، حيث يؤدي تغيير الإعداد الإقليمي فجأة إلى قلب نسق قراءة التاريخ من DD/MM/YYYY إلى MM/DD/YYYY مما يدمر منطق استخراج الشهور كلياً.
  • مراقبة سلامة الأعمدة المضافة: التحقق من أن إضافة أعمدة جديدة في الجدول المصدري لم تؤدِ إلى إزاحة ترتيب الحروف المستعلم عنها (كأن يصبح عمود التاريخ في B بدلاً من A)، وفي حال التوسع يفضل استخدام مصفوفات الاستعلام بالأرقام مثل Col1, Col2 داخل الأقواس المعقوفة {} لضمان ثبات المراجع.
  • مطابقة العينات العشوائية: إجراء مطابقة يدوية دورية لعينات عشوائية من مخرجات الاستعلام ومقارنتها مباشرة مع السجلات الخام في الجدول المصدري للتأكد التام من عدم تسرب أي أخطاء حسابية أو منطقية غير مرئية إلى التقارير النهائية.

الخلاصة والخاتمة التوجيهية

يمثل الاستعلام باستخدام الشهر في جداول بيانات جوجل عبر دالة QUERY ومحرك Google Visualization API حجر الزاوية في بناء حلول تحليل البيانات المتقدمة وإعداد التقارير الدورية المؤتمتة. وكما أوضح هذا الدليل الشامل، فإن السر التقني للنجاح في هذا المضمار يرتكز على فهم الطبيعة البرمجية لمحرك الاستعلام والتعامل الدقيق مع نظام الفهرسة الصفرية (Zero-Based Indexing) عبر التطبيق الواعي لـ قاعدة التعويض الإزاحي (+1)، والتأكيد الصارم على عزل الأشهر ضمن سياقها السنوي الصحيح لتفادي خلط البيانات التاريخية.

إن إتقان دمج المعاملات المنطقية، ومراجع الخلايا الديناميكية، وعبارات التجميع والتدوير الإحصائي المتقدمة (GROUP BY & PIVOT)، يحول جداول البيانات من مجرد أوراق عمل رقمية ساكنة إلى منصات ذكاء أعمال ديناميكية فائقة الفاعلية قادرة على معالجة السلاسل الزمنية الكبرى وتقديم رؤى تنفيذية دقيقة تدعم صناعة القرار الاستراتيجي في المؤسسات المعاصرة بكفاءة وموثوقية لا تضاهى.

المراجع (References)

اقتباس هذا المقال

looti, M. (2026, أغسطس 31). جداول بيانات جوجل: كيفية الاستعلام باستخدام الشهر. عرب سايكلوجي. https://arabpsychology.com/statistics/google-sheets-how-to-query-using-month/
looti, Mohammed. “جداول بيانات جوجل: كيفية الاستعلام باستخدام الشهر.” عرب سايكلوجي, 31 أغسطس 2026, https://arabpsychology.com/statistics/google-sheets-how-to-query-using-month/.
looti, Mohammed. “جداول بيانات جوجل: كيفية الاستعلام باستخدام الشهر.” عرب سايكلوجي. أغسطس 31, 2026. https://arabpsychology.com/statistics/google-sheets-how-to-query-using-month/.