تحويل بياناتك الضخمة إلى إحصاءات باستخدام "جداول بيانات Google" و"العروض التقديمية من Google"

1. من تحليل البيانات الضخمة إلى عرض الشرائح

هناك العديد من الأدوات لعلماء البيانات لإجراء تحليلات البيانات الضخمة، ولكن لا يزال يتعين على المحللين النهائيين تبرير النتائج للإدارة. الكثير من الأرقام على الورق أو في قاعدة البيانات لا يمكن تقديمها للأطراف المعنية الرئيسيين. يستخدم هذا الدرس التطبيقي المتوسط حول ترميز برمجة تطبيقات Google منصتين أساسيتين للمطوّرين في Google (Google Workspace وGoogle Cloud Console) لمساعدتك في تنفيذ هذه المرحلة النهائية بشكل مبرمَج.

تتيح لك أدوات المطوّرين في Google Cloud إجراء تحليل مفصّل للبيانات. يمكنك بعد ذلك أخذ النتائج وإدراجها في جدول بيانات وإنشاء عرض شرائح باستخدام البيانات. يوفر هذا طريقة أكثر ملاءمة لتسليم البيانات إلى الإدارة. يتناول هذا الدرس التطبيقي حول الترميز واجهة برمجة تطبيقات BigQuery في Cloud Console (كخدمة متقدّمة لبرمجة التطبيقات) وخدمات "برمجة تطبيقات Google" المضمَّنة في جداول بيانات Google والعروض التقديمية من Google.

الحافز

تم استلهام نموذج التطبيق في هذا الدرس التطبيقي حول الترميز من عيّنات التعليمات البرمجية الأخرى:

على الرغم من أنّ نموذج تطبيق الدرس التطبيقي حول الترميز في "العروض التقديمية من Google" يعرض أيضًا BigQuery و"العروض التقديمية من Google"، فهو يختلف عن نموذج تطبيق هذا الدرس التطبيقي في عدة طرق:

  • تطبيق Node.js مقارنةً بتطبيق "برمجة تطبيقات Google"
  • تستخدم واجهات برمجة تطبيقات REST بينما نستخدم خدمات برمجة التطبيقات.
  • ويستخدم Google Drive وليس جداول بيانات Google بينما يستخدم هذا التطبيق جداول البيانات ولكن لا يستخدم Drive.

في هذا الدرس التطبيقي حول الترميز، أردنا دمج تقنيات متعددة في تطبيق واحد مع عرض الميزات وواجهات برمجة التطبيقات من Google Cloud بطريقة تشبه حالة استخدام حقيقية. والهدف من ذلك هو تشجيعك على الاستفادة من خيالك والتفكير في استخدام كل من Cloud Console وGoogle Workspace لحلّ المشاكل الصعبة التي تواجه مؤسستك وعملائك.

ما ستتعرَّف عليه

  • كيفية استخدام "برمجة تطبيقات Google" مع خدمات Google المتعددة
  • كيفية استخدام Google BigQuery لتحليل البيانات الضخمة
  • كيفية إنشاء جدول بيانات Google وإدراج البيانات فيه
  • كيفية إنشاء مخطط في جداول البيانات
  • كيفية نقل البيانات والرسوم البيانية من "جداول بيانات Google" إلى عرض تقديمي في "العروض التقديمية من Google"

المتطلبات

  • متصفح ويب يوفر إمكانية الوصول إلى الإنترنت
  • حساب على Google (قد تتطلّب حسابات Google Workspace موافقة المشرف)
  • الإلمام الأساسي بجداول بيانات Google
  • إمكانية قراءة الترميز A1 في "جداول بيانات Google"
  • مهارات JavaScript الأساسية
  • معرفة مجال تطوير "برمجة التطبيقات" مفيدة ولكنّها ليست مطلوبة

2. استطلاع

كيف ستستخدم هذا الدرس التطبيقي/البرنامج التعليمي حول الترميز؟

اقرأها لأغراض إعلامية، ويمكنك تمريرها إلى الزملاء التقنيين. اشرح بقدر الإمكان، وحاوِل تنفيذ أكبر عدد ممكن من التمارين سأكمل درسي حول الترميز بالكامل

كيف يمكن تقييم تجربتك مع أدوات المطوّرين في Google Workspace من واجهات برمجة التطبيقات؟

حديث متوسط بارع

ما هو تقييمك لتجربتك في استخدام "برمجة تطبيقات Google" تحديدًا؟

حديث متوسط بارع

كيف يمكن تقييم تجربتك مع أدوات المطوّرين في Cloud Console من واجهات برمجة التطبيقات؟

حديث متوسط بارع

3- نظرة عامة

الآن بعد أن عرفت ما يدور حوله هذا الدرس التطبيقي، إليك ما ستفعله:

  1. استخدِم عيّنة حالية من "برمجة تطبيقات Google" وBigQuery لكي تعمل.
  2. من العيّنة، تعرف على كيفية إرسال استعلام إلى BigQuery والحصول على النتائج.
  3. أنشئ جدول بيانات Google وأدخل النتائج من BigQuery فيه.
  4. قم بتعديل التعليمة البرمجية لتغيير البيانات التي يتم عرضها وإدراجها في الورقة بشكل طفيف.
  5. يمكنك استخدام خدمة "جداول بيانات Google" في "برمجة تطبيقات Google" لإنشاء رسم بياني لبيانات BigQuery.
  6. استخدم خدمة "العروض التقديمية من Google" لإنشاء عرض تقديمي في "العروض التقديمية من Google".
  7. أضف عنوانًا وعنوانًا فرعيًا إلى شريحة العنوان الافتراضية.
  8. إنشاء شريحة بجدول بيانات وتصدير خلايا بيانات الورقة إليها.
  9. قم بإنشاء شريحة أخرى وقم بإدراج مخطط جدول البيانات فيها.

