Trasforma i tuoi big data in approfondimenti con Fogli e Presentazioni Google

1. Dall'analisi dei big data alla presentazione con slide

Esistono molti strumenti che i data scientist possono usare per eseguire analisi dei big data, ma alla fine gli analisti devono comunque giustificare i risultati al management. Molti numeri sulla carta o in un database sono difficilmente presentabili ai principali stakeholder. Questo codelab intermedio su Google Apps Script utilizza due piattaforme per sviluppatori Google (Google Workspace e Google Cloud Console) per aiutarti ad automatizzare la fase finale.

Gli strumenti per sviluppatori di Google Cloud ti consentono di eseguire l'analisi approfondita dei dati. Puoi quindi inserire i risultati, inserirli in un foglio di lavoro e generare una presentazione con i dati. Questo rappresenta un modo più adatto per inviare i dati alla gestione. Questo codelab riguarda l'API BigQuery della console Cloud (in quanto servizio avanzato di Apps Script) e i servizi integrati di Apps Script per Fogli Google e Presentazioni Google.

Motivazione

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

Sebbene l'app di esempio del codelab dell'API Presentazioni includa anche BigQuery e Presentazioni, l'app di esempio di questo codelab si differenzia per diversi modi:

  • dell'app Node.js e dell'app Apps Script.
  • Usano le API REST mentre noi usiamo i servizi Apps Script.
  • Usano Google Drive, ma non Fogli Google, mentre questa app usa Fogli, ma non Drive.

Per questo codelab, volevamo riunire più tecnologie in un'unica app, mostrando al contempo funzionalità e API di Google Cloud in modo simile a un caso d'uso reale. L'obiettivo è ispirare l'utente a usare l'immaginazione e prendere in considerazione l'utilizzo di Cloud Console e di Google Workspace per risolvere problemi complessi dell'organizzazione e dei clienti.

Obiettivi didattici

  • Utilizzare Google Apps Script con più servizi Google
  • Come utilizzare Google BigQuery per analizzare i big data
  • Creare un foglio Google e inserire dati al suo interno
  • Come creare un grafico in Fogli
  • Come trasferire dati e grafici da Fogli a una presentazione di Presentazioni Google

Che cosa ti serve

  • Un browser web con accesso a internet
  • Un Account Google (gli account Google Workspace potrebbero richiedere l'approvazione di un amministratore)
  • Familiarità di base con Fogli Google
  • Possibilità di leggere la notazione A1 di Fogli
  • Competenze JavaScript di base
  • La conoscenza dello sviluppo di Apps Script è utile ma non obbligatoria

2. Sondaggio

Come utilizzerai questo codelab/tutorial?

Leggi il documento a scopo informativo, possibilmente trasmettendolo a colleghi tecnici. Superalo il più possibile e prova il maggior numero possibile di esercizi Che diamine, o pensaci bene, completerò l'intero codelab

Come valuteresti la tua esperienza con gli strumenti per sviluppatori di Google Workspace e API?

Principiante Livello intermedio Eccellente

Come valuteresti la tua esperienza specifica con Apps Script?

Principiante Livello intermedio Eccellente

Come valuteresti la tua esperienza con gli strumenti per sviluppatori della console Cloud e API?

Principiante Livello intermedio Eccellente

3. Panoramica

Ora che sai di cosa tratta questo codelab, ecco cosa dovrai fare:

  1. Prendi un esempio esistente di Apps Script e BigQuery e fallo funzionare.
  2. Dall'esempio, scopri come inviare una query a BigQuery e ottenere i risultati.
  3. Crea un foglio Google e inserisci al suo interno i risultati di BigQuery.
  4. Modifica il codice in modo da alterare leggermente i dati restituiti e inseriti nel foglio.
  5. Utilizza il servizio Fogli in Apps Script per creare un grafico per i dati di BigQuery.
  6. Utilizza il servizio Presentazioni per creare una presentazione Google.
  7. Aggiungi un titolo e un sottotitolo alla slide predefinita del titolo.
  8. Crea una slide con una tabella di dati ed esporta le celle di dati del foglio al suo interno.
  9. Crea un'altra slide e inserisci al suo interno 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 Google Workspace che opera a un livello superiore rispetto alle API REST Google. Si tratta di un ambiente di hosting delle applicazioni e di sviluppo serverless accessibile a sviluppatori di ogni livello. Essenzialmente, Apps Script è un runtime JavaScript serverless per l'automazione, l'estensione e l'integrazione di Google Workspace.

Utilizza JavaScript lato server, simile a Node.js, ma è incentrato sulla stretta integrazione con Google Workspace e altri servizi Google anziché sull'hosting di applicazioni rapido e asincrono basato su eventi. Dispone inoltre di un ambiente di sviluppo che potrebbe essere diverso da quello che usi di solito. Con Apps Script, puoi:

  • Puoi sviluppare script utilizzando un editor di codice basato su browser. Puoi anche sviluppare localmente quando utilizzi clasp, lo strumento di deployment a riga di comando per Apps Script.
  • Scrivi il codice in una versione specializzata di JavaScript personalizzata per l'accesso a Google Workspace e ad altri servizi Google o esterni (utilizzando i servizi URL Fetch o JDBC di Apps Script).
  • Potete evitare di scrivere codice di autorizzazione perché se ne occupa Apps Script al posto vostro.
  • Non hai bisogno di ospitare la tua app, perché risiede e viene eseguita sui server Google nel cloud.

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

  • Come servizio integrato
  • Come servizio avanzato

Un servizio integrato offre metodi di alto livello per interagire con i dati utente e con altri sistemi Google e sistemi esterni. Un servizio avanzato è essenzialmente un sottile wrapper che riveste l'API Google Workspace o l'API REST Google. I servizi avanzati offrono copertura completa dell'API REST e spesso possono fare più cose dei servizi integrati, ma richiedono una maggiore complessità di codice (pur rimanendo più facili da usare rispetto all'API REST completa). Inoltre, prima di poter essere utilizzati, i servizi avanzati devono essere attivati nel progetto di uno script.

