Transformez vos big data en insights grâce à Google Sheets et Slides

Il existe de nombreux outils permettant aux data scientists d'effectuer des analyses de big data, mais, au final, ne vous obligez-vous pas à justifier ces résultats à vos côtés ? De nombreux chiffres sur papier ou dans une base de données sont difficiles à présenter aux principales personnes concernées. Cet atelier de programmation intermédiaire de Google Apps Script exploite les deux plates-formes pour les développeurs de Google, G Suite et Google Cloud Platform (GCP), pour vous aider à finir ce dernier.

Les outils pour les développeurs Google Cloud vous permettent d'effectuer une analyse approfondie des données, de les présenter dans une feuille de calcul et de générer une présentation à partir de ces données, pour une étape plus adaptée à la gestion. Cet atelier de programmation porte sur l'API BigQuery de GCP (en tant que service avancé d'Apps Script) et les services Apps Script intégrés de Google Sheets et Google Slides.

Art motivant/antérieur

L'application exemple utilisée dans cet atelier de programmation s'inspire de ces autres exemples de code...

L'exemple d'application de l'atelier de programmation sur l'API Slides comprend aussi BigQuery et Slides. Toutefois, l'application de cet atelier de programmation diffère de l'exemple d'application suivant de l'atelier de programmation:

  • Différences entre l'application Node.js et notre application Apps Script
  • Utilise les API REST pendant que nous utilisons les services Apps Script
  • Utilise Google Drive, mais pas Google Sheets, tandis que cette application utilise Sheets, mais pas Drive

Dans cet atelier de programmation, nous souhaitions regrouper autant de technologies que possible dans une seule application tout en présentant les fonctionnalités et les API de Google Cloud d'une manière qui ressemble mieux à un cas d'utilisation réel. Votre objectif est de vous inspirer pour laisser libre cours à votre imagination et s'appuyer sur GCP et AMP pour résoudre des problèmes complexes pour votre entreprise ou vos clients.

Points abordés

  • Utiliser Google Apps Script avec différents services Google (GCP et G Suite)
  • Utiliser Google BigQuery pour effectuer une analyse big data
  • Créer une feuille de calcul Google Sheets et y insérer des données
  • Créer un graphique dans Sheets
  • Transférer des graphiques et des données Sheets vers une présentation Google Slides

Ce dont vous avez besoin

  • Accès à Internet et à un navigateur Web
  • Un compte Google (l'approbation de l'administrateur peut être nécessaire pour les comptes G Suite)
  • Compétences JavaScript de base
  • Il peut être utile de connaître le développement d'Apps Script, mais ce n'est pas obligatoire.

Comment allez-vous utiliser cet atelier de programmation/ce tutoriel ?

Je vais le lire à titre d'information et éventuellement le transmettre à des collègues techniques Parcourez-le le plus souvent possible et essayez autant d'exercices que possible Voyez l'enfer ou l'eau potable pendant tout l'atelier de programmation

Comment évalueriez-vous votre expérience avec les API et les outils pour les développeurs G Suite ?

Débutant Intermédiaire Expert

Comment évalueriez-vous votre expérience avec Apps Script ?

Débutant Intermédiaire Expert

Comment évalueriez-vous votre expérience avec les API et les outils pour les développeurs GCP ?

Débutant Intermédiaire Compétent

Maintenant que vous connaissez le sujet de cet atelier de programmation, que comptez-vous faire ?

  1. Utiliser un exemple Apps Script existant de BigQuery et le faire fonctionner
  2. Dans cet exemple, apprenez à envoyer une requête à BigQuery et à obtenir ses résultats.
  3. Créer une feuille de calcul Google Sheets et y insérer les résultats de BigQuery
  4. Modifiez légèrement le code afin de modifier légèrement les données renvoyées et ajoutées à la feuille
  5. Utiliser le service Sheets dans Apps Script pour créer un graphique pour les données de BigQuery
  6. Utiliser le service Slides pour créer une présentation
  7. Ajouter un titre et un sous-titre à la diapositive de titre par défaut créée automatiquement pour toutes les nouvelles présentations
  8. Créer une diapositive avec un tableau de données, puis y importer les cellules de données de la feuille
  9. Ajoutez une autre diapositive et insérez le graphique de la feuille de calcul.

Voici quelques informations générales concernant Apps Script, BigQuery, Sheets et Slides.

Google Apps Script et BigQuery

Google Apps Script est une plate-forme de développement qui fait partie d'un niveau supérieur à l'utilisation des API REST de Google. Elle offre un environnement de développement et d'hébergement d'applications sans serveur accessible à des développeurs présentant différents niveaux de compétence. En bref, Apps Script est un environnement d'exécution JavaScript sans serveur, conçu pour l'automatisation, l'extension et l'intégration de G Suite.

Google Apps Script est une plate-forme JavaScript côté serveur semblable à Node.js. Cependant, elle repose sur l'intégration étroite à G Suite et à d'autres services Google, plutôt que sur l'hébergement rapide d'applications basées sur des événements asynchrones. Elle propose aussi un environnement de développement qui peut être très différent de ceux que vous connaissez. Avec Apps Script, vous pouvez :

  • développer dans un éditeur de code basé sur un navigateur, ou bien localement à l'aide de clasp, l'outil de déploiement de ligne de commande pour Apps Script ;
  • coder dans une version spécialisée de JavaScript, personnalisée pour accéder à G Suite, ainsi qu'à d'autres services fournis par Google ou des tiers (via les services Apps Script URLfetch ou Jdbc) ;
  • Vous ne pouvez pas écrire de code d'autorisation, car Apps Script s'en charge pour vous
  • vous décharger de l'hébergement de votre application, celle-ci résidant et s'exécutant sur des serveurs Google dans le cloud.

REMARQUE: Dans la plupart des cas, cet atelier vous apprend à utiliser Apps Script. Vous disposez d'une multitude de ressources en ligne pour vous familiariser avec ce langage de programmation. La documentation officielle comprend également une présentation incluant des guides de démarrage rapide, des tutoriels et des vidéos. Enfin, n'oubliez pas l'atelier de programmation Apps Script, qui doit être terminé avant celui-ci.

Pour communiquer avec d'autres technologies Google, Apps Script propose deux méthodes :

  • service natif/intégré
  • Le service avancé

Le service intégré fournit des méthodes générales permettant d'accéder aux données produit de G Suite ou de Google, ou à d'autres méthodes utiles. Un service avancé est simplement un wrapper léger autour d'une API G Suite ou Google REST. Les services avancés fournissent une couverture complète des API REST et offrent souvent plus de possibilités que les services intégrés. Ils requièrent cependant un codage plus complexe (tout en étant plus faciles à utiliser que l'API REST elle-même). Vous devez également activer les services avancés pour un projet de script avant de les utiliser.