لنبدأ ببعض المعلومات الأساسية حول برمجة التطبيقات وBigQuery و"جداول بيانات Google" و"العروض التقديمية من Google".

"برمجة تطبيقات Google" وBigQuery

برمجة تطبيقات Google هي منصة لتطوير Google Workspace تعمل على مستوى أعلى من واجهات برمجة تطبيقات Google REST. وهو بيئة تطوير واستضافة تطبيقات بدون خادم ويمكن لجميع المستخدمين الوصول إليها بمهارة. في الأساس، تُعدّ "برمجة تطبيقات Google" بيئة تشغيل بلغة JavaScript بدون خادم مخصّصة للبرمجة والإضافة والدمج في Google Workspace.

وهو يستخدم لغة JavaScript من جهة الخادم، على غرار Node.js، لكنّه يركّز على التكامل الوثيق مع Google Workspace وخدمات Google الأخرى، بدلاً من استضافة التطبيقات السريعة وغير المتزامنة المستندة إلى الأحداث. كما أنه يتميز ببيئة تطوير قد تختلف عما اعتدت عليه. باستخدام "برمجة تطبيقات Google"، يمكنك:

  • يمكنك تطوير نصوص برمجية باستخدام محرِّر رموز مستنِدة إلى المتصفّح مع إمكانية تطويرها أيضًا محليًا عند استخدام clasp، وهي أداة نشر سطر الأوامر لـ "برمجة تطبيقات Google".
  • يمكنك كتابة رمز برمجي في إصدار مخصّص من JavaScript مخصّص للوصول إلى Google Workspace وخدمات Google أو خدمات خارجية أخرى (باستخدام خدمتَي URL Fetch أو JDBC في "برمجة التطبيقات").
  • تجنُّب كتابة رمز التفويض، لأنّ "برمجة تطبيقات Google" تعالجه نيابةً عنك
  • ليس من الضروري استضافة تطبيقك، فهو يعمل ويعمل على خوادم Google في السحابة الإلكترونية.

تعمل واجهات برمجة التطبيقات مع تقنيات Google الأخرى بطريقتين مختلفتين:

  • كخدمة مدمجة
  • كخدمة متقدمة

تتضمن الخدمة المضمّنة طرقًا عالية المستوى للتفاعل مع بيانات المستخدمين وأنظمة Google الأخرى والأنظمة الخارجية. تُعد الخدمة المتقدّمة في الأساس برنامج تضمين سطحي لواجهة برمجة تطبيقات Google Workspace أو واجهة برمجة تطبيقات Google REST. توفر الخدمات المتقدمة تغطية كاملة لواجهة برمجة تطبيقات REST، وغالبًا ما يمكن أن تنفّذ مهام أكثر من الخدمات المدمَجة، ولكنها تتطلب قدرًا أكبر من تعقيد الرمز (بينما تظل أسهل في الاستخدام من واجهة برمجة تطبيقات REST الكاملة). ويجب أيضًا تفعيل الخدمات المتقدّمة لمشروع نص برمجي قبل استخدامها.

على المطوّرين استخدام خدمة مدمَجة متى أمكن ذلك لأنّها أسهل من حيث الاستخدام، وتقدِّم خدمات أكثر من مجرد خدمات متقدّمة. ومع ذلك، لا تحتوي بعض واجهات Google APIs على خدمات مضمّنة، لذا قد تكون الخدمة المتقدّمة هي الخيار الوحيد. على سبيل المثال، لا تتضمّن خدمة Google BigQuery خدمة مُدمجة، ولكن لا تتوفّر خدمة BigQuery. خدمة BigQuery هي خدمة Cloud Console تتيح لك استخدام Google BigQuery API لإجراء طلبات على مجموعات بيانات كبيرة (على سبيل المثال، عدة تيرابايت)، ولكن لا يزال من الممكن تقديم نتائج في غضون ثوانٍ.

الوصول إلى "جداول بيانات Google" العروض التقديمية من "برمجة تطبيقات Google"

على عكس BigQuery، تحتوي كل من "جداول بيانات Google" و"العروض التقديمية من Google" على خدمات مدمجة. وتوفّر لهم أيضًا خدمات متقدّمة للوصول إلى الميزات المتوفّرة فقط في واجهة برمجة التطبيقات. يمكنك الاطّلاع على المستندات الخاصة بخدمتَي جداول بيانات Google والعروض التقديمية من Google المدمجة قبل الانتقال إلى الرمز البرمجي. يُرجى العلم أنّ هناك مستندات أيضًا تتعلّق بالخدمات المتقدّمة لكل من جداول بيانات Google والعروض التقديمية من Google.

4. المهمة 1: تشغيل BigQuery وتسجيل النتائج في "جداول بيانات Google"

مقدمة

سننفّذ جزءًا كبيرًا من هذا التمرين التطبيقي حول الترميز في هذه المهمة الأولى. في الواقع، بعد إكمال الدروس، ستكون قد أكملت منتصف الدرس التطبيقي حول الترميز بالكامل. وبتقسيمها إلى عدة أقسام فرعية، ستتمكن من:

  • أنشئ مشروعًا في "برمجة تطبيقات Google" وCloud Console معًا.
  • فعِّل الوصول إلى خدمة BigQuery المتقدّمة.
  • افتح أداة تعديل النصوص البرمجية وأدخِل رمز مصدر التطبيق.
  • التنقل في عملية تفويض التطبيق (OAuth2).
  • تشغيل التطبيق الذي يرسل طلبًا إلى BigQuery.
  • راجع جدول بيانات Google الجديد الذي تم إنشاؤه باستخدام نتائج BigQuery.

