הופכים את Big Data לתובנות באמצעות Google Sheets ו-Slides

יש הרבה כלים למדעני נתונים לביצוע ניתוחים של נתונים גדולים, אבל בסופו של דבר, עדיין צריך להצדיק את התוצאות האלה בפני ההנהלה. קשה להציג הרבה מספרים על נייר או במסד נתונים לבעלי עניין מרכזיים. ב-Codelab הזה של Google Apps Script ברמת ביניים נעשה שימוש בשתי פלטפורמות למפתחים של Google, ‏ G Suite ו-Google Cloud Platform‏ (GCP), כדי לעזור לכם להשלים את השלב האחרון.

הכלים למפתחים של Google Cloud מאפשרים לכם לבצע ניתוח נתונים מעמיק, לקחת את התוצאות, להכניס אותן לגיליון אלקטרוני וליצור מצגת שקפים עם הנתונים האלה. כך תוכלו להציג את התוצאות להנהלה בצורה מתאימה יותר. בסדנת התכנות הזו נסביר על BigQuery API של GCP‏ (BigQuery) (בתור שירות מתקדם של Apps Script) ועל שירותי Apps Script המובנים ל-Google Sheets ול-Google Slides.

מוטיבציה/ידע קודם

האפליקציה לדוגמה במדריך הזה קיבלה השראה מדוגמאות הקוד האלה...

אפליקציית הדוגמה ב-codelab של Slides API כוללת גם את BigQuery ו-Slides, אבל היא שונה מאפליקציית הדוגמה של ה-codelab הזה בכמה דרכים:

  • אפליקציית Node.js לעומת אפליקציית Apps Script
  • משתמש ב-REST API בזמן שאנחנו משתמשים בשירותי Apps Script
  • האפליקציה משתמשת ב-Google Drive אבל לא ב-Google Sheets, ואילו האפליקציה הזו משתמשת ב-Sheets אבל לא ב-Drive

בסדנת התכנות הזו רצינו לשלב כמה שיותר טכנולוגיות באפליקציה אחת, ולהציג תכונות וממשקי API מכל Google Cloud באופן שדומה יותר לתרחיש שימוש מהחיים האמיתיים. המטרה היא לעורר בכם השראה להשתמש בדמיון ולשקול להשתמש ב-GCP וב-G Suite כדי לפתור בעיות מורכבות בארגון או אצל הלקוחות שלכם.

מה תלמדו

  • איך משתמשים ב-Google Apps Script עם כמה שירותי Google ‏ (GCP ו-G Suite)
  • איך משתמשים ב-Google BigQuery כדי לבצע ניתוח של Big Data
  • איך ליצור גיליון אלקטרוני ב-Google Sheets ולאכלס אותו בנתונים
  • איך יוצרים תרשים חדש ב-Sheets
  • איך מעבירים תרשימים ונתונים מ-Sheets למצגת ב-Google Slides

מה נדרש

  • גישה לאינטרנט ולדפדפן אינטרנט
  • חשבון Google (יכול להיות שחשבונות G Suite ידרשו אישור אדמין)
  • מיומנויות בסיסיות ב-JavaScript
  • ידע בפיתוח Apps Script יכול לעזור, אבל הוא לא חובה

איך תשתמשו ב-codelab או במדריך הזה?

אקרא את המדריך כדי לקבל מידע, ואולי אעביר אותו לעמיתים טכניים אעבור על המדריך עד כמה שאוכל ואנסה לבצע כמה שיותר תרגילים אשלים את כל המדריך בכל מקרה

איך היית מדרג את חוויית השימוש שלך בכלי הפיתוח ובממשקי ה-API של G Suite?

מתחילים בינוני מומחה

איזה דירוג מגיע לדעתך לחוויית השימוש שלך ב-Apps Script?

מתחילים בינוני מומחה

איך היית מדרג את חוויית השימוש שלך בכלי הפיתוח ובממשקי ה-API של GCP?

מתחילים ביניים מומחים

