Trasforma i tuoi big data in insight utilizzando Fogli e Presentazioni Google

Esistono molti strumenti in cui i data scientist possono eseguire analisi dei big data, ma alla fine non è ancora necessario giustificare tali risultati alla gestione? Molti numeri su carta o in database non sono difficili da presentare alle principali parti interessate. Questo codelab su Google Apps Script intermedio sfrutta una coppia di piattaforme per sviluppatori di Google, G Suite e Google Cloud Platform (GCP), per aiutarti a portare a termine l'ultimo miglio.

Gli strumenti per sviluppatori di Google Cloud ti permettono di eseguire l'analisi approfondita dei dati, di esaminarli e inserirli in un foglio di lavoro, nonché di generare una presentazione con questi dati, per offrire una fase più adatta alla gestione dei risultati. Questo codelab copre l'API BigQuery di GCP (come servizio avanzato di Apps Script) e i servizi Apps Script integrati per Fogli Google e Presentazioni Google.

Motivazione/arte precedente

L'app di esempio in questo codelab è stata ispirata da questi altri esempi di codice...

Anche se l'app di esempio del codelab dell'API Presentazioni include BigQuery e Presentazioni, è diversa dall'app di esempio del codelab in diversi modi:

  • Confronto tra l'app Node.js e la nostra app Apps Script
  • Vengono usate le API REST mentre utilizziamo i servizi di Apps Script
  • Utilizza Google Drive ma non Fogli Google, mentre questa app utilizza Fogli ma non Drive

Per questo codelab, volevamo riunire quante più tecnologie disponibili in una singola app, presentando funzionalità e API di Google Cloud in modo da assomigliare di più a un caso d'uso reale. L'obiettivo è incoraggiarti a utilizzare la tua immaginazione e valutare la possibilità di utilizzare sia GCP che G Suuite per risolvere problemi complessi per la tua organizzazione o i tuoi clienti.

Obiettivi didattici

  • Come utilizzare Google Apps Script con più servizi Google (GCP e G Suite)
  • Utilizzare Google BigQuery per eseguire l'analisi dei big data
  • Come creare un foglio Google e inserirvi dati
  • Come creare un nuovo grafico in Fogli
  • Come trasferire grafici e dati da Fogli a una presentazione Google

Che cosa ti serve

  • Accesso a Internet e a un browser web
  • Un Account Google (gli account G Suite potrebbero richiedere l'approvazione dell'amministratore)
  • Competenze di base su JavaScript
  • Conoscere lo sviluppo di Apps Script può essere utile, ma non obbligatorio

Come utilizzerai questo codelab/tutorial?

Leggilo a scopo informativo, magari passandolo ai tuoi colleghi tecnici Esamina il più possibile i dettagli e prova il maggior numero possibile di esercizi Vieni all'inferno o sott'acqua, completerò l'intero codelab

Come giudichi la tua esperienza con gli strumenti per sviluppatori e le API di G Suite?

Principiante Intermedio Esperto

Come valuteresti nello specifico la tua esperienza con Apps Script?

Principiante Intermedio Esperto

Come giudichi la tua esperienza con gli strumenti per sviluppatori e le API di GCP?

Principiante Intermedio Esperto

Ora che conosci l'argomento di questo codelab, che cosa farai esattamente?

  1. Esegui un esempio di Apps Script-BigQuery esistente e fallo funzionare
  2. Da questo esempio, scopri come inviare una query a BigQuery e visualizzarne i risultati
  3. Crea un foglio Google e completa i risultati in BigQuery
  4. Modifica leggermente il codice per modificare leggermente i dati restituiti e aggiunti al foglio
  5. Usa il servizio Fogli in Apps Script per creare un grafico per i dati di BigQuery
  6. Utilizzare il servizio Presentazioni per creare una nuova presentazione
  7. Aggiungere un titolo e un sottotitolo alla diapositiva predefinita, creata automaticamente per tutte le nuove presentazioni Google
  8. Crea una nuova diapositiva con una tabella di dati e poi importa le celle di dati di Fogli
  9. Aggiungi un'altra nuova diapositiva e inserisci il grafico del foglio di lavoro