ضبط إعدادات الجهاز

  1. لإنشاء مشروع "برمجة تطبيقات Google"، انتقِل إلى script.google.com وانقر على مشروع جديد.
  2. لإعادة تسمية مشروع "برمجة تطبيقات Google"، انقر على مشروع بلا عنوان، وأدخِل عنوانًا لمشروعك، ثم انقر على إعادة تسمية.

بعد ذلك، ستحتاج إلى إنشاء مشروع على Cloud Console لطلب البيانات في BigQuery.

  1. لإنشاء مشروع على Cloud Console، استخدِم رابط الاختصار هذا من أجل إنشاء مشروع، ومنح المشروع اسمًا، ثم انقر على إنشاء.
  1. عند اكتمال إنشاء المشروع، يظهر إشعار على الصفحة. تأكد من اختيار مشروعك الجديد في قائمة المشاريع أعلى الصفحة.
  2. انقر على رمز القائمة f5fbd278915eb7aa.png وانتقِل إلى واجهات برمجة التطبيقات الخدمات > شاشة طلب الموافقة المتعلّقة ببروتوكول OAuth (رابط مباشر)
  3. انقر على داخلية >. إنشاء لإنشاء تطبيق لمستخدمي Google Workspace داخل مؤسستك.
  4. في الحقل اسم التطبيق، أدخِل "الدرس التطبيقي حول ترميز البيانات الضخمة".
  5. أدخِل عناوين البريد الإلكتروني المخصّصة للتواصل في الحقلين دعم المستخدم ومعلومات الاتصال بالمطوِّر.
  6. انقر على حفظ ومتابعة >. الحفظ والمتابعة
  7. انقر على رمز المزيد 50fa7e30ed2d1b1c.png في شريط التنقل واختر إعدادات المشروع (رابط مباشر).
  8. انسخ القيمة المدرجة ضمن رقم المشروع. (يتم استخدام حقل رقم تعريف المشروع المنفصل لاحقًا في الدرس التطبيقي حول الترميز.)

بعد ذلك، عليك ربط مشروع "برمجة التطبيقات" بمشروع Cloud Console.

  1. بدِّل إلى محرِّر "برمجة تطبيقات Google" وانقر على إعدادات المشروع ترس الإعدادات.
  2. ضمن مشروع Google Cloud Platform (GCP)، انقر على تغيير المشروع.
  3. أدخِل رقم المشروع وانقر على ضبط المشروع.
  4. بعد ذلك، انقر على محرِّر أداة تعديل الرموز لبدء إضافة خدمة BigQuery المتقدّمة.
  5. بجانب الخدمات، انقر على رمز "إضافة خدمة" إضافة خدمة.
  6. في مربّع الحوار "إضافة خدمة"، اختَر BigQuery API وانقر على إضافة.

الخطوة الأخيرة هي تفعيل BigQuery API على Cloud Console.

  1. ولإجراء ذلك، انتقِل إلى Cloud Console وانقر على واجهات برمجة التطبيقات الخدمات > لوحة البيانات. (تأكد من أنك لا تزال في نفس المشروع الذي أنشأته في الخطوة 3).
  2. انقر على تفعيل واجهات برمجة التطبيقات والخدمات.
  3. ابحث عن "طلب بحث كبير"، واختر BigQuery API (وليس BigQuery Data Transfer API)، ثمّ انقر على تفعيل لتفعيلها.

a0e07fa159de9367.png

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

حمِّل التطبيق وشغِّله.

  1. في أداة تعديل النصوص البرمجية، استبدِل مجموعة رموز myFunction() التلقائية بالرمز التالي:
// File name for data results
var QUERY_NAME = "Most common words in all of Shakespeare's works";
// Replace this value with your Google Cloud Console Project ID
var PROJECT_ID = '';
if (!PROJECT_ID) throw Error('Project ID is required in setup');

/**
 * Runs a BigQuery query; puts results into a Sheet. You must turn on
 * the BigQuery advanced service before you can run this code.
 * @see https://developers.google.com/apps-script/advanced/bigquery#run_query
 * @see https://github.com/googleworkspace/apps-script-samples/blob/master/advanced/bigquery.gs
 *
 * @returns {Spreadsheet} Returns a spreadsheet with BigQuery results
 * @see https://developers.google.com/apps-script/reference/spreadsheet/spreadsheet
 */
function runQuery() {
  // Replace sample with your own BigQuery query.
  var request = {
    query:
        'SELECT ' +
            'LOWER(word) AS word, ' +
            'SUM(word_count) AS count ' +
        'FROM [bigquery-public-data:samples.shakespeare] ' +
        'GROUP BY word ' +
        'ORDER BY count ' +
        'DESC LIMIT 10'
  };
  var queryResults = BigQuery.Jobs.query(request, PROJECT_ID);
  var jobId = queryResults.jobReference.jobId;

  // Wait for BigQuery job completion (with exponential backoff).
  var sleepTimeMs = 500;
  while (!queryResults.jobComplete) {
    Utilities.sleep(sleepTimeMs);
    sleepTimeMs *= 2;
    queryResults = BigQuery.Jobs.getQueryResults(PROJECT_ID, jobId);
  }

  // Get all results from BigQuery.
  var rows = queryResults.rows;
  while (queryResults.pageToken) {
    queryResults = BigQuery.Jobs.getQueryResults(PROJECT_ID, jobId, {
      pageToken: queryResults.pageToken
    });
    rows = rows.concat(queryResults.rows);
  }

  // Return null if no data returned.
  if (!rows) {
    return Logger.log('No rows returned.');
  }

  // Create the results spreadsheet.
  var spreadsheet = SpreadsheetApp.create(QUERY_NAME);
  var sheet = spreadsheet.getActiveSheet();

  // Add headers to Sheet.
  var headers = queryResults.schema.fields.map(function(field) {
    return field.name.toUpperCase();
  });
  sheet.appendRow(headers);

  // Append the results.
  var data = new Array(rows.length);
  for (var i = 0; i < rows.length; i++) {
    var cols = rows[i].f;
    data[i] = new Array(cols.length);
    for (var j = 0; j < cols.length; j++) {
      data[i][j] = cols[j].v;
    }
  }

  // Start storing data in row 2, col 1
  var START_ROW = 2;      // skip header row
  var START_COL = 1;
  sheet.getRange(START_ROW, START_COL, rows.length, headers.length).setValues(data);

  Logger.log('Results spreadsheet created: %s', spreadsheet.getUrl());
}
  1. انقر على "حفظ" التصدي لفرصة هدف.
  2. بجانب "Code.gs"، انقر على رمز المزيد 50fa7e30ed2d1b1c.png >. إعادة التسمية. تغيير العنوان من Code.gs إلى bq-sheets-slides.js
  3. بعد ذلك، دعنا نراجع التعليمة البرمجية التي تستعلم عن BigQuery وتكتب النتائج في جدول بيانات Google. يمكنك عرضه بالقرب من أعلى runQuery():