עכשיו, אחרי שהבנתם במה עוסק ה-codelab הזה, מה בדיוק אתם הולכים לעשות?

  1. שימוש בדוגמה קיימת של Apps Script-BigQuery כדי להפעיל אותה
  2. בדוגמה הזו מוסבר איך לשלוח שאילתה ל-BigQuery ולקבל את התוצאות שלה
  3. יצירת גיליון אלקטרוני ב-Google Sheets ואכלוס התוצאות מ-BigQuery
  4. לשנות קצת את הקוד כדי לשנות קלות את הנתונים שמוחזרים ומוסיפים לגיליון
  5. שימוש בשירות Sheets ב-Apps Script כדי ליצור תרשים לנתונים מ-BigQuery
  6. איך משתמשים בשירות Slides כדי ליצור מצגת חדשה
  7. הוספת שם וכותרת משנה לשקף הכותרת שנוצר אוטומטית כברירת מחדל לכל מצגת חדשה
  8. יוצרים שקף חדש עם טבלת נתונים, ואז מייבאים אליו את תאי הנתונים מגיליון ה-Sheets
  9. מוסיפים עוד שקף חדש ומוסיפים אליו את התרשים מהגיליון האלקטרוני

נתחיל עם מידע כללי על Apps Script,‏ BigQuery,‏ Sheets ו-Slides.

‫Google Apps Script ו-BigQuery

Google Apps Script היא פלטפורמת פיתוח של G Suite שפועלת ברמה גבוהה יותר משימוש ב-Google REST APIs. זוהי סביבה לפיתוח ולאירוח אפליקציות ללא שרת (serverless), שנגישה למפתחים ברמות שונות של מיומנות. במשפט אחד, "Apps Script הוא זמן ריצה של JavaScript ללא שרת לאוטומציה, להרחבה ולשילוב של G Suite".

זהו JavaScript בצד השרת, בדומה ל-Node.js, אבל הוא מתמקד בשילוב הדוק עם G Suite ושירותים אחרים של Google, ולא באירוח מהיר של אפליקציות אסינכרוניות מבוססות-אירועים. בנוסף, יש בה סביבת פיתוח שעשויה להיות שונה לחלוטין ממה שאתם רגילים. באמצעות Apps Script, אתם יכולים:

  • פיתוח בעורך קוד מבוסס-דפדפן, אבל אפשר לבחור לפתח באופן מקומי אם משתמשים ב-clasp, כלי הפריסה של שורת הפקודה ל-Apps Script
  • לכתוב קוד בגרסה מיוחדת של JavaScript שמותאמת לגישה ל-G Suite ולשירותים אחרים של Google או לשירותים חיצוניים (באמצעות שירותי URLfetch או Jdbc של Apps Script)
  • לא צריך לכתוב קוד הרשאה כי Apps Script מטפל בזה בשבילכם
  • לא צריך לארח את האפליקציה – היא פועלת בשרתי Google בענן

הערה: רוב התוכן של ה-codelab הזה לא עוסק ב-Apps Script. יש באינטרנט הרבה מקורות מידע שיעזרו לכם. במסמכי התיעוד הרשמיים יש גם סקירה כללית עם מדריכים למתחילים, מדריכים וסרטונים. ולסיום, אל תשכחו לעיין ב-Apps Script introductory codelab, שמומלץ להשלים אותו לפני שמתחילים את המדריך הזה.

ממשקי Apps Script פועלים עם טכנולוגיות אחרות של Google בשתי דרכים שונות:

  • שירות מובנה/מקורי
  • שירות מתקדם

שירות מובנה מספק שיטות ברמה גבוהה שבהן אפשר להשתמש כדי לגשת לנתונים של G Suite או של מוצר Google, או שיטות שימושיות אחרות. שירות מתקדם הוא רק מעטפת דקה סביב G Suite או Google REST API. שירותים מתקדמים מספקים כיסוי מלא של ה-API ל-REST, ולעתים קרובות יכולים לעשות יותר מהשירותים המובנים, אבל הם דורשים קוד מורכב יותר (אבל עדיין קלים יותר לשימוש מה-API ל-REST עצמו). כדי להשתמש בשירותים מתקדמים, צריך גם להפעיל אותם בפרויקט של סקריפט.

כשהדבר אפשרי, מפתחים צריכים להעדיף שירות מובנה כי קל יותר להשתמש בו והוא מבצע יותר פעולות מאשר שירותים מתקדמים. עם זאת, לחלק מ-Google APIs אין שירותים מובנים, ולכן שירות מתקדם עשוי להיות האפשרות היחידה. דוגמה לכך היא Google BigQuery… אין שירות מובנה זמין, אבל שירות מתקדם של BigQuery כן קיים. (עדיף על שום שירות, נכון?) אם אתם חדשים ב-BigQuery, זהו שירות GCP שמאפשר לכם להריץ שאילתות פשוטות (או מורכבות) על מערכי נתונים גדולים מאוד, למשל בסדר גודל של כמה טרה-בייט, ועדיין לקבל תוצאות תוך שניות.