Dans la mesure du possible, les développeurs préfèrent un service intégré, car ils sont plus faciles à utiliser et plus lourds que les services avancés. Cependant, certaines API Google n'ont pas de services intégrés. Un service avancé peut donc être la seule option disponible. C'est le cas de Google BigQuery : aucun service intégré n'est disponible, mais un service avancé BigQuery existe. (Ce qui est toujours mieux que pas de service du tout.) Si vous êtes un nouvel utilisateur de BigQuery, ce service GCP vous permet d'exécuter des requêtes simples (ou complexes) sur des corpus de données très volumineux, par exemple sur l'ordre de plusieurs téraoctets, mais vous pouvez obtenir des résultats en quelques secondes.

Accéder à Google Sheets et Slides depuis Apps Script

Contrairement à BigQuery, Google Sheets et Slides intègrent des services intégrés ainsi que des services avancés que vous n'utilisez que pour accéder à des fonctionnalités disponibles uniquement dans l'API. Consultez les documents des services Sheets et Slides intégrés avant de vous plonger dans le code. Bien entendu, les documents pour les services avancés comprennent également des documents concernant Sheets et Slides, respectivement.

Introduction

Nous allons faire une petite partie de cet atelier de programmation avec cette première tâche. Une fois que vous aurez terminé cet atelier de programmation, vous aurez terminé à mi-chemin. Composé de plusieurs sous-sections, vous allez effectuer les opérations suivantes:

  • Démarrer un nouveau projet Google Apps Script
  • Activer l'accès au service avancé BigQuery
  • Accéder à l'éditeur de développement et saisir le code source de l'application
  • Réaliser l'ensemble du processus d'autorisation d'application (OAuth2)
  • Exécuter l'application qui envoie une requête à BigQuery
  • Afficher une nouvelle feuille de calcul Google Sheets créée à partir des résultats de BigQuery