Iniziamo con alcune informazioni di base su Apps Script, BigQuery, Fogli e Presentazioni.

Google Apps Script e BigQuery

Google Apps Script è una piattaforma di sviluppo di G Suite che opera come livello superiore rispetto all'utilizzo delle API REST di Google. Si tratta di un ambiente di hosting delle applicazioni e di sviluppo serverless accessibile a sviluppatori con livelli di abilità molto diversi. Per riassumere, "Apps Script è un runtime JavaScript serverless per l'automazione, l'estensione e l'integrazione di G Suite".

È JavaScript lato server, simile a Node.js, ma è dedicato alla stretta integrazione con G Suite e altri servizi Google invece che all'hosting di applicazioni rapido e asincrono basato su eventi. Apps Script comprende anche un ambiente di sviluppo che potrebbe essere completamente diverso da quello che usi di solito. Con Apps Script, puoi:

  • Si sviluppa in un editor di codice basato su browser, ma può scegliere di sviluppare localmente se si utilizza clasp, lo strumento di deployment a riga di comando per Apps Script
  • Codice in una versione specializzata di JavaScript personalizzata per accedere a G Suite e ad altri servizi Google o esterni (tramite i servizi Apps Script URLfetch o Jdbc)
  • Può evitare di scrivere codice di autorizzazione perché è gestito da Apps Script
  • Fare a meno di trovare una soluzione per l'hosting della tua app, che risiede e viene eseguita nei server Google sul cloud

NOTA: per la maggior parte dell'ambito di questo codelab, non puoi illustrare lo script di Apps Script. A tale scopo, hai a disposizione numerose risorse online. La documentazione ufficiale offre inoltre una panoramica con guide rapide, tutorial e video. Infine, non dimenticare il codelab introduttivo su Apps Script, che devi completare prima di iniziare questo.

Apps Script si interfaccia con altre tecnologie Google in due modi diversi:

  • servizio integrato/nativo
  • servizio avanzato

Un servizio integrato offre metodi di alto livello che puoi utilizzare per accedere ai dati di prodotto di G Suite o di Google o ad altri metodi di utilità utili. Un servizio avanzato è semplicemente un wrapper sottile intorno a un'API G Suite o REST di Google. I servizi avanzati offrono la copertura completa dell'API REST e spesso hanno funzionalità più avanzate dei servizi integrati, ma necessitano di codice più complesso (pur rimanendo più facili da utilizzare rispetto all'API REST stessa). Prima di essere utilizzati, i servizi avanzati devono anche essere abilitati per un progetto di script.

Quando possibile, gli sviluppatori preferiscono un servizio integrato perché sono più facili da utilizzare e offrono un lavoro più impegnativo rispetto ai servizi avanzati. Tuttavia, alcune API di Google non dispongono di servizi integrati, pertanto un servizio avanzato potrebbe essere l'unica opzione. Google BigQuery è un esempio di questo servizio... non è disponibile alcun servizio integrato, ma un servizio avanzato BigQuery esiste esiste. È comunque meglio di niente! Se non hai mai utilizzato BigQuery, è un servizio GCP che ti consente di eseguire query semplici (o complesse) su corpus di dati molto grandi, ad esempio seguendo l'ordine di più terabyte. Può comunque fornire risultati in pochi secondi.

Accedi a Fogli e Presentazioni Google da Apps Script

A differenza di BigQuery, sia Fogli sia Presentazioni Google dispongono di servizi integrati (oltre a servizi avanzati, che puoi utilizzare solo per accedere alle funzionalità disponibili solo nell'API). Consulta la documentazione relativa ai servizi Fogli e Presentazioni integrati prima di iniziare a utilizzare il codice. Naturalmente, esistono anche i documenti per i servizi avanzati, qui rispettivamente per Fogli e Presentazioni.

Introduzione

Con questa prima attività usciremo da questo codelab. Di fatto, una volta finito qui, arriverai a metà strada con l'intero codelab. Suddividere in diverse sottosezioni, svolgerai tutte le seguenti operazioni:

  • Iniziare un nuovo progetto Google Apps Script
  • Abilitare l'accesso al servizio avanzato di BigQuery
  • Andare all'editor di sviluppo e inserire il codice sorgente dell'applicazione
  • Eseguire il processo di autorizzazione dell'app (OAuth2)
  • Eseguire l'applicazione che invia una richiesta a BigQuery
  • Visualizzare un nuovo foglio Google creato a partire dai risultati di BigQuery

Configura

  1. a) Per creare un nuovo progetto Apps Script, vai a script.google.com. Esistono diverse linee di prodotto G Suite e il modo in cui crei un nuovo progetto può variare a seconda della versione che utilizzi. Se stai usando il tuo account Gmail e non hai esperienza nello sviluppo di progetti, vedrai una schermata vuota con un pulsante per creare il tuo primo progetto:


b) Se non vedi tutti i tuoi progetti e un grande pulsante +Nuovo in alto a sinistra, fai clic sul pulsante.