Se possibile, gli sviluppatori dovrebbero usare un servizio integrato perché è più facile da usare e offre prestazioni più elevate rispetto ai servizi avanzati. Tuttavia, alcune API di Google non hanno i servizi integrati, perciò il servizio avanzato potrebbe essere l'unica opzione. Ad esempio, Google BigQuery non ha un servizio integrato, ma esiste il servizio BigQuery. BigQuery è un servizio della console Cloud che consente di utilizzare l'API Google BigQuery per eseguire query su corpus di dati di grandi dimensioni (ad es. più terabyte), ma può comunque fornire risultati in pochi secondi.

Accedere a Fogli e Diapositive di Apps Script

A differenza di BigQuery, sia Fogli sia Presentazioni dispongono di servizi integrati. Inoltre, dispongono di servizi avanzati per accedere alle funzionalità disponibili solo nell'API. Visualizza la documentazione dei servizi integrati di Fogli e Presentazioni prima di iniziare a scrivere il codice. Tieni presente che sono disponibili anche documenti per i servizi avanzati sia di Fogli che di Presentazioni.

4. Attività 1: esegui BigQuery e registra i risultati in Fogli

Introduzione

Con questa prima attività, eseguiremo un'ampia parte del codelab. Una volta completato il codelab, infatti, avrai quasi completato la metà dell'intero codelab. Grazie alla suddivisione in diverse sottosezioni, potrai:

  • Creare un progetto Google Apps Script e una console Cloud.
  • Attiva l'accesso al servizio avanzato di BigQuery.
  • Apri l'editor di script e inserisci il codice sorgente dell'applicazione.
  • Navigare nel processo di autorizzazione dell'app (OAuth2).
  • Eseguire l'applicazione che invia una richiesta a BigQuery.
  • Esamina il nuovo foglio Google creato utilizzando i risultati di BigQuery.

Configurazione

  1. Per creare un progetto Apps Script, vai a script.google.com e fai clic su Nuovo progetto.
  2. Per rinominare il progetto Apps Script, fai clic su Progetto senza titolo, inserisci un titolo per il progetto e fai clic su Rinomina.