Prérequis

  1. a) Créez un projet Apps Script en accédant à script.google.com. Il existe différentes lignes de produits G Suite. La procédure de création d'un projet peut varier en fonction de la version que vous utilisez. Si vous venez d'utiliser votre compte Gmail et que vous débutez le développement de projets, vous verrez un écran vide et un bouton permettant de créer votre premier projet :


b) Sinon, tous vos projets peuvent être affichés, avec un gros bouton + Nouveau en haut à gauche.



c) Dans les deux cas, l'écran ci-dessous peut ressembler à ce qui suit. Si c'est le cas, recherchez l'icône de menu hamburger en haut à gauche, puis sélectionnez +Nouveau script.



d) Pour ceux d'entre vous qui préfèrent la ligne de commande. Votre outil est clasp (plus précisément, vous exécuterez la commande clasp create).

e) Pour créer un projet de script, vous pouvez simplement accéder au lien "raccourci" : https://script.google.com/create.

  1. Quelle que soit la technique utilisée pour démarrer un nouveau projet, vous devriez être redirigé vers l'éditeur de code Apps Script pour obtenir un résultat semblable à celui-ci:


  2. Cliquez sur File > Save (Fichier et enregistrer) et attribuez un nom à votre projet.
  3. Vous devrez ensuite créer un projet Google Cloud Console afin d'exécuter des requêtes BigQuery.
  1. Créez un projet, attribuez-lui un nom, sélectionnez un compte de facturation, puis cliquez sur CRÉER.
  1. Une notification s'affiche dans l'angle supérieur droit de la page une fois le projet créé. Cliquez sur l'entrée Create Project: <Project Name> pour créer le projet.
  2. Cliquez sur l'icône de menu en haut à gauche, puis accédez à API et AMP & Services > Identifiants. Cliquez sur l'onglet Écran de consentement OAuth (lien direct).
  3. Dans le champ Application name (Nom de l'application), saisissez "Big Data Codelab&quot, puis cliquez sur le bouton Save (Enregistrer) au bas de la page.
  4. Cliquez sur l'icône à trois points en haut à droite pour développer le menu et sélectionnez Paramètres du projet(lien direct).
  5. Copiez la valeur indiquée sous Numéro du projet. Notez qu'il existe un champ distinct ID du produit que nous utiliserons plus tard dans l'atelier de programmation.
  6. De retour dans l'éditeur App Script, cliquez sur Resources > Cloud Platform project (Ressources & projet Cloud Platform).
  7. Saisissez le numéro de projet dans la zone de texte, puis cliquez sur Set Project (Définir un projet). Lorsque vous y êtes invité, cliquez sur Confirmer.
  8. Lorsque vous avez terminé, cliquez sur le bouton Fermer pour fermer la boîte de dialogue.
  9. Maintenant que la configuration du projet est terminée, vous devez activer le service avancé BigQuery. Par conséquent, cliquez sur Ressources -> Advanced Google Services (Ressources - Services avancés) et activez le service dans l'API BigQuery.


  10. Remarque : Ces services doivent également être activés dans le tableau de bord de l'API Google Cloud Platform. Cliquez dessus pour ouvrir un autre onglet de la console de développement ou du console de développement.
  11. Dans la console de développement, cliquez sur le bouton +Enable APIs and Services (Activer les API et les services) en haut de la page, recherchez &bigqueryt;bigquery, sélectionnez l'API BigQuery (pas l'API BigQuery Data Transfer), puis cliquez sur enable (Activer) pour l'activer. Laissez cet onglet ouvert.

    REMARQUE : Après l'activation de l'API, vous verrez peut-être apparaître sur cette page un message semblable à "Pour utiliser cette API", vous devez créer des identifiants, mais vous n'avez pas à vous en soucier pour l'instant. Apps Script s'occupe de cette étape.


  12. Retournez dans l'onglet de l'éditeur de code. Vous êtes toujours dans le menu "Advanced Google Services" (Services avancés Google). Cliquez sur OK pour fermer la boîte de dialogue et quitter l'éditeur de code. Cliquez sur le nom du projet en haut de la page et donnez-lui le nom de votre choix, "demo de démonstration" ou un nom similaire, comme nous avons nommé le nôtre &fin.