c) Se nessuna delle opzioni precedenti è indicata sopra, lo schermo potrebbe avere il seguente aspetto. Se è così, cerca l'icona del menu hamburger nell'angolo in alto a sinistra e seleziona +Nuovo script.



d) Per quelli che preferiscono la riga di comando. Il tuo strumento è clasp, in particolare, eseguirai il comando clasp create.

e) L'ultimo modo per creare un nuovo progetto di script è accedere al link della scorciatoia: https://script.google.com/create.

  1. Indipendentemente dalla tecnica utilizzata per avviare un nuovo progetto, la punto fondamentale è che devi essere inserito nell'editor di codice di Apps Script, in una schermata simile alla seguente:


  2. Fai clic su File > Save (Salva) e assegna un nome al progetto.
  3. Successivamente, dovrai creare un progetto Google Cloud Console per eseguire le query BigQuery.
  1. Crea un nuovo progetto, assegnagli un nome, seleziona un account di fatturazione e fai clic su CREA.
  1. Una volta completata la creazione del progetto, viene visualizzata una notifica in alto a destra nella pagina. Fai clic sulla voce Create Project: <Project Name> per aprirla.
  2. Fai clic sull'icona del menu in alto a sinistra e vai ad API e servizi Credenziali. Fai clic sulla scheda Schermata consenso OAuth (link diretto).
  3. Nel campo Nome applicazione, inserisci " Big Data Codelab" e fai clic sul pulsante Salva in fondo.
  4. Fai clic sull'icona con tre puntiniin alto a destra per espandere il menu e seleziona Impostazioni progetto (link diretto).
  5. Copia il valore indicato in Numero progetto. È presente un campo Product ID separato che utilizzeremo più avanti nel codelab.
  6. Torna all'editor dell'app e fai clic su Risorse > progetto Cloud Platform.
  7. Inserisci il numero del progetto nella casella di testo e fai clic su Set Project (Imposta progetto). Quando richiesto, fai clic su Conferma.
  8. Al termine, fai clic sul pulsante Chiudi per ignorare la finestra di dialogo.
  9. Ora che hai configurato un nuovo progetto, devi abilitare il servizio avanzato BigQuery, quindi trascina verso il basso le risorse -> Servizi Google avanzati e attiva bit per l'API BigQuery.


  10. Una nota in basso: "Questi servizi devono essere attivati anche nella dashboard dell'API di Google Cloud Platform", quindi fai clic sul link che apre un'altra scheda del browser o, in breve, "dev console".
  11. In devconsole, fai clic sul pulsante +Abilita API e servizi in alto, cerca "quot;bigquery", seleziona l'API BigQuery (non l'API BigQuery Data Transfer) e fai clic su attiva per attivarla. Lascia aperta questa scheda del browser.

    NOTA: dopo aver attivato l'API, in questa pagina potresti visualizzare una nota simile a "Come utilizzare questa API, devi creare le credenziali...".
  12. Tornando alla scheda del browser dell'editor di codice, rimarrai nel menu Servizi Google avanzati, quindi fai clic su OK per chiudere la finestra di dialogo, lasciando l'editor di codice attivo. Fai clic sul nome del progetto in alto e nominalo come preferisci, "BigQuery demo" o simile. Abbiamo chiamato "nome finale".