SELECT
    LOWER(word) AS word,
    SUM(word_count) AS count
FROM [bigquery-public-data:samples.shakespeare]
GROUP BY word
ORDER BY count
DESC LIMIT 10

يفحص هذا الطلب أعمال "شكسبير"، وهو جزء من مجموعة بيانات BigQuery العامة، وينتج عن ذلك أهم 10 كلمات تظهر بشكل متكرر في كل أعماله، مرتّبةً تنازليًا حسب مدى رواجها. تحصل على فكرة عن مدى فائدة BigQuery عندما تتخيل مقدار العمل الذي سيكون عليه القيام بهذه التجميع يدويًا.

تعلن الدالة أيضًا عن متغيّر PROJECT_ID يتطلب رقم تعريف مشروع على Cloud Console صالح. تظهر عبارة if ضمن المتغيّر لمنع متابعة التطبيق بدون رقم تعريف المشروع.

  1. انتقِل إلى مشروعك على Cloud Console، وانقر على رمز المزيد 50fa7e30ed2d1b1c.png في شريط التنقل، ثم اختَر إعدادات المشروع.
  2. انسخ القيمة المدرجة ضمن رقم تعريف المشروع.
  3. ارجِع إلى محرِّر "برمجة تطبيقات Google" وحدِّد موقع المتغيّر PROJECT_ID في bq-sheets-slides.js وأضِف القيمة.
  4. انقر على حفظ التصدي لفرصة هدف >. تشغيل
  5. انقر على مراجعة الأذونات للمتابعة.
  1. بعد بدء تشغيل النص البرمجي، يتم فتح سجلّ التنفيذ المضمَّن ويسجِّل إجراءات النص البرمجي في الوقت الفعلي.
  1. بعد ظهور الرسالة "اكتمل التنفيذ" في سجلّ التنفيذ، انتقِل إلى Google Drive (drive.google.com) وابحث عن "جدول بيانات Google" باسم "أكثر الكلمات شيوعًا في جميع أعمال شكسبير". (أو الاسم الذي حدّدته للمتغيّر QUERY_NAME في حال تعديله):
  2. افتح جدول البيانات لعرض الكلمات العشر الأكثر شيوعًا وإجمالي أعدادها مرتبة بترتيب تنازلي:

afe500ad43f8cdf8.png

ملخص المهمة 1

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

يمكن أيضًا العثور على الرمز الذي استخدمته في bq-sheets-slides.js في مجلد step1 في مستودع GitHub الخاص بالدرس التطبيقي حول الترميز على github.com/googlecodelabs/bigquery-sheets-slides. تم استلهام هذا الرمز من هذا المثال الأصلي في صفحة الخدمات المتقدمة في BigQuery والذي أجرى طلبًا مختلفًا بعض الشيء لاسترداد الكلمات الأكثر شيوعًا التي يحتوي على 10 أحرف أو أكثر استخدمها "شكسبير". يمكنك أيضًا الاطلاع على مثال في مستودع GitHub.

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

يمكنك أيضًا تنفيذ طلبات بحث باستخدام صفحة BigQuery على Cloud Console قبل تنفيذها في "برمجة التطبيقات". للعثور عليه، انقر على رمز القائمة f5fbd278915eb7aa.png وانتقِل إلى واجهة مستخدم BigQuery > مساحة عمل SQL (رابط مباشر). على سبيل المثال، إليك كيفية ظهور استعلامنا على واجهة BigQuery الرسومية:

BigQueryUI

5- المهمة 2: إنشاء مخطط في جداول بيانات Google

الغرض من runQuery() هو استخدام BigQuery وإرسال نتائج البيانات إلى جدول بيانات Google. بعد ذلك، نحتاج إلى عمل مخطط باستخدام البيانات. لننشئ دالة جديدة تُسمى createColumnChart() تستدعي "جداول بيانات Google" طريقة newChart().

  1. في محرِّر "برمجة تطبيقات Google"، أضِف الدالة createColumnChart() إلى bq-sheets-slides.js بعد runQuery(). تحصل التعليمة البرمجية على الورقة وتطلب مخططًا عموديًا بجميع البيانات. يبدأ نطاق البيانات من الخلية A2 لأن الصف الأول يحتوي على عناوين الأعمدة.
/**
 * Uses spreadsheet data to create a column chart.
 * @param {Spreadsheet} Spreadsheet containing results data
 * @returns {EmbeddedChart} Visualizes the results
 * @see https://developers.google.com/apps-script/reference/spreadsheet/embedded-chart
 */
