1. من تحليل البيانات الضخمة إلى العرض التقديمي للشرائح
تتوفّر العديد من الأدوات لعلماء البيانات لإجراء تحليلات البيانات الضخمة، ولكن في النهاية، على المحللين تقديم مبررات للإدارة بشأن النتائج. لا يمكن تقديم الكثير من الأرقام على الورق أو في قاعدة البيانات إلى أصحاب المصلحة الرئيسيين. يستخدم هذا الدرس التطبيقي حول الترميز المتوسط المستوى لغة "برمجة تطبيقات Google" منصتَين للمطوّرين من Google (Google Workspace ووحدة تحكّم Google Cloud) لمساعدتك في تنفيذ هذه المرحلة النهائية تلقائيًا.
تتيح لك أدوات المطوّرين في Google Cloud إجراء تحليل عميق للبيانات. يمكنك بعد ذلك أخذ النتائج وإدراجها في جدول بيانات وإنشاء عرض تقديمي للشرائح باستخدام البيانات. ويوفّر ذلك طريقة أكثر ملاءمة لتقديم البيانات إلى الإدارة. يتناول هذا الدرس التطبيقي حول الترميز واجهة برمجة التطبيقات BigQuery في Cloud Console (كخدمة متقدّمة في "برمجة تطبيقات Google") وخدمات "برمجة تطبيقات Google" المضمّنة في جداول بيانات Google والعروض التقديمية من Google.
الحافز
تم استلهام نموذج التطبيق في هذا الدرس التطبيقي حول الترميز من عيّنات التعليمات البرمجية الأخرى التالية:
- نموذج تطبيق خدمة BigQuery في برمجة تطبيقات Google الذي تم نشره كمصدر مفتوح على GitHub
- نموذج التطبيق المعروض في فيديو المطوّرين إنشاء شرائح من بيانات جدول بيانات والمنشور في منشور المدونة هذا.
- نموذج التطبيق الموضّح في الدرس التطبيقي حول الترميز في Google Slides API
على الرغم من أنّ نموذج التطبيق في الدرس التطبيقي حول الترميز لواجهة Slides API يتضمّن أيضًا BigQuery و"العروض التقديمية من Google"، إلا أنّه يختلف عن نموذج التطبيق في هذا الدرس التطبيقي حول الترميز بعدّة طرق:
- تطبيق Node.js مقارنةً بتطبيق "برمجة تطبيقات Google"
- يستخدم هؤلاء الشركاء واجهات REST API، بينما نستخدم نحن خدمات "برمجة تطبيقات Google".
- يستخدمون Google Drive ولكن ليس "جداول بيانات Google"، بينما يستخدم هذا التطبيق "جداول بيانات Google" ولكن ليس Drive.
في هذا الدرس التطبيقي حول الترميز، أردنا الجمع بين العديد من التقنيات في تطبيق واحد مع عرض الميزات وواجهات برمجة التطبيقات من جميع أنحاء Google Cloud بطريقة تشبه حالة استخدام واقعية. الهدف هو تشجيعك على استخدام خيالك والتفكير في استخدام كل من Cloud Console وGoogle Workspace لحل المشاكل الصعبة التي تواجه مؤسستك وعملائك.
أهداف الدورة التعليمية
- كيفية استخدام "برمجة تطبيقات Google" مع خدمات Google المتعددة
- كيفية استخدام Google BigQuery لتحليل البيانات الكبيرة
- كيفية إنشاء جدول بيانات Google وإدراج البيانات فيه
- كيفية إنشاء رسم بياني في "جداول بيانات Google"
- كيفية نقل البيانات والرسوم البيانية من "جداول بيانات Google" إلى عرض تقديمي في "العروض التقديمية من Google"
المتطلبات
- متصفّح ويب متصل بالإنترنت
- حساب Google (قد تتطلّب حسابات Google Workspace موافقة المشرف)
- معرفة أساسية بـ جداول بيانات Google
- إمكانية قراءة ترميز A1 في "جداول بيانات Google"
- مهارات JavaScript الأساسية
- يُفضّل أن يكون لديك معرفة بتطوير التطبيقات باستخدام Apps Script، ولكن ليس شرطًا
2. استطلاع
كيف ستستخدم هذا الدرس التطبيقي حول الترميز/الدليل التوجيهي/التعليمي؟
ما هو تقييمك لتجربتك مع أدوات المطوّرين وواجهات برمجة التطبيقات في Google Workspace؟
ما هو تقييمك لتجربتك مع برمجة تطبيقات تحديدًا؟
كيف يمكنك تقييم تجربتك مع أدوات المطوّرين وواجهات برمجة التطبيقات في Cloud Console؟
3- نظرة عامة
بعد أن عرفت موضوع هذا الدرس العملي، إليك ما ستفعله:
- استخدام نموذج حالي من "برمجة تطبيقات Google" وBigQuery وتفعيله
- من النموذج، تعرَّف على كيفية إرسال طلب بحث إلى BigQuery والحصول على النتائج.
- أنشئ جدول بيانات Google وأدرِج فيه النتائج من BigQuery.
- عدِّل الرمز لتغيير البيانات التي يتم عرضها وإدراجها في ورقة بيانات بشكل طفيف.
- استخدِم خدمة "برمجة تطبيقات" في Apps Script لإنشاء رسم بياني لبيانات BigQuery.
- استخدِم خدمة "العروض التقديمية من Google" لإنشاء عرض تقديمي في "العروض التقديمية من Google".
- أضِف عنوانًا وعنوانًا فرعيًا إلى شريحة العنوان التلقائية.
- أنشئ شريحة تتضمّن جدول بيانات، ثم صدِّر خلايا بيانات "جداول بيانات Google" إلى هذه الشريحة.
- أنشئ شريحة أخرى وأدرِج فيها الرسم البياني لجدول البيانات.
لنبدأ ببعض المعلومات الأساسية عن "برمجة تطبيقات Google" وBigQuery و"جداول بيانات Google" و"العروض التقديمية من Google".
برمجة تطبيقات Google وBigQuery
برمجة تطبيقات Google هي منصة تطوير في Google Workspace تعمل بمستوى أعلى من واجهات Google REST API. وهي بيئة تطوير واستضافة تطبيقات بدون خادم يمكن لجميع المطوّرين بمختلف مستويات مهاراتهم الوصول إليها. في الأساس، "برمجة تطبيقات Google" هي بيئة وقت تشغيل JavaScript بدون خادم لأتمتة Google Workspace وتوسيعها ودمجها.
تستخدم هذه المنصة JavaScript من جهة الخادم، على غرار Node.js، ولكنّها تركّز على التكامل المحكم مع Google Workspace وخدمات Google الأخرى بدلاً من الاستضافة السريعة وغير المتزامنة للتطبيقات المستندة إلى الأحداث. ويوفّر أيضًا بيئة تطوير قد تختلف عن البيئة التي اعتدت عليها. باستخدام "برمجة تطبيقات Google"، يمكنك إجراء ما يلي:
- تطوير النصوص البرمجية باستخدام أداة تعديل الرموز المستندة إلى المتصفح، ولكن يمكن أيضًا التطوير محليًا عند استخدام
clasp، وهي أداة نشر سطر الأوامر في "برمجة التطبيقات" - كتابة الرموز البرمجية في إصدار متخصص من JavaScript مخصّص للوصول إلى Google Workspace وخدمات أخرى من Google أو خدمات خارجية (باستخدام خدمات
URL FetchأوJDBCفي Apps Script) - يمكنك تجنُّب كتابة رمز التفويض لأنّ "برمجة التطبيقات" تتولّى ذلك نيابةً عنك.
- لست بحاجة إلى استضافة تطبيقك، فهو يعمل على خوادم Google في السحابة الإلكترونية.
تتفاعل "برمجة تطبيقات Google" مع تكنولوجيات Google الأخرى بطريقتَين مختلفتَين:
- كخدمة مدمجة
- كخدمة متقدّمة
تحتوي الخدمة المضمّنة على طرق عالية المستوى للتفاعل مع بيانات المستخدمين وأنظمة Google الأخرى والأنظمة الخارجية. الخدمة المتقدّمة هي في الأساس برنامج تضمين بسيط لواجهة برمجة تطبيقات Google Workspace أو Google REST API. توفّر الخدمات المتقدّمة تغطية كاملة لواجهة REST API ويمكنها غالبًا تنفيذ مهام أكثر من الخدمات المضمّنة، ولكنّها تتطلّب المزيد من التعقيد في الرمز البرمجي (مع أنّها تظل أسهل في الاستخدام من واجهة REST API الكاملة). يجب أيضًا تفعيل الخدمات المتقدّمة لمشروع البرنامج النصي قبل استخدامها.
ننصح المطوّرين باستخدام خدمة مضمّنة كلما أمكن ذلك لأنّها أسهل في الاستخدام وتوفّر مزايا أكثر من الخدمات المتقدّمة. ومع ذلك، لا تتضمّن بعض واجهات Google API خدمات مدمجة، لذا قد تكون الخدمة المتقدّمة هي الخيار الوحيد. على سبيل المثال، لا تتضمّن Google BigQuery خدمة مضمّنة، ولكن تتوفّر خدمة BigQuery. خدمة BigQuery هي إحدى خدمات Cloud Console التي تتيح لك استخدام Google BigQuery API لتنفيذ طلبات بحث في مجموعات كبيرة من البيانات (مثل عدة تيرابايت)، ولكنها لا تزال قادرة على تقديم النتائج في ثوانٍ.
الوصول إلى "جداول بيانات Google" و"العروض التقديمية من Google" من خلال "برمجة تطبيقات Google"
على عكس BigQuery، تتضمّن كلّ من "جداول بيانات Google" و"العروض التقديمية من Google" خدمات مضمّنة. تتضمّن أيضًا خدمات متقدّمة للوصول إلى الميزات المتوفّرة في واجهة برمجة التطبيقات فقط. اطّلِع على المستندات الخاصة بكل من خدمتي جداول بيانات Google والعروض التقديمية من Google المضمّنتين قبل الانتقال إلى الرمز. يُرجى العِلم أنّه تتوفّر أيضًا مستندات للخدمات المتقدّمة لكل من جداول بيانات Google والعروض التقديمية من Google.
4. المهمة 1: تنفيذ BigQuery وتسجيل النتائج في "جداول بيانات Google"
مقدمة
سننفّذ جزءًا كبيرًا من هذا الدرس التطبيقي باستخدام هذه المهمة الأولى. في الواقع، بعد الانتهاء من هذه الخطوة، ستكون قد أتممت نصف درس تطبيقي حول الترميز بالكامل. سيتم تقسيمها إلى عدة أقسام فرعية، وستتمكّن من:
- أنشِئ مشروعًا على كلّ من برمجة تطبيقات Google وCloud Console.
- فعِّل الوصول إلى خدمة BigQuery المتقدّمة.
- افتح أداة تعديل النصوص البرمجية وأدخِل رمز مصدر التطبيق.
- انتقِل إلى عملية تفويض التطبيق (OAuth2).
- شغِّل التطبيق الذي يرسل طلبًا إلى BigQuery.
- راجِع جدول بيانات Google الجديد الذي تم إنشاؤه باستخدام نتائج BigQuery.
الإعداد
- لإنشاء مشروع في "برمجة تطبيقات Google"، انتقِل إلى
script.google.comوانقر على مشروع جديد. - لإعادة تسمية مشروع برمجة تطبيقات، انقر على مشروع بلا عنوان، وأدخِل عنوانًا لمشروعك، ثم انقر على إعادة التسمية.
بعد ذلك، عليك إنشاء مشروع Cloud Console لطلب البيانات في BigQuery.
- لإنشاء مشروع على Cloud Console، استخدِم رابط الاختصار هذا لإنشاء مشروع، وأدخِل اسمًا للمشروع، ثم انقر على إنشاء.
- عند اكتمال عملية إنشاء المشروع، سيظهر إشعار على الصفحة. تأكَّد من اختيار مشروعك الجديد في قائمة المشاريع أعلى الصفحة.
- انقر على "القائمة"
وانتقِل إلى واجهات برمجة التطبيقات والخدمات > شاشة طلب موافقة OAuth (رابط مباشر). - انقر على داخلي > إنشاء لإنشاء تطبيق لمستخدمي Google Workspace داخل مؤسستك.
- في حقل اسم التطبيق، أدخِل "Big Data Codelab".
- أدخِل عناوين البريد الإلكتروني المخصّصة لدعم المستخدمين ومعلومات الاتصال بالمطوّر.
- انقر على حفظ ومتابعة > حفظ ومتابعة.
- انقر على "المزيد"
في شريط التنقل واختَر إعدادات المشروع (رابط مباشر). - انسخ القيمة المُدرَجة ضمن رقم المشروع. (سيتم استخدام حقل معرّف مشروع منفصل لاحقًا في الدرس العملي.)
بعد ذلك، عليك ربط مشروع برمجة تطبيقات بمشروع Cloud Console.
- بدِّل إلى أداة تعديل النصوص البرمجية وانقر على إعدادات المشروع
. - ضمن "مشروع Google Cloud Platform (GCP)"، انقر على تغيير المشروع.
- أدخِل رقم المشروع وانقر على ضبط المشروع.
- بعد ذلك، انقر على المحرّر
لبدء إضافة خدمة BigQuery المتقدّمة. - بجانب الخدمات، انقر على "إضافة خدمة"
. - في مربّع الحوار "إضافة خدمة" (Add a service)، اختَر BigQuery API وانقر على إضافة (Add).
الخطوة الأخيرة هي تفعيل BigQuery API في Cloud Console.
- لإجراء ذلك، انتقِل إلى Cloud Console وانقر على واجهات برمجة التطبيقات والخدمات > لوحة البيانات. (تأكَّد من أنّك لا تزال في المشروع نفسه الذي أنشأته في الخطوة 3).
- انقر على تفعيل واجهات برمجة التطبيقات والخدمات.
- ابحث عن "big query"، واختَر BigQuery API (وليس BigQuery Data Transfer API)، ثم انقر على تفعيل لتفعيلها.