Vous êtes maintenant prêt à saisir le code d'application, à suivre la procédure d'autorisation et à découvrir le premier résultat concret de cette application.

Importer l'application et l'exécuter

  1. Copiez le code figurant dans la zone ci-dessous et collez-le dans l'éditeur de code avec celui-ci:
// 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());
}


Enregistrez maintenant le fichier que vous venez de créer, mais remplacez-le Code.gs par bq-sheets-slides.js. À quoi sert ce code ? Nous vous avons déjà indiqué qu'il interroge BigQuery et écrit les résultats dans une nouvelle feuille Google Sheets, mais qu'est-ce que c'est ? Vous pouvez le voir en haut de 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


Cette requête analyse les œuvres de Shakespeare, qui font partie de l'ensemble de données public de BigQuery, et génère les 10 mots les plus fréquents dans l'ensemble de ses œuvres, triés par ordre décroissant. Il suffit d'imaginer à quel point une telle recherche serait fastidieuse si on devait l'effectuer manuellement pour se faire une idée de l'utilité de BigQuery.

  1. Nous sommes presque prêts à faire un essai. Comme vous pouvez le voir en haut de cet extrait de code, vous devez fournir un ID de projet valide. Nous devons donc ajouter le vôtre au code de l'application. Pour obtenir ce résultat, revenez à la fenêtre ou à l'onglet du navigateur où se trouve la page de la console pour les développeurs. (Nous vous avons conseillé de ne pas changer de place. Vous vous souvenez ?)
  2. En haut à gauche de l'avatar de votre compte Google, le sélecteur de menu déroulant () s'affiche. Cliquez dessus et sélectionnez Paramètres du projet. Le nom, l'ID et le numéro du projet s'affichent. Copiez l'ID du projet et définissez la variable PROJECT_ID en haut de bq-sheets-slides.js sur la valeur obtenue dans la console de développement. REMARQUE: Si le sélecteur de menu persiste et ne fonctionne pas, actualisez la page.
  3. L'instruction if permet d'empêcher l'application de continuer sans un ID de projet. Une fois que vous avez ajouté le vôtre, enregistrez le fichier et exécutez votre code en accédant à la barre de menu, en sélectionnant Run > Run function > runQuery, puis cliquez sur Review permissions (Examiner les autorisations). Cette application n'est pas validée. Vous trouverez ci-dessous un GIF animé (pour une autre application) illustrant les étapes suivantes:
  4. Une fois que vous avez demandé l'examen des autorisations, une nouvelle boîte de dialogue s'affiche, comme illustré ci-dessus. Choisissez le compte Google approprié qui exécutera le script, sélectionnez Advanced (Paramètres avancés), faites défiler la page vers le bas, puis cliquez sur <YOUR PROJECT NAME> (unsafe) pour accéder à l'écran d'autorisation de l'application OAuth2. Pour en savoir plus sur la raison pour laquelle cet écran apparaît entre vous et la boîte de dialogue d'autorisation OAuth2 ci-dessous, lisez la procédure de validation.


    REMARQUE : Une fois que vous avez autorisé l'application, vous n'avez plus besoin de répéter cette procédure pour chaque exécution. Avant d'accéder à la tâche 3 de ce tutoriel, cette fenêtre de dialogue s'affiche à nouveau, et vous devez demander à l'utilisateur l'autorisation de créer et de gérer des présentations Google Slides.
  5. Lorsque vous cliquez sur Allow (Autoriser) dans la boîte de dialogue OAuth2, le script commence à s'exécuter... et une boîte de dialogue jaune pastel s'affiche en haut. Elle s'exécute assez rapidement, vous ne remarquerez donc peut-être pas qu'elle est en cours d'exécution ou qu'elle est terminée.

  6. Cette boîte de dialogue disparaît une fois celle-ci terminée. Si vous ne la voyez pas, elle est probablement terminée. Vous devez donc accéder à Google Drive (drive.google.com) pour rechercher une nouvelle feuille de calcul Google Sheets nommée "Les plus courants dans tous les travaux de Shakespeare" ou tout ce que vous avez attribué à la variable QUERY_NAME:


  7. Ouvrez la feuille de calcul. Vous devriez voir 10 lignes de mots et le nombre total de mots, triés par ordre décroissant.