function createColumnChart(spreadsheet) {
  // Retrieve the populated (first) Sheet.
  var sheet = spreadsheet.getSheets()[0];
  // Data range in Sheet is from cell A2 to B11.
  var START_CELL = 'A2';  // skip header row
  var END_CELL = 'B11';
  // Place chart on Sheet starting on cell E5.
  var START_ROW = 5;      // row 5
  var START_COL = 5;      // col E
  var OFFSET = 0;

  // Create & place chart on the Sheet using above values.
  var chart = sheet.newChart()
     .setChartType(Charts.ChartType.COLUMN)
     .addRange(sheet.getRange(START_CELL + ':' + END_CELL))
     .setPosition(START_ROW, START_COL, OFFSET, OFFSET)
     .build();
  sheet.insertChart(chart);
}
  1. تتطلب الدالة createColumnChart() معلمة كائن جدول البيانات، لذا نحتاج إلى تحديث runQuery() لعرض كائن spreadsheet يمكننا تمريره إلى createColumnChart(). في نهاية runQuery()، عليك إرجاع الكائن spreadsheet بعد تسجيل عملية إنشاء ورقة البيانات بنجاح:
  Logger.log('Results spreadsheet created: %s', spreadsheet.getUrl());

  // NEW: Return the spreadsheet object for later use.
  return spreadsheet;
}
  1. أنشئ دالة createBigQueryPresentation() لاستدعاء كل من runQuery() وcreateColumnChart(). يعد الفصل المنطقي بين BigQuery ووظيفة إنشاء الرسم البياني من أفضل الممارسات:
/**
 * Runs the query, adds data and a chart to a spreadsheet.
 */
function createBigQueryPresentation() {
  var spreadsheet = runQuery();
  createColumnChart(spreadsheet);
}
  1. لقد اتخذت خطوتين مهمتين أعلاه: عرض كائن جدول البيانات وإنشاء دالة الإدخال. ليكون runQuery() أكثر قابلية للاستخدام، نحتاج إلى نقل سطر السجلّ من runQuery() إلى createBigQueryPresentation(). يُفترض أن تبدو طريقتك الآن على النحو التالي:
/**
 * Runs a BigQuery query, adds data and a chart to a spreadsheet.
 */
function createBigQueryPresentation() {
  var spreadsheet = runQuery();
  Logger.log('Results spreadsheet created: %s', spreadsheet.getUrl()); // MOVED HERE
  createColumnChart(spreadsheet);
}

باستخدام التغييرات الواردة أعلاه (باستثناء PROJECT_ID)، من المفترض أن يظهر bq-sheets-slides.js الآن على النحو التالي. يمكنك العثور على هذا الرمز أيضًا في step2 من مستودع GitHub.

// File name for data results
var QUERY_NAME = "Most common words in all of Shakespeare's works";
// Replace this value with your Google Cloud Console Project ID
var PROJECT_ID = '';
if (!PROJECT_ID) throw Error('Project ID is required in setup');

/**
 * Runs a BigQuery query; puts results into a sheet. You must turn on
 * the BigQuery advanced service before you can run this code.
 * @see https://developers.google.com/apps-script/advanced/bigquery#run_query
 * @see https://github.com/googleworkspace/apps-script-samples/blob/master/advanced/bigquery.gs
 *
 * @returns {Spreadsheet} Returns a spreadsheet with BigQuery results
 * @see https://developers.google.com/apps-script/reference/spreadsheet/spreadsheet
 */
function runQuery() {
  // Replace sample with your own BigQuery query.
  var request = {
    query:
        'SELECT ' +
            'LOWER(word) AS word, ' +
            'SUM(word_count) AS count ' +
        'FROM [bigquery-public-data:samples.shakespeare] ' +
        'GROUP BY word ' +
        'ORDER BY count ' +
        'DESC LIMIT 10'
  };
  var queryResults = BigQuery.Jobs.query(request, PROJECT_ID);
  var jobId = queryResults.jobReference.jobId;

  // Wait for BigQuery job completion (with exponential backoff).
  var sleepTimeMs = 500;
  while (!queryResults.jobComplete) {
    Utilities.sleep(sleepTimeMs);
    sleepTimeMs *= 2;
    queryResults = BigQuery.Jobs.getQueryResults(PROJECT_ID, jobId);
  }

  // Get all results from BigQuery.
  var rows = queryResults.rows;
  while (queryResults.pageToken) {
    queryResults = BigQuery.Jobs.getQueryResults(PROJECT_ID, jobId, {
      pageToken: queryResults.pageToken
    });
    rows = rows.concat(queryResults.rows);
  }

  // Return null if no data returned.
  if (!rows) {
    return Logger.log('No rows returned.');
  }

  // Create the results spreadsheet.
  var spreadsheet = SpreadsheetApp.create(QUERY_NAME);
  var sheet = spreadsheet.getActiveSheet();

  // Add headers to sheet.
  var headers = queryResults.schema.fields.map(function(field) {
    return field.name.toUpperCase();
  });
  sheet.appendRow(headers);

  // Append the results.
  var data = new Array(rows.length);
  for (var i = 0; i < rows.length; i++) {
    var cols = rows[i].f;
    data[i] = new Array(cols.length);
    for (var j = 0; j < cols.length; j++) {
      data[i][j] = cols[j].v;
    }
  }

  // Start storing data in row 2, col 1
  var START_ROW = 2;      // skip header row
  var START_COL = 1;
  sheet.getRange(START_ROW, START_COL, rows.length, headers.length).setValues(data);

  // Return the spreadsheet object for later use.
  return spreadsheet;
}