أنت الآن مستعد لإدخال الرمز البرمجي للتطبيق وإكمال عملية التفويض وتشغيل الإصدار الأول من هذا التطبيق.
تحميل التطبيق وتشغيله
- في أداة تعديل النصوص البرمجية، استبدِل مجموعة الرموز
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());
}
- انقر على "حفظ"
.
- بجانب
Code.gs، انقر على "المزيد"
> إعادة التسمية. غيِّر العنوان من Code.gsإلىbq-sheets-slides.js. - بعد ذلك، لنراجع الرمز الذي يطلب البحث في 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 ضمن المتغيّر لمنع التطبيق من المتابعة بدون رقم تعريف المشروع.
- انتقِل إلى مشروعك على Cloud Console، وانقر على "المزيد"
في شريط التنقّل، ثم اختَر إعدادات المشروع. - انسخ القيمة المدرَجة ضمن رقم تعريف المشروع.
- ارجع إلى أداة تعديل النصوص البرمجية في برمجة تطبيقات، وابحث عن المتغيّر
PROJECT_IDفيbq-sheets-slides.js، ثم أضِف القيمة. - انقر على حفظ
> تشغيل.
- انقر على مراجعة الأذونات للمتابعة.
- بعد بدء تشغيل النص البرمجي، سيتم فتح سجلّ التنفيذ المضمّن وتسجيل إجراءات النص البرمجي في الوقت الفعلي.
- بعد أن يظهر في سجلّ التنفيذ "اكتمل التنفيذ"، انتقِل إلى Google Drive (
drive.google.com) وابحث عن جدول بيانات Google باسم "الكلمات الأكثر شيوعًا في جميع أعمال شكسبير" (أو الاسم الذي خصّصته للمتغيّرQUERY_NAME، إذا عدّلته): - افتح جدول البيانات لعرض الكلمات العشر الأكثر شيوعًا وإجمالي عدد مرات تكرارها مرتّبة ترتيبًا تنازليًا:

ملخّص المهمة 1
للمراجعة، شغّلت بعض الرموز البرمجية التي بحثت في جميع أعمال شكسبير، مع التدقيق في كل كلمة في كل مسرحية. وقد حسبت الكلمات ورتّبتها تنازليًا حسب عدد مرات ظهورها. استخدمت أيضًا خدمة برمجة تطبيقات المضمّنة في "جداول بيانات Google" لعرض هذه البيانات.
يمكنك أيضًا العثور على الرمز الذي استخدمته في bq-sheets-slides.js في المجلد step1 ضمن مستودع GitHub الخاص بهذا الدرس التطبيقي حول الترميز على github.com/googlecodelabs/bigquery-sheets-slides. استوحينا الرمز من هذا المثال الأصلي في صفحة "الخدمات المتقدّمة" في BigQuery الذي نفّذ طلب بحث مختلفًا بعض الشيء لاسترداد الكلمات الأكثر شيوعًا التي تتضمّن 10 أحرف أو أكثر والتي استخدمها شكسبير. يمكنك أيضًا الاطّلاع على مثال في مستودع GitHub.
إذا كنت مهتمًا بطلبات بحث أخرى يمكنك إنشاؤها باستخدام أعمال شكسبير أو جداول بيانات عامة أخرى، يمكنك الانتقال إلى كيفية طلب جداول BigQuery النموذجية ومستودع GitHub هذا.
يمكنك أيضًا تنفيذ طلبات البحث باستخدام صفحة BigQuery على Cloud Console قبل تنفيذها في برمجة تطبيقات. للعثور عليه، انقر على "القائمة"
وانتقِل إلى واجهة مستخدم BigQuery > مساحة عمل SQL (رابط مباشر). على سبيل المثال، إليك كيف يظهر طلب البحث في واجهة BigQuery الرسومية:

5- المهمة 2: إنشاء رسم بياني في "جداول بيانات Google"
الغرض من runQuery() هو استخدام BigQuery وإرسال نتائج البيانات إلى جدول بيانات Google. بعد ذلك، علينا إنشاء رسم بياني باستخدام البيانات. لننشئ دالة جديدة باسم createColumnChart() تستدعي طريقة newChart() في "جداول بيانات 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);
}
- تتطلّب الدالة
createColumnChart()مَعلمة كائن جدول بيانات، لذا علينا تعديلrunQuery()لعرض كائنspreadsheetيمكننا تمريره إلىcreateColumnChart(). في نهايةrunQuery()، أعِد الكائنspreadsheetبعد تسجيل عملية إنشاء ورقة البيانات بنجاح:
Logger.log('Results spreadsheet created: %s', spreadsheet.getUrl());
// NEW: Return the spreadsheet object for later use.
return spreadsheet;
}
- أنشئ دالة
createBigQueryPresentation()لاستدعاء كل منrunQuery()وcreateColumnChart(). يُعد الفصل منطقيًا بين وظائف BigQuery ووظائف إنشاء الرسوم البيانية من أفضل الممارسات، وذلك على النحو التالي:
/**
* Runs the query, adds data and a chart to a spreadsheet.
*/
function createBigQueryPresentation() {
var spreadsheet = runQuery();
createColumnChart(spreadsheet);
}
- لقد اتّخذت خطوتَين مهمّتَين أعلاه: عرض عنصر جدول البيانات وإنشاء دالة الإدخال. لجعل
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 من قائمة الدوال وانقر على تنفيذ. بعد اكتمال العملية، يتم إنشاء جدول بيانات آخر في Google Drive، ولكن هذه المرة يتم تضمين رسم بياني في الورقة بجانب البيانات:

6. المهمة 3: وضع بيانات النتائج في عرض تقديمي
يتضمّن الجزء الأخير من الدرس التطبيقي حول الترميز إنشاء عرض تقديمي في "العروض التقديمية من 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');
- الخطوة التالية في
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]));
}
}
- الخطوة الأخيرة في
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;
}
- بعد اكتمال الدالة، ألقِ نظرةً أخرى على توقيعها. يتطلّب
createSlidePresentation()مَعلمات كل من جدول البيانات وعنصر الرسم البياني. لقد عدّلناrunQuery()لعرض العنصرSpreadsheet، ولكن علينا إجراء تغيير مماثل علىcreateColumnChart()ليعرض عنصر رسم بياني (EmbeddedChart). ارجع إلىcreateColumnChart()وأضِف مقتطف الرمز التالي إلى نهاية الدالة:
// NEW: Return the chart object for later use.
return chart;
}
- بما أنّ الدالة
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
}
- احفظ البرنامج النصي ونفِّذه
createBigQueryPresentation()مرة أخرى. قبل تنفيذ ذلك، يحتاج تطبيقك إلى مجموعة أخرى من الأذونات من المستخدم لعرض عروض Google التقديمية وإدارتها. بعد مراجعة هذه الأذونات والسماح بها، سيتم تشغيل التطبيق كما كان من قبل. - الآن، بالإضافة إلى جدول البيانات الذي تم إنشاؤه، من المفترض أن تحصل أيضًا على عرض تقديمي جديد في "العروض التقديمية من Google" يتضمّن 3 شرائح (العنوان وجدول البيانات ومخطط البيانات)، كما هو موضّح أدناه:



7. الخاتمة
تهانينا، لقد أنشأت تطبيقًا يستخدم كلا جانبي Google Cloud. ينفّذ طلبًا في Google BigQuery يستعلم عن إحدى مجموعات البيانات العامة، وينشئ جدول بيانات في "جداول بيانات Google" لتخزين النتائج، ويضيف رسمًا بيانيًا استنادًا إلى البيانات، وأخيرًا ينشئ عرضًا تقديميًا في "العروض التقديمية من Google" يتضمّن البيانات ونتائج الرسم البياني من جدول البيانات.
هذه هي الخطوات التي اتّخذتها من الناحية الفنية. بشكل عام، انتقلت من تحليل البيانات الضخمة إلى نتيجة يمكنك تقديمها إلى الجهات المعنية، وكل ذلك يتم تلقائيًا باستخدام الرمز البرمجي. نأمل أن يلهمك هذا النموذج لتخصيصه لمشاريعك الخاصة. في نهاية هذا الدرس التطبيقي حول الترميز، سنقدّم بعض الاقتراحات حول كيفية تحسين نموذج التطبيق هذا بشكل أكبر.
بعد إجراء التغييرات من المهمة النهائية (باستثناء 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 آليًا.
مراجع لهذا التطبيق
الوثائق
- موقع إلكتروني خاص بمستندات برمجة تطبيقات Google
- برمجة التطبيقات: خدمة جداول بيانات Google
- برمجة التطبيقات: خدمة "العروض التقديمية من Google"
- برمجة تطبيقات: خدمة BigQuery المتقدّمة
الفيديوهات
- سرّ آخر من أسرار "برمجة تطبيقات Google"
- الوصول إلى "خرائط Google" من جدول بيانات
- Totally Unscripted
- معرض مطوّري Google Workspace
الأخبار والإشعارات
- مدوّنة Google Cloud Platform
- مدوّنة "تحليلات البيانات" في Google Cloud
- مدوّنة Google Developers
- Twitter: Google Developers (@googledevs)
- مدوّنة "مطوّرو Google Workspace"
- Twitter: مطوّرو Google Workspace (@workspacedevs)
دروس تطبيقية أخرى حول الترميز
مبتدئ
- [جداول بيانات Google] أساسيات "برمجة تطبيقات Google" مع "جداول بيانات Google"
- [واجهات REST API] استخدام Google Workspace وGoogle APIs للوصول إلى الملفات والمجلدات في Google Drive
متوسّط
- [Apps Script] أداة سطر الأوامر CLASP Apps Script
- [برمجة تطبيقات] إضافات Google Workspace في Gmail
- [برمجة تطبيقات] روبوتات دردشة مخصّصة في Hangouts Chat
- [واجهات REST API] استخدام "جداول بيانات Google" كأداة لإعداد التقارير في تطبيقك
- [واجهات REST API] إنشاء عروض تقديمية على "العروض التقديمية من Google" باستخدام BigQuery API
9. الخطوة التالية: تحدّيات الترميز
في ما يلي طرق مختلفة يمكنك من خلالها تحسين النموذج الذي أنشأناه في هذا الدرس التطبيقي حول الترميز أو زيادته. هذه القائمة ليست شاملة، ولكنّها تقدّم بعض الأفكار الملهمة حول كيفية اتّخاذ الخطوة التالية.
- التطبيق: هل تريد ألّا يقتصر استخدامك على JavaScript أو القيود التي تفرضها "برمجة تطبيقات Google"؟ يمكنك نقل هذا التطبيق إلى لغة البرمجة المفضّلة لديك التي تستخدم واجهات REST API لكلّ من Google BigQuery و"جداول بيانات Google" و"العروض التقديمية من Google".
- BigQuery: جرِّب طلب بحث مختلفًا عن مجموعة بيانات شكسبير التي تهمّك. يمكن العثور على نموذج طلب بحث آخر في تطبيق نموذج BigQuery الأصلي في "برمجة تطبيقات Google".
- BigQuery: يمكنك تجربة بعض مجموعات البيانات العامة الأخرى في BigQuery للعثور على مجموعة بيانات أكثر أهمية بالنسبة إليك.
- BigQuery: أشرنا سابقًا إلى استعلامات أخرى يمكنك إنشاؤها باستخدام أعمال شكسبير أو جداول البيانات العامة الأخرى. يمكنك العثور عليها في صفحة الويب هذه ومستودع GitHub هذا.
- جداول بيانات Google: جرِّب أنواعًا أخرى من الرسوم البيانية في معرض الرسوم البيانية.
- "جداول بيانات Google" وBigQuery: يمكنك استخدام مجموعة بيانات كبيرة من جدول البيانات. في عام 2016، قدّم فريق BigQuery ميزة تتيح للمطوّرين استخدام "جدول بيانات Google" كمصدر للبيانات. لمزيد من المعلومات، يُرجى الانتقال إلى دمج Google BigQuery مع Google Drive.
- شرائح: يمكنك إضافة شرائح أخرى إلى العرض التقديمي الذي تم إنشاؤه، مثل الصور أو مواد العرض الأخرى المرتبطة بتحليل البيانات الكبيرة. في ما يلي المستندات المرجعية للخدمة المضمّنة في "العروض التقديمية من Google".
- Google Workspace: استخدام خدمات Google Workspace أو خدمات Google المضمّنة الأخرى من خلال "برمجة تطبيقات Google" على سبيل المثال، Gmail و"تقويم Google" و"مستندات Google" وDrive و"خرائط Google" و"إحصاءات Google" وYouTube وما إلى ذلك، بالإضافة إلى الخدمات المتقدّمة الأخرى. لمزيد من المعلومات، انتقِل إلى نظرة عامة على المراجع لكل من الخدمات المضمّنة والمتقدّمة.