Successivamente, dovrai creare un progetto nella console Cloud per eseguire query sui dati in BigQuery.

  1. Per creare un progetto nella console Cloud, utilizza questo link scorciatoia per creare un progetto, assegnagli un nome e fai clic su Crea.
  1. Al termine della creazione del progetto, viene visualizzata una notifica nella pagina. Assicurati che il nuovo progetto sia selezionato nell'elenco dei progetti nella parte superiore della pagina.
  2. Fai clic su Menu f5fbd278915eb7aa.png e vai ad API e Servizi > Schermata per il consenso OAuth (link diretto).
  3. Fai clic su Interno > Crea per creare un'app per gli utenti di Google Workspace della tua organizzazione.
  4. Nel campo Nome app, inserisci "Codelab per big data".
  5. Inserisci gli indirizzi email di contatto nei campi Assistenza utenti e Informazioni di contatto dello sviluppatore.
  6. Fai clic su Salva e continua > Salva e continua.
  7. Fai clic su Altro 50fa7e30ed2d1b1c.png nella barra di navigazione e seleziona Impostazioni progetto (link diretto).
  8. Copia il valore elencato in Numero progetto. (Un campo ID progetto separato viene utilizzato successivamente nel codelab.)

Successivamente, collegherai il progetto Apps Script al progetto della console Cloud.

  1. Passa all'editor di App Script e fai clic su Impostazioni progetto ingranaggio-impostazioni.
  2. In Progetto Google Cloud Platform (Google Cloud), fai clic su Cambia progetto.
  3. Inserisci il numero del progetto e fai clic su Imposta progetto.
  4. Poi, fai clic su Editor editor di codice per iniziare ad aggiungere il servizio avanzato di BigQuery.
  5. Accanto a Servizi, fai clic su Aggiungi un servizio aggiungi un servizio.
  6. Nella finestra di dialogo Aggiungi un servizio, seleziona API BigQuery e fai clic su Aggiungi.

Il passaggio finale consiste nell'attivare l'API BigQuery nella console Cloud.

  1. Per farlo, passa alla console Cloud e fai clic su API e Servizi > Fitbit.com. Assicurati di essere ancora nello stesso progetto che hai creato nel Passaggio 3.
  2. Fai clic su Abilita API e servizi.
  3. Cerca "big query", seleziona l'API BigQuery (non l'API BigQuery Data Transfer) e fai clic su Abilita per attivarla.

a0e07fa159de9367.png

Ora puoi inserire il codice dell'applicazione, completare il processo di autorizzazione e far funzionare la prima iterazione di questa applicazione.

Carica ed esegui l'applicazione

  1. Nell'editor di script, sostituisci il blocco di codice myFunction() predefinito con il seguente codice:
// File name for data results
var QUERY_NAME = "Most common words in all of Shakespeare's works";
// Replace this value with your Google Cloud Console Project ID
var PROJECT_ID = '';
if (!PROJECT_ID) throw Error('Project ID is required in setup');

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

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

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

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

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

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

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

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

  Logger.log('Results spreadsheet created: %s', spreadsheet.getUrl());
}
  1. Fai clic su Salva salva.
  2. Accanto a Code.gs, fai clic su Altro 50fa7e30ed2d1b1c.png > Rinomina. Modifica il titolo da Code.gs a bq-sheets-slides.js.
  3. Adesso esaminiamo il codice che esegue una query in BigQuery e scrive i risultati in un foglio Google. Puoi visualizzarla nella parte superiore di 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 esamina le opere di Shakespeare, che fanno parte del set di dati pubblico di BigQuery, e restituisce le dieci parole che compaiono più di frequente in tutte le sue opere, in ordine decrescente per popolarità. Per farti un'idea di quanto possa essere utile BigQuery, immagina quanto lavoro sarebbe eseguire questa compilazione a mano.