גישה ל-Google Sheets ול-Slides מ-Apps Script

בניגוד ל-BigQuery, גם ל-Google Sheets וגם ל-Slides יש שירותים מובנים (וגם שירותים מתקדמים, שמשמשים רק לגישה לתכונות שקיימות רק ב-API). לפני שמתחילים לכתוב קוד, כדאי לעיין במסמכים של שירותי Sheets ו-Slides המובנים. כמובן שיש גם מסמכים לשירותים המתקדמים. הנה קישורים למסמכים של Sheets ושל Slides.

מבוא

במשימה הראשונה הזו נתחיל לפתור את הבעיה שמוצגת ב-codelab. למעשה, אחרי שתסיימו את השלב הזה, תהיו בערך באמצע הדרך של כל ה-codelab. המדריך מחולק לכמה חלקים, ובו תמצאו הסברים על הפעולות הבאות:

  • התחלת פרויקט חדש של סקריפט של Google Apps
  • הפעלת גישה לשירות המתקדם של BigQuery
  • עוברים לעורך הפיתוח ומזינים את קוד המקור של האפליקציה
  • משלימים את תהליך ההרשאה של האפליקציה (OAuth2)
  • מריצים את האפליקציה ששולחת בקשה ל-BigQuery
  • הצגת גיליון חדש לגמרי ב-Google Sheets שנוצר עם התוצאות מ-BigQuery

הגדרה

  1. א) יוצרים פרויקט חדש ב-Apps Script על ידי מעבר אל script.google.com . יש קווי מוצרים שונים של G Suite, והאופן שבו יוצרים פרויקט חדש עשוי להיות שונה בהתאם לגרסה שבה אתם משתמשים. אם אתם משתמשים רק בחשבון Gmail וחדשים בפיתוח פרויקטים, יוצג לכם מסך ריק עם לחצן ליצירת הפרויקט הראשון:


ב) אם לא, יכול להיות שיוצגו כל הפרויקטים שלכם ולחצן גדול עם +חדש בפינה הימנית העליונה. במקרה כזה, לוחצים עליו.



ג) אם לא, יכול להיות שהמסך ייראה כמו בתמונה שלמטה. אם כן, מחפשים את סמל תפריט ההמבורגר בפינה הימנית העליונה ובוחרים באפשרות +סקריפט חדש.



ד) למי שמעדיף את שורת הפקודה. הכלי שלכם הוא clasp, ובאופן ספציפי, תריצו את הפקודה clasp create.

ה) הדרך האחרונה ליצור פרויקט סקריפט חדש היא פשוט להיכנס לקיצור הדרך: https://script.google.com/create.

  1. לא משנה באיזו שיטה השתמשתם כדי להתחיל פרויקט חדש, בסופו של דבר תועברו לעורך הקוד של Apps Script, למסך שנראה כך:


  2. לוחצים על File > Save ונותנים שם לפרויקט.
  3. לאחר מכן תצטרכו ליצור פרויקט ב-Google Cloud Console כדי להריץ שאילתות BigQuery.
  1. יוצרים פרויקט חדש, נותנים לו שם, בוחרים חשבון לחיוב ולוחצים על CREATE.
  1. כשהפרויקט ייווצר, תופיע הודעה בפינה השמאלית העליונה של הדף. לוחצים על הערך Create Project: <Project Name> כדי לפתוח את הפרויקט.
  2. לוחצים על סמל התפריט בפינה הימנית העליונה ועוברים אל APIs & Services > Credentials (ממשקי API ושירותים > פרטי כניסה). לוחצים על הכרטיסייה מסך הסכמה ל-OAuth (קישור ישיר).
  3. בשדה שם האפליקציה מזינים Big Data Codelab ולוחצים על הלחצן שמירה בתחתית.
  4. לוחצים על סמל האפשרויות הנוספות (3 נקודות) בפינה השמאלית העליונה כדי להרחיב את התפריט, ובוחרים באפשרות הגדרות הפרויקט (קישור ישיר).
  5. מעתיקים את הערך שמופיע בקטע מספר הפרויקט. (יש שדה נפרד בשם מזהה מוצר שנשתמש בו בהמשך ה-codelab).
  6. חוזרים לעורך Apps Script ולוחצים על Resources > Cloud Platform project (משאבים > פרויקט Cloud Platform).
  7. מזינים את מספר הפרויקט בתיבת הטקסט ולוחצים על Set Project (הגדרת פרויקט). כשמופיעה בקשה, לוחצים על אישור.
  8. בסיום, לוחצים על הכפתור סגירה כדי לסגור את תיבת הדו-שיח.
  9. אחרי שמגדירים פרויקט חדש, צריך להפעיל את השירות המתקדם של BigQuery. לשם כך, פותחים את התפריט הנפתח Resources -> Advanced Google Services ומפעילים את BigQuery API.


  10. בהערה שבתחתית הדף מצוין שצריך להפעיל את השירותים האלה גם ב'מרכז הבקרה של ה-API של Google Cloud Platform'. לכן, לוחצים על הקישור הזה שנפתח בכרטיסייה אחרת בדפדפן, אל מסוף המפתחים או 'devconsole' בקיצור.
  11. ב-devconsole, לוחצים על הלחצן +Enable APIs and Services (הפעלת ממשקי API ושירותים) בחלק העליון, מחפשים את BigQuery, בוחרים את BigQuery API (לא את BigQuery Data Transfer API) ולוחצים על enable (הפעלה) כדי להפעיל אותו. משאירים את כרטיסיית הדפדפן הזו פתוחה.

    הערה: אחרי שה-API מופעל, יכול להיות שתוצג הערה בדף הזה, למשל "כדי להשתמש ב-API הזה, צריך ליצור פרטי כניסה...", אבל אין צורך לדאוג לגבי זה בשלב הזה – Apps Script יבצע את השלב הזה בשבילכם.


  12. חוזרים לכרטיסייה בדפדפן של עורך הקוד. עדיין נמצאים בתפריט Advanced Google Services (שירותים מתקדמים של Google), אז לוחצים על OK כדי לסגור את תיבת הדו-שיח ולחזור לעורך הקוד. לוחצים על שם הפרויקט בחלק העליון ונותנים לו שם שרוצים, למשל BigQuery demo או שם דומה. אנחנו קראנו לפרויקט שלנו final mile.