Résumé de la tâche 1

Reconnaissez ce qui s'est passé... vous avez exécuté un code qui a interrogé toutesles œuvres de Shakespeare's (il ne s'agit pas d'une GRANDE quantité de données, mais certainement plus de texte que vous pouvez facilement scanner vous-même les mots en les classant par ordre décroissant d'apparence). Vous avez non seulement demandé à BigQuery de le faire en votre nom, mais vous avez également pu utiliser le service intégré dans Apps Script pour Google Sheets pour y stocker ces données afin de les utiliser facilement.

Le code de bq-sheets-slides.js (le nom de fichier que nous avons choisi) que vous avez collé ci-dessus (à l'exception de PROJECT_ID, qui doit avoir un ID réel de projet) se trouve également dans le dossier step1 de cet atelier de programmation GitHub, à l'adresse github.com/googlecodelabs/bigquery-sheets-slides. Le code s'est inspiré de l'exemple original de la page des services avancés BigQuery, qui exécutait une requête légèrement différente... quels sont les mots les plus populaires utilisés par Shakespeare, avec un minimum de 10 caractères. Vous pouvez également voir cet exemple dans son dépôt GitHub.

Si vous souhaitez essayer d'autres requêtes contre les œuvres de Shakespeare ou d'autres tableaux de données publics, consultez cette page Web et celle-ci. Quelle que soit la requête utilisée, vous pouvez toujours la tester dans la console BigQuery avant de l'exécuter dans Apps Script. L'interface utilisateur de BigQuery est accessible aux développeurs sur le site bigquery.cloud.google.com. Par exemple, voici à quoi ressemble notre requête à l'aide de l'interface utilisateur BigQuery:

Bien que la procédure ci-dessus s'appuie sur l'éditeur de code Apps Script, vous pouvez également choisir de développer votre application en local via la ligne de commande. Si vous préférez, créez un script nommé bq-sheets-slides.js, collez-y le code ci-dessus, puis importez-le dans Google à l'aide de la commande clasp push. Si vous l'avez manqué plus tard, voici à nouveau le lien vers clasp et son utilisation.

L'objectif de runQuery() est de communiquer avec BigQuery et d'envoyer ses résultats dans une feuille Sheets. Nous devons maintenant créer un graphique avec les données. Pour cela, créons une fonction appelée createColumnChart() qui appelle la méthode newChart() de Sheets.

  1. Créer un graphique Ajoutez le corps de createColumnChart() présenté ci-dessous à bq-sheets-slides.js juste après runQuery(). La feuille récupère les données et un graphique à colonnes contenant toutes les données. La plage de données commence à la cellule A2, car la première ligne contient les en-têtes de colonne, et non les données.
/**
 * 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. Feuille de calcul de retour Au-dessus, createColumnChart() a besoin de l'objet feuille de calcul. Nous devons donc mettre à jour runQuery() pour renvoyer spreadsheetobjet afin de le transmettre à createColumnChart(). Après avoir enregistré la feuille de calcul Google Sheets réussie, renvoyez l'objet spreadsheet à la fin de runQuery(), juste après la ligne de journal:
  Logger.log('Results spreadsheet created: %s', spreadsheet.getUrl());

  // NEW: Return the spreadsheet object for later use.
  return spreadsheet;
}
  1. Fonction createBigQueryPresentation() d'action Séparer logiquement les fonctionnalités de BigQuery et des graphiques est une bonne idée. Maintenant, créons une fonction createBigQueryPresentation() pour gérer l'application, en appelant à la fois runQuery() et createColumnChart(). Le code que vous ajoutez doit se présenter comme suit:
/**
 * Runs a BigQuery query, adds data and a chart in a Sheet.
 */
function createBigQueryPresentation() {
  var spreadsheet = runQuery();
  createColumnChart(spreadsheet);
}
  1. Optimisez la réutilisation du code. Vous avez effectué les deux étapes importantes ci-dessus: renvoyer l'objet de la feuille de calcul et créer une fonction de conduite. Que se passe-t-il si un collègue souhaite réutiliser runQuery() sans que l'URL soit consignée ? Pour rendre l'ensemble de données runQuery() plus lisible en cas d'utilisation générale, vous devez déplacer cette ligne de journal. Une idée du meilleur emplacement ? Si vous avez trouvé createBigQueryPresentation(), vous avez raison ! Une fois la ligne de journal déplacée, elle devrait ressembler à ceci:
/**
 * 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);
}

Avec ces modifications (à l'exception de PROJECT_ID), votre bq-sheets-slides.js devrait se présenter comme suit (et se trouve également dans le dossier step2 du dépôt 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);
}

Enregistrez le fichier, puis allez en haut de l'éditeur de code pour passer à l'exécution de createBigQueryPresentation() au lieu de runQuery(). Après l'avoir exécutée, vous recevez une autre feuille de calcul Google Sheets, mais cette fois, un graphique s'affiche à côté des données.

La dernière partie de l'atelier de programmation implique de créer une présentation Google Slides, de remplir le titre et le sous-titre de la diapositive de titre, puis d'ajouter deux diapositives : une pour chacune des cellules de données et une autre pour le graphique.

  1. Créez une présentation. Tout le travail sur la présentation aura lieu dans createSlidePresentation(), que nous ajouterons à bq-sheets-slides.js juste après createColumnChart(). Commençons par créer une présentation, puis ajoutez un titre et un sous-titre à la diapositive de titre par défaut utilisée pour toutes les nouvelles présentations.
/**
 * 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. Ajoutez un tableau de données. L'étape suivante dans createSlidePresentation() consiste à importer les données de la cellule de la feuille de calcul Google dans notre nouvelle présentation. Ajoutez cet extrait de code à la fonction:
  // 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. Importer un graphique : La dernière étape dans createSlidePresentation() consiste à créer une diapositive supplémentaire, à importer le graphique à partir de notre feuille de calcul et à renvoyer l'objet Presentation. Ajoutez le dernier extrait à la fonction :
  // 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. Graphique du retour. Maintenant que la fonction finale est terminée, examinons à nouveau sa signature. Oui, createSlidePresentation() nécessite à la fois une feuille de calcul et un objet de graphique. Nous avons déjà ajusté runQuery() pour renvoyer l'objet Spreadsheet, mais nous devons maintenant apporter une modification similaire à createColumnChart() pour renvoyer l'objet graphique (EmbeddedChart). Revenez au code de votre application pour ajouter une dernière ligne à la fin de createColumnChart(), pour effectuer cette opération:
  // NEW: Return chart object for later use
  return chart;
}
  1. Mettez à jour createBigQueryPresentation(). Étant donné que createColumnChart() renvoie le graphique, nous devons l'enregistrer dans une variable, puis transmettre à la fois la feuille de calcul et le graphique à createSlidePresentation(). Étant donné que nous consignons l'URL de la nouvelle feuille de calcul, nous allons également consigner l'URL de la nouvelle présentation. Mettez à jour votre createBigQueryPresentation() pour qu'il ressemble à ceci:
/**
 * 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. Enregistrez et exécutez createBigQueryPresentation() à nouveau. Toutefois, pour que votre application puisse afficher et gérer vos présentations Google Slides, vous devez d'abord lui demander un autre ensemble d'autorisations. Une fois cette autorisation accordée, elle s'exécutera comme précédemment.
  2. En plus de cette feuille de calcul Google Sheets créée, vous devez obtenir une nouvelle présentation avec trois diapositives (titre, tableau de données, graphique de données), comme illustré ci-dessous:

Félicitations ! Vous venez de créer une application qui exploite les deux côtés de Google Cloud en effectuant une requête Google BigQuery qui interroge l'un de ses ensembles de données publics, puis de créer une feuille de calcul Google Sheets pour stocker les résultats, d'ajouter un graphique sur la base des données extraites, puis de créer une présentation Google Slides contenant les résultats et un graphique dans la feuille de calcul.

Voilà pour le côté technique. Mais plus largement, vous avez transformé une analyse big data en résultats que vous pouvez présenter à des parties prenantes, tout cela grâce à du code et de façon entièrement automatisée. Nous espérons qu'il vous incitera à suivre ces pistes et à le personnaliser pour vos propres projets. À la fin de cet atelier de programmation, nous vous fournirons quelques suggestions pour améliorer davantage cet exemple d'application.

Avec les modifications ci-dessus effectuées dans la tâche finale (à l'exception de PROJECT_ID), votre bq-sheets-slides.js devrait se présenter comme suit (et se trouve également dans le dossier final du dépôt 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());
}

Aucun rôle n'est utilisé dans cet atelier de programmation. Il s'agit du fichier manifeste Apps Script, appsscript.json. Pour y accéder, cliquez sur l'onglet de navigateur de l'éditeur de code, puis sur Afficher le fichier manifeste ; Afficher le fichier manifeste dans le menu situé en haut. Le contenu doit ressembler à ceci :

appsscript.json

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

Le fichier manifeste est un fichier de configuration au niveau du système permettant à Apps Script de connaître l'environnement d'exécution disponible pour votre application. Cet atelier de programmation ne porte pas sur le contenu d'un fichier manifeste, mais nous vous en donnons une idée.

Vous trouverez ci-dessous d'autres ressources qui vous permettront d'approfondir les aspects abordés dans cet atelier de programmation et de découvrir d'autres moyens d'accéder aux outils de développement Google de manière automatisée. Notre objectif est de synchroniser cet atelier de programmation avec le dépôt.

Ressources pour cette application

Documentation

Autres ateliers de programmation

Introduction

Intermédiaire

Applis de référence

Vous trouverez ci-dessous différents problèmes de code, ainsi que différentes manières d'améliorer ou d'enrichir l'exemple que nous avons créé dans cet atelier de programmation. Cette liste n'est pas exhaustive, mais elle devrait vous donner quelques idées inspirantes pour passer à l'étape suivante.

  • Application. Vous ne souhaitez pas être limité par JavaScript ou les restrictions imposées par Apps Script ? Transférez cette application vers le langage de programmation de votre choix qui utilise les API REST pour Google BigQuery, Sheets et Slides.
  • BigQuery. Essayez une autre requête pour l'ensemble de données Shakespeare : vous trouverez peut-être une requête qui vous intéresse. Vous trouverez un autre exemple de requête dans l'exemple d'application BigQuery Apps Script.
  • BigQuery. Testez d'autres ensembles de données publics BigQuery. Peut-être trouvez-vous un ensemble de données plus pertinent pour vous.
  • BigQuery. Précédemment, nous avons mentionné d'autres requêtes que vous pouvez essayer sur les œuvres de Shakespeare ou d'autres tables de données publiques, et nous souhaitions partager à nouveau cette page Web et cette page.
  • Sheets. Testez d'autres types de graphiques.
  • Sheets et BigQuery. Inversez les tableaux. Peut-être souhaitez-vous conserver un ensemble de données volumineux dans une feuille de calcul. En 2016, l'équipe BigQuery a lancé une fonctionnalité permettant aux développeurs d'utiliser une feuille de calcul comme source de données (voir l'article du blog 1 et 2 pour en savoir plus).
  • Slides : Ajoutez d'autres diapositives à la présentation générée, comme des images ou d'autres éléments associés à votre analyse de big data. Voici un guide sur le service intégré Slides qui vous aidera à vous lancer.
  • G Suite : Rechercher l'utilisation d'autres services G Suite ou intégrés à Google Apps Script, comme Gmail, Google Drive, Agenda, Docs, Maps, Analytics, YouTube, etc., ainsi que d'autres services avancés. Pour plus d'informations, consultez la présentation des références pour les services intégrés et avancés.