La funzione dichiara anche una variabile PROJECT_ID che richiede un ID progetto della console Cloud valido. L'istruzione if sotto la variabile impedisce che l'applicazione prosegua senza l'ID progetto.

  1. Passa al progetto della console Cloud, fai clic su Altro 50fa7e30ed2d1b1c.png nella barra di navigazione e seleziona Impostazioni progetto.
  2. Copia il valore elencato in Project ID (ID progetto).
  3. Torna all'editor di App Script, individua la variabile PROJECT_ID in bq-sheets-slides.js e aggiungi il valore.
  4. Fai clic su Salva salva > esegui.
  5. Fai clic su Rivedi autorizzazioni per continuare.
  1. Una volta avviata l'esecuzione dello script, il log di esecuzione integrato si apre e registra le azioni dello script in tempo reale.
  1. Quando il log di esecuzione indica "Esecuzione completata", vai su Google Drive (drive.google.com) e cerca il foglio Google denominato "Le parole più comuni in tutte le opere di Shakespeare" (o il nome assegnato alla variabile QUERY_NAME, se l'hai aggiornata):
  2. Apri il foglio di lavoro per visualizzare le dieci parole più comuni e i relativi conteggi totali in ordine decrescente:

afe500ad43f8cdf8.png

Riepilogo attività 1

In sintesi, hai eseguito un codice che ha interrogato tutte le opere di Shakespeare esaminando ogni parola di ogni opera. Conta le parole e le ordina in ordine decrescente di apparizione. Per visualizzare questi dati, hai anche utilizzato il servizio integrato di Apps Script per Fogli Google.

Il codice che hai utilizzato per bq-sheets-slides.js è disponibile anche nella cartella step1 del repository GitHub di questo codelab alla pagina github.com/googlecodelabs/bigquery-sheets-slides. Il codice è ispirato a questo esempio originale nella pagina dei servizi avanzati di BigQuery, che esegue una query leggermente diversa recuperando le parole più popolari con almeno 10 caratteri usati da Shakespeare. Puoi anche vedere un esempio nel suo repository GitHub.

Se ti interessano altre query che puoi creare con le opere di Shakespeare o altre tabelle di dati pubblici, consulta Come eseguire query sulle tabelle di esempio BigQuery e questo repository GitHub.

Puoi anche eseguire query utilizzando la pagina BigQuery nella console Cloud prima di eseguirle in Apps Script. Per individuarlo, fai clic su Menu f5fbd278915eb7aa.png e vai alla UI di BigQuery > Area di lavoro SQL (link diretto). Ad esempio, ecco come viene visualizzata la nostra query nell'interfaccia grafica di BigQuery:

BigQueryUI

5. Attività 2: crea un grafico in Fogli Google

Lo scopo di runQuery() è utilizzare BigQuery e inviare i risultati dei relativi dati a un foglio Google. Ora dobbiamo creare un grafico usando i dati. Creiamo una nuova funzione chiamata createColumnChart() che chiami Fogli Metodo newChart().

  1. Nell'editor di Apps Script, aggiungi la funzione createColumnChart() a bq-sheets-slides.js dopo il giorno runQuery(). Il codice ottiene il foglio e richiede un grafico a colonne con tutti i dati. L'intervallo di dati inizia dalla cella A2, poiché la prima riga contiene le intestazioni di colonna.
/**
 * Uses spreadsheet data to create a column chart.
 * @param {Spreadsheet} Spreadsheet containing results data
 * @returns {EmbeddedChart} Visualizes the results
 * @see https://developers.google.com/apps-script/reference/spreadsheet/embedded-chart
 */
function createColumnChart(spreadsheet) {
  // Retrieve the populated (first) Sheet.
  var sheet = spreadsheet.getSheets()[0];
  // Data range in Sheet is from cell A2 to B11.
  var START_CELL = 'A2';  // skip header row
  var END_CELL = 'B11';
  // Place chart on Sheet starting on cell E5.
  var START_ROW = 5;      // row 5
  var START_COL = 5;      // col E
  var OFFSET = 0;

  // Create & place chart on the Sheet using above values.
  var chart = sheet.newChart()
     .setChartType(Charts.ChartType.COLUMN)
     .addRange(sheet.getRange(START_CELL + ':' + END_CELL))
     .setPosition(START_ROW, START_COL, OFFSET, OFFSET)
     .build();
  sheet.insertChart(chart);
}
  1. La funzione createColumnChart() richiede un parametro oggetto foglio di lavoro, quindi dobbiamo aggiornare runQuery() per restituire un oggetto spreadsheet che possiamo passare a createColumnChart(). Alla fine di runQuery(), restituisci l'oggetto spreadsheet dopo aver registrato la corretta creazione del foglio:
  Logger.log('Results spreadsheet created: %s', spreadsheet.getUrl());

  // NEW: Return the spreadsheet object for later use.
  return spreadsheet;
}
  1. Crea una funzione createBigQueryPresentation() per chiamare sia runQuery() sia createColumnChart(). È una best practice separare logicamente la funzionalità di creazione di grafici e di BigQuery:
/**
 * Runs the query, adds data and a chart to a spreadsheet.
 */
function createBigQueryPresentation() {
  var spreadsheet = runQuery();
  createColumnChart(spreadsheet);
}
  1. Hai eseguito due importanti passaggi: la restituzione dell'oggetto del foglio di lavoro e la creazione della funzione di immissione. Per rendere più utilizzabile runQuery(), dobbiamo spostare la riga del log da runQuery() a createBigQueryPresentation(). Il metodo dovrebbe avere ora il seguente aspetto:
/**
 * Runs a BigQuery query, adds data and a chart to a spreadsheet.
 */
function createBigQueryPresentation() {
  var spreadsheet = runQuery();
  Logger.log('Results spreadsheet created: %s', spreadsheet.getUrl()); // MOVED HERE
  createColumnChart(spreadsheet);
}

Con le modifiche precedenti (tranne PROJECT_ID), ora bq-sheets-slides.js dovrebbe avere il seguente aspetto. Questo codice si trova anche in step2 del repository GitHub.

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

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

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

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

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

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

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

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

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

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

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

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

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

Salva il progetto di script nell'editor di script. Quindi seleziona createBigQueryPresentation dall'elenco delle funzioni e fai clic su Esegui. Al termine, verrà creato un altro foglio di lavoro su Google Drive, ma questa volta viene incluso un grafico accanto ai dati:

Foglio con grafico

6. Attività 3: inserisci i dati dei risultati in una presentazione

La parte finale del codelab prevede la creazione di una presentazione Google, l'aggiunta del titolo e del sottotitolo alla slide del titolo e la creazione di slide per le celle di dati e il grafico.

  1. Nell'editor di Apps Script, aggiungi la funzione createSlidePresentation() a bq-sheets-slides.js dopo il giorno createColumnChart(). Tutto il lavoro della presentazione si svolge in questa funzione. Iniziamo con la creazione di una presentazione, quindi aggiungiamo un titolo e un sottotitolo alla slide predefinita del titolo.
/**
 * Create presentation with spreadsheet data and a chart
 * @param {Spreadsheet} Spreadsheet containing results data
 * @param {EmbeddedChart} Sheets chart to embed on a slide
 * @returns {Presentation} Slide deck with the results
  * @see https://developers.google.com/apps-script/reference/slides/presentation
 */
function createSlidePresentation(spreadsheet, chart) {
  // Create the presentation.
  var deck = SlidesApp.create(QUERY_NAME);

  // Populate the title slide.
  var [title, subtitle] = deck.getSlides()[0].getPageElements();
  title.asShape().getText().setText(QUERY_NAME);
  subtitle.asShape().getText().setText('using Google Cloud Console and Google Workspace APIs:\n' +
    'Google Apps Script, BigQuery, Sheets, Slides');
  1. Il passaggio successivo in createSlidePresentation() consiste nell'importare i dati delle celle dal foglio Google nella nostra 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 with
  // the dimensions of the data range; fails if the sheet is empty.
  var tableSlide = deck.appendSlide(SlidesApp.PredefinedLayout.BLANK);
  var sheetValues = spreadsheet.getSheets()[0].getRange(
      START_CELL + ':' + END_CELL).getValues();
  var table = tableSlide.insertTable(sheetValues.length, sheetValues[0].length);

  // Populate the table with spreadsheet data.
  for (var i = 0; i < sheetValues.length; i++) {
    for (var j = 0; j < sheetValues[0].length; j++) {
      table.getCell(i, j).getText().setText(String(sheetValues[i][j]));
    }
  }
  1. Il passaggio finale in createSlidePresentation() consiste nell'aggiungere un'altra slide, importare il grafico dal nostro foglio di lavoro e restituire l'oggetto Presentation. Aggiungi questo snippet di codice 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. Ora che la funzione è completa, controlla di nuovo la sua firma. createSlidePresentation() richiede i parametri degli oggetti sia del foglio di lavoro che del grafico. Abbiamo già modificato runQuery() in modo che restituisca l'oggetto Spreadsheet, ma dobbiamo apportare una modifica simile a createColumnChart() in modo che restituisca un oggetto grafico (EmbeddedChart). Torna a createColumnChart() e aggiungi il seguente snippet di codice alla fine della funzione:
  // NEW: Return the chart object for later use.
  return chart;
}
  1. Poiché ora createColumnChart() restituisce un oggetto grafico, dobbiamo salvare il grafico in una variabile. Quindi passiamo sia il foglio di lavoro sia le variabili del grafico a createSlidePresentation(). Poiché registriamo anche l'URL del foglio di lavoro appena creato, registriamo anche l'URL della nuova presentazione di slide. Aggiorna il tuo createBigQueryPresentation() in modo che abbia il seguente aspetto:
/**
 * Runs a BigQuery query, adds data and a chart to a spreadsheet,
 * and adds the data and chart to a new slide presentation.
 */