עכשיו אפשר להזין את קוד האפליקציה, לעבור את תהליך ההרשאה ולהפעיל את הגרסה הראשונה של האפליקציה.

העלאה והפעלה של האפליקציה

  1. מעתיקים את הקוד בתיבה שלמטה ומדביקים אותו במקום כל מה שמופיע בעורך הקוד:
// Filename for data results
var QUERY_NAME = "Most common words in all of Shakespeare's works";
// Replace this value with your Google Cloud API project ID
var PROJECT_ID = '';
if (!PROJECT_ID) throw Error('Project ID is required in setup');

/**
 * Runs a BigQuery query; puts results into Sheet. You must enable
 * the BigQuery advanced service before you can run this code.
 * @see http://developers.google.com/apps-script/advanced/bigquery#run_query
 * @see http://github.com/googleworkspace/apps-script-samples/blob/main/advanced/bigquery.gs
 *
 * @returns {Spreadsheet} Returns a spreadsheet with BigQuery results
 * @see http://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 BQ 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 new 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 ל-bq-sheets-slides.js. אז מה הקוד הזה עושה? כבר אמרנו לכם שהיא שולחת שאילתה ל-BigQuery וכותבת את התוצאות בגיליון אלקטרוני חדש של Google Sheets, אבל מהי השאילתה הזו? הוא מופיע בחלק העליון של 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.

  1. אנחנו כמעט מוכנים לנסות את זה, אבל לא לגמרי. כפי שאפשר לראות בחלק העליון של קטע הקוד הזה, נדרש מזהה פרויקט תקין, ולכן צריך להוסיף את המזהה שלכם לקוד האפליקציה. כדי לעשות את זה, חוזרים לחלון או לכרטיסייה בדפדפן שבהם נמצא דף מסוף הפיתוח. (הזכרנו לך להשאיר אותה פתוחה, נכון?)
  2. בפינה הימנית העליונה, משמאל לאווטאר של חשבון Google, נמצא התפריט הנפתח (). לוחצים עליו ובוחרים באפשרות הגדרות הפרויקט. יוצגו השם, המזהה והמספר של הפרויקט. מעתיקים את מזהה הפרויקט ומגדירים את המשתנה PROJECT_ID בחלק העליון של bq-sheets-slides.js לערך שקיבלתם מ-Developer Console. הערה: אם בורר התפריט נתקע ולא ניתן להשתמש בו, צריך לטעון מחדש את הדף.
  3. ההצהרה if נועדה למנוע מהאפליקציה להמשיך בלי מזהה פרויקט. אחרי שמוסיפים את המזהה, שומרים את הקובץ ומריצים את הקוד. כדי לעשות את זה, עוברים לסרגל התפריטים ובוחרים באפשרות Run > Run function > runQuery (הפעלה > הפעלת פונקציה > runQuery). לוחצים על תיבת הדו-שיח בדיקת הרשאות, על האפשרות 'האפליקציה הזו לא אומתה' ועל קובץ ה-GIF המונפש שמופיע בהמשך (של אפליקציה אחרת) כדי לראות את השלבים הבאים:
  4. אחרי שתבקשו לבדוק את ההרשאות, תוצג לכם תיבת דו-שיח חדשה, כמו שמוצג למעלה. בוחרים את חשבון Google הנכון שדרכו יופעל הסקריפט, בוחרים באפשרות מתקדם, גוללים למטה ולוחצים על 'מעבר אל <שם הפרויקט שלך> (לא בטוח)' כדי להגיע למסך ההרשאה של אפליקציית OAuth2. (כאן אפשר לקרוא מידע נוסף על תהליך האימות ולהבין למה המסך הזה מופיע בין המשתמש לבין תיבת הדו-שיח של ההרשאה ב-OAuth2 שמופיעה בהמשך).


    הערה: אחרי שתאשרו את האפליקציה, לא תצטרכו לחזור על התהליך הזה בכל הפעלה. רק במשימה 3 בהמשך המדריך הזה תראו שוב את תיבת הדו-שיח הזו, שבה תתבקשו לתת הרשאת משתמש ליצירה ולניהול של מצגות ב-Google Slides.
  5. אחרי שלוחצים על אישור בתיבת הדו-שיח של OAuth2, הסקריפט מתחיל לפעול... בחלק העליון תופיע תיבת דו-שיח בצבע צהוב פסטל. הוא פועל די מהר, כך שאולי לא תשימו לב שהוא פועל או שההפעלה הסתיימה.

  6. תיבת הדו-שיח הזו נעלמת כשהפעולה מסתיימת. אם היא לא מופיעה, כנראה שהפעולה הסתיימה. עוברים אל Google Drive ‏(drive.google.com) ומחפשים גיליון אלקטרוני חדש של Google Sheets בשם 'Most common words in all of Shakespeare's works' (המילים הנפוצות ביותר בכל היצירות של שייקספיר) או כל שם שהקציתם למשתנה QUERY_NAME:


  7. פותחים את הגיליון האלקטרוני ורואים 10 שורות של מילים והספירה הכוללת שלהן, ממוינות בסדר יורד:

סיכום משימה 1

תנסו להבין מה קרה הרגע... הפעלתם קוד שביצע שאילתה על כל היצירות של שייקספיר (לא כמות גדולה של נתונים, אבל בהחלט יותר טקסט ממה שאפשר לסרוק בקלות לבד, כשמסתכלים על כל מילה בכל מחזה, מנהלים ספירה של מילים כאלה ואז ממיינים אותן בסדר יורד לפי מספר המופעים). לא רק שביקשתם מ-BigQuery לעשות את זה בשבילכם, אלא גם השתמשתם בשירות המובנה ב-Apps Script ל-Google Sheets כדי להכניס את הנתונים לשם לצריכה קלה.

הקוד של bq-sheets-slides.js (שם הקובץ שבחרנו) שהעתקתם למעלה (מלבד PROJECT_ID שצריך להיות מזהה פרויקט אמיתי) נמצא גם בתיקייה step1 במאגר GitHub של ה-codelab הזה בכתובת github.com/googlecodelabs/bigquery-sheets-slides. הקוד הזה מבוסס על הדוגמה המקורית בדף השירותים המתקדמים של BigQuery, שבה הופעלה שאילתה קצת שונה… מהן המילים הפופולריות ביותר שבהן שייקספיר השתמש, עם 10 תווים או יותר. אפשר לראות את הדוגמה הזו גם במאגר GitHub שלה.

אם אתם רוצים לנסות שאילתות אחרות על יצירות של שייקספיר או על טבלאות אחרות של נתונים ציבוריים, כדאי לעיין גם בדף האינטרנט הזה וגם בזה. לא משנה באיזו שאילתה משתמשים, תמיד אפשר לבדוק את השאילתה במסוף BigQuery לפני שמריצים אותה ב-Apps Script. ממשק המשתמש של BigQuery זמין למפתחים בכתובת bigquery.cloud.google.com. לדוגמה, כך נראית השאילתה שלנו באמצעות ממשק המשתמש של BigQuery:

בשלבים שלמעלה השתמשנו בעורך הקוד של Apps Script, אבל אפשר גם לפתח באופן מקומי באמצעות שורת פקודה. אם אתם מעדיפים, אתם יכולים ליצור סקריפט בשם bq-sheets-slides.js, להדביק בו את הקוד שלמעלה ואז להעלות אותו ל-Google באמצעות הפקודה clasp push. (אם פספסתם את זה קודם, הנה שוב הקישור ל-clasp והסבר איך להשתמש בו).

המטרה של runQuery() היא לתקשר עם BigQuery ולשלוח את התוצאות שלו לגיליון. עכשיו צריך ליצור תרשים עם הנתונים. כדי לעשות את זה, ניצור פונקציה חדשה בשם createColumnChart() שקוראת לשיטה newChart() של הגיליון.

  1. יצירת תרשים. מוסיפים את גוף התג createColumnChart() שמוצג בהמשך אל bq-sheets-slides.js מיד אחרי runQuery(). הוא מקבל את הגיליון עם הנתונים ומבקש תרשים עמודות עם כל הנתונים. טווח הנתונים מתחיל בתא A2 כי השורה הראשונה מכילה את כותרות העמודות ולא נתונים.
/**
 * Uses spreadsheet data to create columnar chart.
 * @param {Spreadsheet} Spreadsheet containing results data
 * @returns {EmbeddedChart} visualizing the results
 * @see http://developers.google.com/apps-script/reference/spreadsheet/embedded-chart
 */