/**
 * Uses spreadsheet data to create a columnar chart.
 * @param {Spreadsheet} Spreadsheet containing results data
 * @returns {EmbeddedChart} Visualizes the results
 * @see https://developers.google.com/apps-script/reference/spreadsheet/embedded-chart
 */
function createColumnChart(spreadsheet) {
  // Retrieve the populated (first) sheet.
  var sheet = spreadsheet.getSheets()[0];
  // Data range in sheet is from cell A2 to B11.
  var START_CELL = 'A2';  // skip header row
  var END_CELL = 'B11';
  // Place chart on Sheet starting on cell E5.
  var START_ROW = 5;      // row 5
  var START_COL = 5;      // col E
  var OFFSET = 0;

  // Create & place chart on the sheet using above values.
  var chart = sheet.newChart()
     .setChartType(Charts.ChartType.COLUMN)
     .addRange(sheet.getRange(START_CELL + ':' + END_CELL))
     .setPosition(START_ROW, START_COL, OFFSET, OFFSET)
     .build();
  sheet.insertChart(chart);
}

/**
 * Runs a BigQuery query, adds data and a chart to a spreadsheet.
 */
function createBigQueryPresentation() {
  var spreadsheet = runQuery();
  Logger.log('Results spreadsheet created: %s', spreadsheet.getUrl());
  createColumnChart(spreadsheet);
}

في أداة تعديل النصوص البرمجية، احفظ مشروع النص البرمجي. بعد ذلك، اختَر createBigQueryPresentation من قائمة الدوال وانقر على Run (تشغيل). بعد اكتماله، يتم إنشاء جدول بيانات آخر في Google Drive، ولكن هذه المرة يتم تضمين مخطط في الورقة بجوار البيانات:

ورقة برسم بياني

6- المهمة 3: وضع بيانات النتائج في مجموعة شرائح

يتضمن الجزء الأخير من الدرس التطبيقي حول الترميز إنشاء عرض تقديمي في "العروض التقديمية من Google"، وإضافة العنوان والعنوان الفرعي إلى شريحة العنوان، ثم إنشاء شرائح لخلايا البيانات والمخطط.

  1. في محرِّر "برمجة تطبيقات Google"، أضِف الدالة createSlidePresentation() إلى bq-sheets-slides.js بعد createColumnChart(). يتم تنفيذ جميع الأعمال على مجموعة الشرائح في هذه الدالة. لنبدأ بإنشاء مجموعة شرائح ثم أضف عنوانًا وعنوانًا فرعيًا إلى شريحة العنوان الافتراضية.
/**
 * Create presentation with spreadsheet data and a chart
 * @param {Spreadsheet} Spreadsheet containing results data
 * @param {EmbeddedChart} Sheets chart to embed on a slide
 * @returns {Presentation} Slide deck with the results
  * @see https://developers.google.com/apps-script/reference/slides/presentation
 */
function createSlidePresentation(spreadsheet, chart) {
  // Create the presentation.
  var deck = SlidesApp.create(QUERY_NAME);

  // Populate the title slide.
  var [title, subtitle] = deck.getSlides()[0].getPageElements();
  title.asShape().getText().setText(QUERY_NAME);
  subtitle.asShape().getText().setText('using Google Cloud Console and Google Workspace APIs:\n' +
    'Google Apps Script, BigQuery, Sheets, Slides');
  1. الخطوة التالية في تطبيق "createSlidePresentation()" هي استيراد بيانات الخلية من "جدول بيانات Google" إلى مجموعة الشرائح الجديدة. أضف مقتطف الرمز هذا إلى الدالة:
  // Data range to copy is from cell A1 to B11
  var START_CELL = 'A1';  // include header row
  var END_CELL = 'B11';
  // Add the table slide and insert an empty table on it with
  // the dimensions of the data range; fails if the sheet is empty.
  var tableSlide = deck.appendSlide(SlidesApp.PredefinedLayout.BLANK);
  var sheetValues = spreadsheet.getSheets()[0].getRange(
      START_CELL + ':' + END_CELL).getValues();
  var table = tableSlide.insertTable(sheetValues.length, sheetValues[0].length);

  // Populate the table with spreadsheet data.
  for (var i = 0; i < sheetValues.length; i++) {
    for (var j = 0; j < sheetValues[0].length; j++) {
      table.getCell(i, j).getText().setText(String(sheetValues[i][j]));
    }
  }
  1. الخطوة الأخيرة في createSlidePresentation() هي إضافة شريحة أخرى واستيراد الرسم البياني من جدول البيانات وإرجاع الكائن Presentation. أضف مقتطف الرمز هذا إلى الدالة:
  // Add a chart slide and insert the chart on it.
  var chartSlide = deck.appendSlide(SlidesApp.PredefinedLayout.BLANK);
  chartSlide.insertSheetsChart(chart);

  // Return the presentation object for later use.
  return deck;
}
  1. الآن بعد أن اكتملت الدالة، انظر مرة أخرى إلى توقيعها. تتطلب السمة createSlidePresentation() مَعلمتَي كائن جدول البيانات والرسم البياني. لقد عدّلنا runQuery() لعرض الكائن Spreadsheet ولكننا نحتاج إلى إجراء تغيير مشابه على createColumnChart() كي يعرض كائن الرسم البياني (EmbeddedChart). ارجع إلى createColumnChart() وأضف مقتطف الرمز التالي إلى نهاية الدالة:
  // NEW: Return the chart object for later use.
  return chart;
}
  1. بما أنّ الدالة createColumnChart() تُرجع الآن كائن الرسم البياني، نحتاج إلى حفظ الرسم البياني في متغيّر. بعد ذلك، نمرّر كل من جدول البيانات ومتغيّرات الرسم البياني إلى createSlidePresentation(). بالإضافة إلى ذلك، نظرًا لأننا نسجل عنوان URL لجدول البيانات الذي تم إنشاؤه حديثًا، دعنا نسجل أيضًا عنوان URL للعرض التقديمي الجديد للشرائح. عدِّل createBigQueryPresentation() ليظهر على النحو التالي:
/**
 * Runs a BigQuery query, adds data and a chart to a spreadsheet,
 * and adds the data and chart to a new slide presentation.
 */
function createBigQueryPresentation() {
  var spreadsheet = runQuery();
  Logger.log('Results spreadsheet created: %s', spreadsheet.getUrl());
  var chart = createColumnChart(spreadsheet); // UPDATED
  var deck = createSlidePresentation(spreadsheet, chart); // NEW
  Logger.log('Results slide deck created: %s', deck.getUrl()); // NEW
}
  1. عليك حفظ "createBigQueryPresentation()" وتشغيله مجددًا. قبل تنفيذه، يحتاج تطبيقك إلى مجموعة واحدة أخرى من الأذونات من المستخدم لعرض العروض التقديمية في "العروض التقديمية من Google" وإدارتها. وبعد مراجعة هذه الأذونات والسماح بها، سيتم تشغيلها كما في السابق.
  2. الآن، بالإضافة إلى جدول البيانات الذي تم إنشاؤه، يُفترض أيضًا أن تحصل على عرض تقديمي جديد في العروض التقديمية يحتوي على 3 شرائح (العنوان، وجدول البيانات، ومخطط البيانات)، كما هو موضح أدناه:

f6896f22cc3cd50d.png

59960803e62f7c69.png

5549f0ea81514360.png

7. الخاتمة

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

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

باستخدام التغييرات من المهمة النهائية (باستثناء PROJECT_ID)، من المفترض أن يظهر bq-sheets-slides.js الآن على النحو التالي:

/**
 * Copyright 2018 Google LLC
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at apache.org/licenses/LICENSE-2.0.
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

// File name for data results
var QUERY_NAME = "Most common words in all of Shakespeare's works";
// Replace this value with your Google Cloud Console Project ID
var PROJECT_ID = '';
if (!PROJECT_ID) throw Error('Project ID is required in setup');

/**
 * Runs a BigQuery query; puts results into a spreadsheet. You must turn on
 * the BigQuery advanced service before you can run this code.
 * @see https://developers.google.com/apps-script/advanced/bigquery#run_query
 * @see https://github.com/googleworkspace/apps-script-samples/blob/master/advanced/bigquery.gs
 *
 * @returns {Spreadsheet} Returns a spreadsheet with BigQuery results
 * @see https://developers.google.com/apps-script/reference/spreadsheet/spreadsheet
 */
function runQuery() {
  // Replace sample with your own BigQuery query.
  var request = {
    query:
        'SELECT ' +
            'LOWER(word) AS word, ' +
            'SUM(word_count) AS count ' +
        'FROM [bigquery-public-data:samples.shakespeare] ' +
        'GROUP BY word ' +
        'ORDER BY count ' +
        'DESC LIMIT 10'
  };
  var queryResults = BigQuery.Jobs.query(request, PROJECT_ID);
  var jobId = queryResults.jobReference.jobId;

  // Wait for BigQuery job completion (with exponential backoff).
  var sleepTimeMs = 500;
  while (!queryResults.jobComplete) {
    Utilities.sleep(sleepTimeMs);
    sleepTimeMs *= 2;
    queryResults = BigQuery.Jobs.getQueryResults(PROJECT_ID, jobId);
  }

  // Get all results from BigQuery.
  var rows = queryResults.rows;
  while (queryResults.pageToken) {
    queryResults = BigQuery.Jobs.getQueryResults(PROJECT_ID, jobId, {
      pageToken: queryResults.pageToken
    });
    rows = rows.concat(queryResults.rows);
  }

  // Return null if no data returned.
  if (!rows) {
    return Logger.log('No rows returned.');
  }

  // Create the results spreadsheet.
  var spreadsheet = SpreadsheetApp.create(QUERY_NAME);
  var sheet = spreadsheet.getActiveSheet();

  // Add headers to sheet.
  var headers = queryResults.schema.fields.map(function(field) {
    return field.name.toUpperCase();
  });
  sheet.appendRow(headers);

  // Append the results.
  var data = new Array(rows.length);
  for (var i = 0; i < rows.length; i++) {
    var cols = rows[i].f;
    data[i] = new Array(cols.length);
    for (var j = 0; j < cols.length; j++) {
      data[i][j] = cols[j].v;
    }
  }

  // Start storing data in row 2, col 1
  var START_ROW = 2;      // skip header row
  var START_COL = 1;
  sheet.getRange(START_ROW, START_COL, rows.length, headers.length).setValues(data);

  // Return the spreadsheet object for later use.
  return spreadsheet;
}

/**
 * Uses spreadsheet data to create a column chart.
 * @param {Spreadsheet} Spreadsheet containing results data
 * @returns {EmbeddedChart} Visualizes the results
 * @see https://developers.google.com/apps-script/reference/spreadsheet/embedded-chart
 */
function createColumnChart(spreadsheet) {
  // Retrieve the populated (first) sheet.
  var sheet = spreadsheet.getSheets()[0];
  // Data range in sheet is from cell A2 to B11.
  var START_CELL = 'A2';  // skip header row
  var END_CELL = 'B11';
  // Place chart on sheet starting on cell E5.
  var START_ROW = 5;      // row 5
  var START_COL = 5;      // col E
  var OFFSET = 0;

  // Create & place chart on the sheet using above values.
  var chart = sheet.newChart()
     .setChartType(Charts.ChartType.COLUMN)
     .addRange(sheet.getRange(START_CELL + ':' + END_CELL))
     .setPosition(START_ROW, START_COL, OFFSET, OFFSET)
     .build();
  sheet.insertChart(chart);
  
  // Return the chart object for later use.
  return chart;
}