function createBigQueryPresentation() {
  var spreadsheet = runQuery();
  Logger.log('Results spreadsheet created: %s', spreadsheet.getUrl());
  var chart = createColumnChart(spreadsheet); // UPDATED
  var deck = createSlidePresentation(spreadsheet, chart); // NEW
  Logger.log('Results slide deck created: %s', deck.getUrl()); // NEW
}
  1. Salva ed esegui di nuovo createBigQueryPresentation(). Tuttavia, prima dell'esecuzione, l'app ha bisogno di un altro set di autorizzazioni dell'utente per visualizzare e gestire le presentazioni di Presentazioni Google. Dopo aver controllato e consentito queste autorizzazioni, l'esecuzione avverrà come prima.
  2. Ora, oltre al foglio di lavoro che hai creato, dovresti anche avere una nuova presentazione Google con tre slide (titolo, tabella di dati, grafico dati), come mostrato di seguito:

f6896f22cc3cd50d.png

59960803e62f7c69.png

5549f0ea81514360.png

7. Conclusione

Complimenti, hai creato un'applicazione che utilizza entrambi i lati di Google Cloud. Esegue una richiesta a Google BigQuery che esegue una query su uno dei suoi set di dati pubblici, crea un foglio di lavoro Fogli Google per archiviare i risultati, aggiunge un grafico basato sui dati e infine crea una presentazione Google con i dati e i risultati del grafico del foglio di lavoro.

Questi passaggi sono le operazioni che hai eseguito tecnicamente. In termini generali, sei passato dall'analisi dei big data a un risultato che puoi presentare agli stakeholder, il tutto automatizzato tramite codice. Ci auguriamo che questo Sample ti spinga a personalizzarlo per i tuoi progetti. Al termine di questo codelab, forniremo alcuni suggerimenti su come migliorare ulteriormente questa app di esempio.

Con le modifiche apportate dall'attività finale (tranne PROJECT_ID), ora bq-sheets-slides.js dovrebbe avere il seguente aspetto:

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Questo esempio di codice è disponibile anche nella cartella final del repository GitHub.

8. Risorse aggiuntive

Di seguito puoi trovare altre risorse per approfondire il materiale trattato in questo codelab e per esplorare altri modi di accedere agli strumenti per sviluppatori di Google in modo programmatico.

Risorse per questa applicazione

Documentazione

Video

Notizie e aggiornamenti

Altri codelab

Introduttivo

Intermedio

9. Il prossimo passaggio: le sfide del codice

Di seguito sono elencati i vari modi in cui puoi migliorare o arricchire l'esempio che abbiamo creato in questo codelab. Questo elenco non è completo, ma fornisce alcune idee su come procedere.

  • Applicazione: non vuoi limitare l'utilizzo di JavaScript o le limitazioni imposte da Apps Script? Trasferisci questa applicazione al tuo linguaggio di programmazione preferito che utilizza le API REST per Google BigQuery, Fogli e Presentazioni.
  • BigQuery: sperimenta una query diversa per il set di dati Shakespeare che ti interessa. Puoi trovare un'altra query di esempio nell'app di esempio BigQuery di Apps Script originale.
  • BigQuery: sperimenta altri set di dati pubblici di BigQuery per trovarne uno più significativo per te.
  • BigQuery: in precedenza abbiamo menzionato altre query che puoi creare con le opere di Shakespeare o altre tabelle di dati pubblici. Sono disponibili in questa pagina web e in questo repository GitHub.
  • Fogli: sperimenta altri tipi di grafici nella Galleria grafici.
  • Fogli e BigQuery: utilizza un set di dati di fogli di lavoro di grandi dimensioni. Nel 2016, il team di BigQuery ha introdotto una funzionalità per consentire agli sviluppatori di usare un foglio come origine dati. Per saperne di più, vai a Google BigQuery si integra con Google Drive.
  • Presentazioni: aggiungi altre slide alla presentazione generata, ad esempio immagini o altri asset legati all'analisi dei big data. Ecco la documentazione di riferimento per il servizio integrato Presentazioni.
  • Google Workspace: utilizza altri servizi Google Workspace o Google integrati da Apps Script. Ad esempio, Gmail, Calendar, Documenti, Drive, Maps, Analytics, YouTube e così via, nonché altri servizi avanzati. Per ulteriori informazioni, consulta la panoramica di riferimento per i servizi integrati e avanzati.