function createColumnChart(spreadsheet) {
  // Retrieve the populated (first and only) 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 params.
  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(). אחרי שמתעדים את היצירה של גיליון Google, מחזירים את האובייקט spreadsheet בסוף runQuery(), מיד אחרי שורת היומן:
  Logger.log('Results spreadsheet created: %s', spreadsheet.getUrl());

  // NEW: Return the spreadsheet object for later use.
  return spreadsheet;
}
  1. הפונקציה createBigQueryPresentation()נהיגה. הפרדה לוגית בין הפונקציונליות של BigQuery לבין יצירת התרשימים היא רעיון מצוין. עכשיו ניצור פונקציה של createBigQueryPresentation() כדי להפעיל את האפליקציה, ונקרא גם ל-runQuery() וגם ל-createColumnChart(). הקוד שמוסיפים צריך להיראות בערך כך:
/**
 * Runs a BigQuery query, adds data and a chart in a Sheet.
 */
function createBigQueryPresentation() {
  var spreadsheet = runQuery();
  createColumnChart(spreadsheet);
}
  1. שימוש חוזר בקוד. ביצעתם שני שלבים חשובים: החזרתם את אובייקט הגיליון האלקטרוני ויצרתם פונקציית הפעלה. מה קורה אם עמית רוצה לעשות שימוש חוזר ב-runQuery() ולא רוצה שכתובת ה-URL תתועד? כדי שיהיה קל יותר להבין את runQuery() לשימוש כללי, צריך להעביר את שורת היומן הזו. מה המקום הכי טוב להעביר אותו? אם ניחשתם createBigQueryPresentation(), צדקתם! אחרי העברת שורת היומן, היא אמורה להיראות כך:
/**
 * Runs a BigQuery query, adds data and a chart in a Sheet.
 */
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):

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

/**
 * Runs a BigQuery query; puts results into Sheet. You must enable
 * the BigQuery advanced service before you can run this code.
 * @see http://developers.google.com/apps-script/advanced/bigquery#run_query
 * @see http://github.com/googleworkspace/apps-script-samples/blob/main/advanced/bigquery.gs
 *
 * @returns {Sheet} Returns a sheet with results
 * @see http://developers.google.com/apps-script/reference/spreadsheet/sheet
 */
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 BQ 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 new 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 columnar chart.
 * @param {Spreadsheet} Spreadsheet containing results data
 * @returns {EmbeddedChart} visualizing the results
 * @see http://developers.google.com/apps-script/reference/spreadsheet/embedded-chart
 */
function createColumnChart(spreadsheet) {
  // Retrieve the populated (first and only) 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 params.
  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 in a Sheet.
 */
function createBigQueryPresentation() {
  var spreadsheet = runQuery();
  Logger.log('Results spreadsheet created: %s', spreadsheet.getUrl());
  createColumnChart(spreadsheet);
}

שומרים את הקובץ, עוברים לחלק העליון של עורך הקוד ומשנים את ההגדרה להרצה createBigQueryPresentation() במקום runQuery(). אחרי שמריצים את הסקריפט, מקבלים עוד גיליון אלקטרוני של Google, אבל הפעם מופיע תרשים בגיליון לצד הנתונים:

בחלק האחרון של ה-codelab יוצרים מצגת חדשה ב-Google Slides, ממלאים את הכותרת וכותרת המשנה בשקף הכותרת, ואז מוסיפים 2 שקפים חדשים, אחד לכל אחד מתאי הנתונים ואחד לתרשים.

  1. Create slide deck (יצירת מצגת). כל העבודה על מצגת השקפים תתבצע ב-createSlidePresentation(), שאותו נוסיף ל-bq-sheets-slides.js מיד אחרי createColumnChart(). נתחיל ביצירת מצגת חדשה, ואז נוסיף כותרת וכותרת משנה לשקף הכותרת שמופיע כברירת מחדל בכל המצגות החדשות.
/**
 * Create presentation with spreadsheet data & chart
 * @param {Spreadsheet} Spreadsheet with results data
 * @param {EmbeddedChart} Sheets chart to embed on slide
 * @returns {Presentation} Slide deck with results
 */
function createSlidePresentation(spreadsheet, chart) {
  // Create the new 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('via GCP and G Suite 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 of
  // the dimensions of the data range; fails if Sheet 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 chart object for later use
  return chart;
}
  1. עדכון createBigQueryPresentation(). הפונקציה createColumnChart() מחזירה את התרשים, ולכן צריך לשמור את התרשים הזה במשתנה ואז להעביר גם את הגיליון האלקטרוני וגם את התרשים לפונקציה createSlidePresentation(). מכיוון שאנחנו מתעדים את כתובת ה-URL של הגיליון האלקטרוני שנוצר, נתעד גם את כתובת ה-URL של המצגת החדשה. מעדכנים את createBigQueryPresentation() כך שייראה כך:
/**
 * Runs a BigQuery query, adds data and a chart in a Sheet,
 * 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 Slides. אחרי שמאשרים את ההרשאה, היא תפעל כמו קודם.
  2. בנוסף לגיליון שנוצר, אמורה להתקבל גם מצגת חדשה ב-Slides עם 3 שקפים (שקף כותרת, טבלת נתונים ותרשים נתונים), כמו שמוצג בהמשך:

מעולה! יצרתם עכשיו אפליקציה שמנצלת את שני הצדדים של Google Cloud. האפליקציה מבצעת בקשה ל-Google BigQuery שיוצרת שאילתה על אחת מקבוצות הנתונים הציבוריות שלו, יוצרת גיליון אלקטרוני חדש ב-Google Sheets לאחסון התוצאות, מוסיפה תרשים שמבוסס על הנתונים ששוחזרו, ולבסוף יוצרת מצגת ב-Google Slides שכוללת את התוצאות ואת התרשים בגיליון האלקטרוני.

זה מה שעשית מבחינה טכנית. באופן כללי, עברתם מניתוח של נתונים גדולים למשהו שאפשר להציג לבעלי עניין, והכול בקוד ובאופן אוטומטי. אנחנו מקווים שהדוגמה הזו תעורר בכם השראה ותעזור לכם להתאים אותה לפרויקטים שלכם. בסיום ה-codelab הזה, נציע כמה הצעות לשיפור נוסף של האפליקציה לדוגמה.

אחרי השינויים שצוינו למעלה במשימה האחרונה (שוב, למעט PROJECT_ID), הקובץ bq-sheets-slides.js אמור להיראות כך (אפשר למצוא אותו גם בתיקייה final במאגר GitHub):

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.
 */

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

/**
 * Runs a BigQuery query; puts results into Sheet. You must enable
 * the BigQuery advanced service before you can run this code.
 * @see http://developers.google.com/apps-script/advanced/bigquery#run_query
 * @see http://github.com/googleworkspace/apps-script-samples/blob/main/advanced/bigquery.gs
 *
 * @returns {Spreadsheet} Returns a spreadsheet with BigQuery results
 * @see http://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 BQ 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 new 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 columnar chart.
 * @param {Spreadsheet} Spreadsheet containing results data
 * @returns {EmbeddedChart} visualizing the results
 * @see http://developers.google.com/apps-script/reference/spreadsheet/embedded-chart
 */
function createColumnChart(spreadsheet) {
  // Retrieve the populated (first and only) 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 params.
  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 & chart
 * @param {Spreadsheet} Spreadsheet with results data
 * @param {EmbeddedChart} Sheets chart to embed on slide
 * @returns {Presentation} Returns a slide deck with results
 * @see http://developers.google.com/apps-script/reference/slides/presentation
 */
function createSlidePresentation(spreadsheet, chart) {
  // Create the new 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('via GCP and G Suite 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 of
  // the dimensions of the data range; fails if Sheet 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 in a Sheet,
 * 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());
}

הקובץ השני ב-codelab הזה, קובץ המניפסט של Apps Script,‏ appsscript.json, לא ממלא תפקיד ב-codelab הזה. כדי לגשת אליו, עוברים לכרטיסיית הדפדפן של עורך הקוד ובוחרים באפשרות תצוגה > הצגת קובץ המניפסט מהתפריט בחלק העליון. התוכן צריך להיראות בערך כך:

appsscript.json

{
  "timeZone": "America/Los_Angeles",
  "dependencies": {
    "enabledAdvancedServices": [{
      "userSymbol": "BigQuery",
      "serviceId": "bigquery",
      "version": "v2"
    }]
  },
  "exceptionLogging": "STACKDRIVER"
}

קובץ המניפסט הוא קובץ הגדרות ברמת המערכת ש-Apps Script משתמש בו כדי לדעת איזו סביבת הפעלה צריכה להיות זמינה לאפליקציה. הסבר על התוכן של קובץ מניפסט חורג מהיקף ה-codelab הזה, אבל תוכלו לקבל מושג לגבי הפעולות שהוא מבצע.

בהמשך מופיעים מקורות מידע נוספים שיעזרו לכם להעמיק בחומר שמופיע ב-codelab הזה, וגם לבדוק דרכים אחרות לגשת לכלי הפיתוח של Google באופן פרוגרמטי. אנחנו שואפים לשמור על סנכרון בין ה-codelab הזה לבין המאגר.

מקורות מידע על האפליקציה הזו

מאמרי עזרה

Codelabs אחרים

רמה למתחילים

רמה בינונית

אפליקציות הפניה

בהמשך מופיעות כמה 'משימות תכנות' שונות שבעזרתן אפשר לשפר או להרחיב את הדוגמה שיצרנו ב-codelab הזה. הרשימה הזו היא כמובן לא מלאה, אבל היא יכולה לתת לכם כמה רעיונות מעוררי השראה לגבי הצעד הבא.

  • אפליקציה. לא רוצים להיות מוגבלים בשימוש ב-JavaScript או בהגבלות שמוטלות על ידי Apps Script? העברה של האפליקציה הזו לשפת התכנות המועדפת עליך שמשתמשת בממשקי REST API ל-Google BigQuery, ‏Sheets ו-Slides.
  • BigQuery. אפשר לנסות שאילתה אחרת במערך הנתונים של שייקספיר... אולי תמצאו שאילתה שתעניין אתכם. שאילתה לדוגמה נוספת זמינה באפליקציית הדוגמה המקורית של Apps Script BigQuery.
  • BigQuery. אפשר להתנסות עם חלק ממערכי הנתונים הציבוריים האחרים של BigQuery... אולי תמצאו מערך נתונים שיהיה משמעותי יותר עבורכם.
  • BigQuery. קודם לכן הזכרנו שאפשר לנסות שאילתות אחרות על יצירות של שייקספיר או על טבלאות אחרות של נתונים ציבוריים, ורצינו לשתף שוב את דף האינטרנט הזה וגם את זה.
  • Sheets. נסו סוגים אחרים של תרשימים.
  • Sheets ו-BigQuery. אפשר להפוך את היוצרות… יכול להיות שיש לכם מערך נתונים גדול בגיליון אלקטרוני איפשהו. בשנת 2016, צוות BigQuery הציג את התכונה שמאפשרת למפתחים להשתמש בגיליון כבסיס נתונים (מידע נוסף זמין בפוסטים בבלוג 1 ו2).
  • Slides. מוסיפים שקפים אחרים למצגת שנוצרה, כמו תמונות או נכסים אחרים שקשורים לניתוח הביג דאטה. כאן אפשר למצוא מדריך לתחילת העבודה עם שירות Slides המובנה.
  • G Suite. אפשר להשתמש בשירותים מובנים אחרים של G Suite או של Google מ-Apps Script, כלומר: ‫Gmail,‏ Google Drive, יומן Google,‏ Docs, מפות Google,‏ Analytics,‏ YouTube וכו', וגם שירותים מתקדמים אחרים. מידע נוסף על שירותים מובנים ושירותים מתקדמים זמין בסקירה הכללית של ההפניות.