/**
 * Create presentation with spreadsheet data and a chart
 * @param {Spreadsheet} Spreadsheet containing results data
 * @param {EmbeddedChart} Sheets chart to embed on a slide
 * @returns {Presentation} Slide deck with the results
 * @see https://developers.google.com/apps-script/reference/slides/presentation
 */
function createSlidePresentation(spreadsheet, chart) {
  // Create the presentation.
  var deck = SlidesApp.create(QUERY_NAME);

  // Populate the title slide.
  var [title, subtitle] = deck.getSlides()[0].getPageElements();
  title.asShape().getText().setText(QUERY_NAME);
  subtitle.asShape().getText().setText('using Google Cloud Console and Google Workspace APIs:\n' +
    'Google Apps Script, BigQuery, Sheets, Slides');

  // Data range to copy is from cell A1 to B11
  var START_CELL = 'A1';  // include header row
  var END_CELL = 'B11';
  // Add the table slide and insert an empty table on it with
  // the dimensions of the data range; fails if the sheet is empty.
  var tableSlide = deck.appendSlide(SlidesApp.PredefinedLayout.BLANK);
  var sheetValues = spreadsheet.getSheets()[0].getRange(
      START_CELL + ':' + END_CELL).getValues();
  var table = tableSlide.insertTable(sheetValues.length, sheetValues[0].length);

  // Populate the table with spreadsheet data.
  for (var i = 0; i < sheetValues.length; i++) {
    for (var j = 0; j < sheetValues[0].length; j++) {
      table.getCell(i, j).getText().setText(String(sheetValues[i][j]));
    }
  }

  // Add a chart slide and insert the chart on it.
  var chartSlide = deck.appendSlide(SlidesApp.PredefinedLayout.BLANK);
  chartSlide.insertSheetsChart(chart);

  // Return the presentation object for later use.
  return deck;
}

/**
 * Runs a BigQuery query, adds data and a chart to a spreadsheet,
 * and adds the data and chart to a new slide presentation.
 */
function createBigQueryPresentation() {
  var spreadsheet = runQuery();
  Logger.log('Results spreadsheet created: %s', spreadsheet.getUrl());
  var chart = createColumnChart(spreadsheet);
  var deck = createSlidePresentation(spreadsheet, chart);
  Logger.log('Results slide deck created: %s', deck.getUrl());
}

يمكنك أيضًا العثور على نموذج الرمز هذا في مجلد final في مستودع GitHub.

8. مراجع إضافية

في ما يلي المزيد من المراجع لمساعدتك على دراسة المزيد من المعلومات عن المواد التي يتناولها هذا الدرس التطبيقي حول الترميز واكتشاف طُرق أخرى للوصول إلى أدوات مطوّري برامج Google آليًا.

موارد لهذا التطبيق

الوثائق

الفيديوهات

الأخبار و التحديثات

الدروس التطبيقية الأخرى حول الترميز

مبتدئ

مزايا متوسطة

9. الخطوة التالية: تحديّ الرمز

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

  • التطبيق: ألا تريد أن يقتصر الأمر على استخدام JavaScript أو القيود التي تفرضها "برمجة التطبيقات"؟ انقل هذا التطبيق إلى لغة البرمجة المفضّلة لديك التي تستخدم واجهات برمجة تطبيقات REST الخاصة بكل من Google BigQuery و"جداول بيانات Google" و"العروض التقديمية من Google".
  • BigQuery: يمكنك تجربة طلب بحث مختلف عن مجموعة بيانات شكسبير التي تهمّك. يمكن العثور على نموذج طلب آخر في نموذج تطبيق BigQuery لبرمجة التطبيقات الأصلي.
  • BigQuery: يمكنك تجربة بعض مجموعات البيانات العامة الأخرى في BigQuery للعثور على مجموعة بيانات أكثر فائدة لك.
  • BigQuery: أشرنا سابقًا إلى طلبات بحث أخرى يمكنك إنشاؤها باستخدام أعمال "شكسبير" أو جداول بيانات عامة أخرى. ويمكنك الاطّلاع عليها على صفحة الويب هذه ومستودع GitHub.
  • جداول بيانات Google: يمكنك تجربة أنواع الرسوم البيانية الأخرى في معرض الرسوم البيانية.
  • جداول بيانات Google BigQuery: يمكنك استخدام مجموعة بيانات جداول البيانات الكبيرة الخاصة بك. في عام 2016، قدم فريق BigQuery ميزة تسمح للمطورين باستخدام جدول البيانات كمصدر للبيانات. لمزيد من المعلومات، انتقِل إلى (دمج Google BigQuery مع Google Drive.
  • العروض التقديمية من Google - يمكنك إضافة شرائح أخرى إلى العرض التقديمي الذي تم إنشاؤه، مثل الصور أو الأصول الأخرى المرتبطة بتحليل البيانات الضخمة. في ما يلي المستندات المرجعية للخدمة المضمّنة في "العروض التقديمية من Google".
  • Google Workspace: يمكنك استخدام خدمات Google Workspace أو خدمات Google المضمَّنة الأخرى من "برمجة التطبيقات". على سبيل المثال، Gmail و"تقويم Google" و"مستندات Google" وDrive و"خرائط Google" و"إحصاءات Google" وYouTube وغيرها، بالإضافة إلى خدمات متقدّمة أخرى. للحصول على مزيد من المعلومات، يمكنك الانتقال إلى نظرة عامة على المرجع لكل من الخدمات المضمَّنة والمتقدّمة.