A questo punto puoi inserire il codice dell'applicazione. Completa il processo di autorizzazione e inizia a utilizzare la prima versione di questa applicazione.

Caricare ed eseguire l'applicazione

  1. Copia il codice nel riquadro di seguito e incollalo insieme a tutti gli elementi nell'editor di codice:
// 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());
}


Ora salva il file appena creato, ma rinominalo da Code.gs a bq-sheets-slides.js. Che cosa fa questo codice? Ti abbiamo già comunicato che esegue una query in BigQuery e scrive i risultati in un nuovo foglio Google, ma qual è la query? Puoi vederlo nella parte superiore della pagina 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


Questa query analizza le opere di Shakespeare, che fanno parte del set di dati pubblico di BigQuery, e produce le prime 10 parole che compaiono più di frequente in tutte le sue opere, ordinate in ordine decrescente di popolarità. Pensa a che impresa immane sarebbe fare questa ricerca a mano per avere un'idea di quanto sia utile BigQuery.

  1. Ci siamo quasi, ma non siamo ancora pronti per provare. Come puoi vedere nella parte superiore di questo snippet di codice, è necessario un ID progetto valido, quindi dobbiamo aggiungere il tuo al codice dell'applicazione. Per farlo, torna alla finestra del browser o alla scheda che contiene la pagina della console per gli sviluppatori. (Ti abbiamo comunicato di lasciarla aperta, ricordi?)
  2. In alto a sinistra dell'avatar del tuo Account Google è presente il selettore del menu a discesa (). Fai clic e seleziona Impostazioni progetto. Vedrai il nome, l'ID e il numero del progetto. Copia l'ID progetto e imposta la variabile PROJECT_ID nella parte superiore di bq-sheets-slides.js sul valore che hai ottenuto dalla console per gli sviluppatori. NOTA: se il selettore di menu diventa persistente e inutilizzabile, ricarica la pagina.
  3. L'istruzione if serve a evitare che l'applicazione continui con l'assenza dell'ID progetto. Dopo aver aggiunto il file, salvare il file ed eseguire il codice, vai alla barra dei menu e seleziona Esegui > esegui la funzione > runQuery, fai clic sulla finestra di dialogo Rivedi autorizzazioni. Questa app non è verificata e sotto è presente una GIF animata (per un'altra app) che illustra i passaggi successivi:
  4. Una volta richiesta la revisione delle autorizzazioni, verrà visualizzata una nuova finestra di dialogo, come mostrato sopra. Scegli l'Account Google corretto che eseguirà lo script, seleziona Avanzate, scorri verso il basso, quindi fai clic su "Vai a <NOME PROGETTO> (non sicuro)" per arrivare alla schermata di autorizzazione applicazione OAuth2. Scopri di più sul processo di verifica per scoprire perché questa schermata si trova tra te e la finestra di dialogo dell'autorizzazione OAuth2 di seguito.


    NOTA: una volta autorizzata l'app, non è necessario ripetere questa procedura a ogni esecuzione. Non finché non arrivi più all'attività 3 in questo tutorial, in cui visualizzerai di nuovo questa schermata di dialogo, in cui ti verrà chiesta l'autorizzazione dell'utente per creare e gestire presentazioni Google.
  5. Dopo aver fatto clic su Consenti nella finestra di dialogo OAuth2, lo script inizia a essere eseguito... nella parte superiore della pagina verrà visualizzata una finestra di dialogo color pastello. Poiché è abbastanza veloce, potresti non notare che è in esecuzione o che l'esecuzione è completata.

  6. Una volta completata, la finestra di dialogo scompare, quindi se non la vedi, è probabile che sia terminata, quindi vai su Google Drive (drive.google.com) e cerca un nuovo foglio Google denominato "Parole più comuni in tutte le opere di Shakespeare":


  7. Apri il foglio di lavoro. Dovresti vedere 10 righe di parole e i relativi conteggi totali ordinati in ordine decrescente:

Riepilogo attività 1

Riconoscere quello che è appena accaduto... hai eseguito un codice che ha query su tutte le opere di Shakespeare (non una quantità enorme di dati, ma ovviamente più testo di quello che puoi facilmente analizzare da solo guardando ogni parola in ogni riproduzione, gestendo un conteggio di tali parole e poi ordinandole in ordine decrescente di aspetto). Non solo hai chiesto a BigQuery di eseguire questa operazione per tuo conto, ma hai anche potuto utilizzare il servizio integrato in Apps Script per Fogli Google per inserire i dati e semplificare il consumo.

Il codice per bq-sheets-slides.js (il nome file che hai scelto) che hai incollato sopra (a parte PROJECT_ID, che deve avere un ID progetto reale) si trova anche nella cartella step1 in questo repository GitHub di codelab all'indirizzo github.com/googlecodelabs/bigquery-sheets-slides. Il codice è stato ispirato dall'esempio originale nella pagina dei servizi avanzati di BigQuery che ha eseguito una query leggermente diversa... quali sono le parole più popolari utilizzate da Shakespeare con 10 o più caratteri. Puoi anche visualizzare tale esempio nel repository GitHub.

Se ti interessano altre query che puoi provare contro le opere di Shakespeare o altre tabelle di dati pubblici, consulta questa pagina web e questa. Indipendentemente dalla query utilizzata, puoi sempre eseguire il test della query nella console di BigQuery prima di eseguirla in Apps Script. L'interfaccia utente di BigQuery è disponibile per gli sviluppatori all'indirizzo bigquery.cloud.google.com. Ad esempio, questa è la nostra query utilizzando l'interfaccia utente di BigQuery:

Mentre i passaggi precedenti hanno sfruttato l'editor di codice di Apps Script, ma puoi anche scegliere di sviluppare localmente tramite la riga di comando. Se preferisci, crea uno script chiamato bq-sheets-slides.js, incolla il codice riportato sopra al suo interno e caricalo su Google con il comando clasp push. Se non lo hai visto prima, ecco di nuovo il link a clasp e le istruzioni per utilizzarlo.

Lo scopo di runQuery() è parlare con BigQuery e inviare i suoi risultati a un foglio. Ora dobbiamo creare un grafico con i dati. Creiamo una nuova funzione chiamata createColumnChart() che chiami il metodo newChart() di Fogli.

  1. Crea grafico. Aggiungi il corpo di createColumnChart() in primo piano qui sotto a bq-sheets-slides.js subito dopo runQuery(). Recupera il foglio con dati e richiede un grafico a colonne con tutti i dati. L'intervallo di dati inizia nella cella A2 perché la prima riga contiene le intestazioni di colonna, non i dati.
/**
 * 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. Restituisci il foglio di lavoro. Sopra, createColumnChart() ha bisogno dell'oggetto foglio di lavoro, quindi dobbiamo aggiornare runQuery() per restituire l'oggetto spreadsheet in modo che possiamo passarlo a createColumnChart(). Dopo aver registrato la creazione corretta di Fogli Google, restituisci l'oggetto spreadsheet alla fine di runQuery(), subito dopo la riga di log:
  Logger.log('Results spreadsheet created: %s', spreadsheet.getUrl());

  // NEW: Return the spreadsheet object for later use.
  return spreadsheet;
}
  1. Utilizzo della funzione createBigQueryPresentation(). La segmentazione logica delle funzionalità di BigQuery e di creazione dei grafici è un'ottima idea. Ora creiamo una funzione createBigQueryPresentation() per guidare l'app, chiamando sia runQuery() sia createColumnChart(). Il codice che aggiungi dovrebbe essere simile al seguente:
/**
 * Runs a BigQuery query, adds data and a chart in a Sheet.
 */
function createBigQueryPresentation() {
  var spreadsheet = runQuery();
  createColumnChart(spreadsheet);
}
  1. Rendi il codice più riutilizzabile. Hai adottato due passaggi importanti: restituire l'oggetto del foglio di lavoro e creare una funzione di guida. E se un collega volesse riutilizzare runQuery() e non vuole che l'URL venga registrato? Per rendere runQuery()più facilmente fruibile per l'utilizzo generale, è necessario spostare la riga di log. Dove? Se hai indovinato createBigQueryPresentation(), dovresti rispondere correttamente. Dopo lo spostamento della riga del log, il codice dovrebbe avere il seguente aspetto:
/**
 * 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);
}

Con queste modifiche precedenti (di nuovo tranne PROJECT_ID), ora bq-sheets-slides.js dovrebbe essere simile all'esempio seguente (e trovato anche nella cartella step2 del repository 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);
}

Salva il file, quindi vai in alto nell'editor di codice e passa all'opzione createBigQueryPresentation() anziché a runQuery(). Dopo averlo eseguito, riceverai un altro foglio Google, ma questa volta verrà visualizzato un grafico nel foglio accanto ai dati:

La parte finale del codelab prevede la creazione di una nuova presentazione Google, la compilazione del titolo e del sottotitolo nella diapositiva del titolo e la successiva aggiunta di due nuove diapositive, una per ciascuna cella di dati e un'altra per il grafico.

  1. Creare una presentazione. Tutto il lavoro sulla presentazione avrà luogo nel seguente paese: createSlidePresentation(), che aggiungeremo a bq-sheets-slides.js subito dopo il giorno createColumnChart(). Iniziamo con la creazione di una nuova presentazione, poi aggiungiamo un titolo e un sottotitolo alla diapositiva predefinita, quella che riceveremo con tutte le nuove presentazioni.
/**
 * 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. Aggiungi tabella di dati. Il passaggio successivo in createSlidePresentation() consiste nell'importazione dei dati delle celle dal foglio Google alla nuova presentazione. Aggiungi questo snippet di codice alla funzione:
  // 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. Importa grafico. Il passaggio finale in createSlidePresentation() consiste nel creare un'altra diapositiva, importare il grafico dal nostro foglio di lavoro e restituire l'oggetto Presentation. Aggiungi questo snippet finale alla funzione:
  // 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. Grafico relativo ai resi. Ora che la nostra funzione finale è stata completata, dai un'occhiata alla sua firma. Sì, createSlidePresentation() richiede sia un foglio di lavoro che un oggetto del grafico. Abbiamo già modificato runQuery() per restituire l'oggetto Spreadsheet, ma ora dobbiamo apportare una modifica simile a createColumnChart() per restituire l'oggetto grafico (EmbeddedChart). Torna alla tua applicazione per aggiungere il codice e aggiungere un'ultima riga alla fine di createColumnChart() per farlo:
  // NEW: Return chart object for later use
  return chart;
}
  1. Aggiorna createBigQueryPresentation(). Poiché createColumnChart() restituisce il grafico, dobbiamo salvarlo in una variabile e poi passare sia il foglio di lavoro sia il grafico a createSlidePresentation(). Poiché registriamo l'URL del foglio di lavoro appena creato, registriamo anche l'URL della nuova presentazione di diapositive. Aggiorna il tuo createBigQueryPresentation() in modo che sia simile a questo:
/**
 * 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. Salva ed esegui di nuovo createBigQueryPresentation(). Prima di eseguirlo, devi riconoscere che la tua app deve disporre di un altro insieme di autorizzazioni dell'utente per visualizzare e gestire le tue presentazioni Google. Una volta concessa, questa autorizzazione verrà eseguita come prima.
  2. Ora, oltre al foglio creato, dovresti anche presentare una nuova presentazione con tre diapositive (titolo, tabella di dati e grafico), come mostrato di seguito:

Complimenti! Hai creato un'applicazione che sfrutta entrambi i lati di Google Cloud eseguendo una richiesta Google BigQuery che esegue una query su uno dei suoi set di dati pubblici, crea un nuovo foglio Google per archiviare i risultati, aggiunge un grafico basato su tali dati appena recuperati e infine crea una presentazione Google con i risultati e il grafico nel foglio di lavoro.

Tecnicamente hai fatto tutto questo. In termini generali, da un'analisi dei big data hai creato materiale che puoi presentare ai tuoi destinatari, il tutto mediante codice in modo automatizzato. Ci auguriamo che questa anteprima di esempio ti ispiri a prenderla e personalizzarla per i tuoi progetti. Al termine di questo codelab, ti daremo alcuni suggerimenti su come migliorare ulteriormente questa app di esempio.

Con le modifiche precedenti all'attività finale (di nuovo tranne PROJECT_ID), ora il tuo bq-sheets-slides.js dovrebbe essere simile all'esempio seguente (e trovato anche nella cartella final nel repository 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());
}

Nessun ruolo in questo codelab è il "secondo file" di questo codelab, che è il file manifest Apps Script, appsscript.json. Per accedervi, vai alla scheda del browser dell'editor di codice e seleziona Visualizza > Mostra file manifest dal menu in alto. Il contenuto dovrebbe essere simile al seguente:

appscript.json

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

Il file manifest è un file di configurazione a livello di sistema che Apps Script utilizza per sapere quale ambiente di esecuzione è disponibile per la tua applicazione. La copertura dei contenuti di un file manifest non rientra nell'ambito di questo codelab, ma puoi farti un'idea di cosa fa.

Di seguito sono riportate altre risorse che ti consentono di approfondire il materiale trattato in questo codelab, nonché di esplorare altri modi per accedere agli strumenti per sviluppatori di Google in modo programmatico. Vogliamo mantenere sincronizzato questo codelab con il repository.

Risorse per questa applicazione

Documentazione

Altri codelab

Introduttivo

Intermedio

App di riferimento

Di seguito sono riportate varie sfide di codice, oltre a metodi diversi per migliorare o potenziare il campione creato in questo codelab. Questo elenco non è certo esaustivo, ma dovrebbe fornire alcuni spunti stimolanti su dove far fare il passo successivo.

  • Applicazione. Non vuoi essere limitato utilizzando JavaScript o le limitazioni imposte da Apps Script? Porta questa applicazione nel tuo linguaggio di programmazione preferito che utilizza le API REST per Google BigQuery, Fogli e Presentazioni.
  • BigQuery. Prova con una query diversa per il set di dati di Shakespeare... magari trova una query di tuo interesse. Un'altra query di esempio è disponibile nell'app BigQuery BigQuery di esempio originale.
  • BigQuery. Prova alcuni degli altri set di dati pubblici di BigQuery, ad esempio trova un set di dati che possa essere più significativo per te.
  • BigQuery. In precedenza abbiamo accennato ad altre query che puoi provare contro le opere di Shakespeare o altre tabelle di dati pubblici e volevamo ripetere la condivisione di questa pagina web e di questa.
  • Fogli. Prova altri tipi di grafici.
  • Fogli & BigQuery. Gira le tabelle... magari hai un grande set di dati in un foglio di lavoro. Nel 2016, il team di BigQuery ha introdotto la funzionalità che consente agli sviluppatori di utilizzare un foglio come origine dati (per ulteriori informazioni, leggi il post del blog uno e due).
  • Presentazioni. Aggiungi altre diapositive alla presentazione generata, ad esempio immagini o altri asset associati all'analisi dei big data. Per iniziare, ecco una guida al servizio integrato in Presentazioni.
  • G Suite. Puoi trovare l'utilizzo per altri servizi G Suite o Google integrati da Apps Script, ad esempio Gmail, Google Drive, Calendar, Documenti, Maps, Analytics, YouTube ecc., oltre ad altri servizi avanzati. Per ulteriori informazioni, consulta la panoramica di riferimento per i servizi integrati e avanzati.