Transforme Big Data em insights com as Planilhas e Apresentações Google

1. Da análise de Big Data à apresentação de slides

Existem muitas ferramentas para cientistas de dados realizarem análises de Big Data, mas, no final, os analistas ainda precisam justificar os resultados para a gerência. Muitos números no papel ou em um banco de dados não são apresentáveis para os principais stakeholders. Este codelab intermediário do Google Apps Script usa duas plataformas para desenvolvedores do Google (o Google Workspace e o console do Google Cloud) para ajudar você a automatizar essa etapa final.

Com as ferramentas para desenvolvedores do Google Cloud, é possível fazer uma análise detalhada de dados. Em seguida, é possível inserir os resultados em uma planilha e gerar uma apresentação de slides com os dados. Essa é uma maneira mais adequada de entregar dados à gerência. Este codelab aborda a API BigQuery do Console do Cloud (como um serviço avançado do Apps Script) e os serviços integrados do Apps Script para o Google Planilhas e o Apresentações Google.

Motivação

O app de exemplo neste codelab foi inspirado nestes outros exemplos de código:

Embora o app de exemplo do codelab da API Slides também tenha o BigQuery e o Apresentações, ele difere do app de exemplo deste codelab de várias maneiras:

  • O app Node.js deles x nosso app Apps Script.
  • Eles usam APIs REST, enquanto nós usamos serviços do Apps Script.
  • Eles usam o Google Drive, mas não o Google Planilhas, enquanto este app usa o Planilhas, mas não o Drive.

Para este codelab, queríamos reunir várias tecnologias em um único app e mostrar recursos e APIs do Google Cloud de uma forma que se assemelhasse a um caso de uso real. O objetivo é inspirar você a usar a imaginação e considerar o uso do Console do Cloud e do Google Workspace para resolver problemas difíceis da sua organização e dos seus clientes.

O que você vai aprender

  • Como usar o Google Apps Script com vários serviços do Google
  • Como usar o Google BigQuery para analisar Big Data
  • Como criar uma planilha Google e inserir dados nela
  • Como criar um gráfico nas Planilhas Google
  • Como transferir dados e gráficos das Planilhas para uma apresentação Google

O que é necessário

  • Um navegador da Web com acesso à Internet
  • Uma Conta do Google (as contas do Google Workspace podem exigir a aprovação do administrador)
  • Conhecimento básico do Google Planilhas
  • Capacidade de ler a notação A1 do Google Sheets
  • Habilidades básicas de JavaScript
  • É útil ter conhecimento sobre o desenvolvimento do Apps Script, mas não é obrigatório

2. Pesquisa

Como você vai usar este codelab/tutorial?

Ler para fins informativos, talvez repassando para colegas técnicos Fazer o máximo possível e tentar o máximo de exercícios que puder De qualquer jeito, vou concluir todo o codelab

Como você classificaria sua experiência com as ferramentas e APIs para desenvolvedores do Google Workspace?

Iniciante Intermediário Proficiente

Como você classificaria sua experiência com o Apps Script especificamente?

Iniciante Intermediário Proficiente

Como você classificaria sua experiência com as ferramentas e APIs para desenvolvedores do console do Cloud?

Iniciante Intermediário Proficiente

3. Visão geral

Agora que você já sabe sobre o que é este codelab, confira o que você vai fazer:

  1. Pegue um exemplo do Apps Script-BigQuery e faça com que ele funcione.
  2. Com o exemplo, aprenda a enviar uma consulta ao BigQuery e receber os resultados.
  3. Crie uma planilha Google e insira os resultados do BigQuery nela.
  4. Modifique o código para alterar um pouco os dados retornados e inseridos na planilha.
  5. Use o serviço Planilhas no Apps Script para criar um gráfico com os dados do BigQuery.
  6. Use o serviço Apresentações para criar uma apresentação Google.
  7. Adicione um título e um subtítulo ao slide de título padrão.
  8. Crie um slide com uma tabela de dados e exporte as células de dados da planilha para ele.
  9. Crie outro slide e insira o gráfico da planilha nele.

Vamos começar com algumas informações básicas sobre o Apps Script, o BigQuery, as Planilhas e as Apresentações.

Google Apps Script e BigQuery

O Google Apps Script é uma plataforma de desenvolvimento do Google Workspace que opera em um nível mais alto do que as APIs REST do Google. Ele é um ambiente de desenvolvimento e hospedagem de aplicativos sem servidor que pode ser usado por desenvolvedores com os mais variados níveis de experiência. Basicamente, o Apps Script é um ambiente de execução JavaScript sem servidor para automação, extensão e integração do Google Workspace.

Ele usa JavaScript do lado do servidor, semelhante ao Node.js, mas se concentra na integração com o Google Workspace e outros serviços do Google, em vez de hospedagem de aplicativos rápida, assíncrona e orientada a eventos. Além disso, o ambiente de desenvolvimento dele pode ser diferente do que você conhece. Com o Apps Script, é possível:

  • Desenvolver scripts usando um editor de código baseado em navegador, mas também é possível trabalhar localmente usando a clasp, que é uma ferramenta de implantação de linha de comando para o Apps Script.
  • Escrever código em uma versão especializada do JavaScript personalizada para acessar o Google Workspace e outros serviços do Google ou externos (usando os serviços URL Fetch ou JDBC do Apps Script).
  • Não precisa escrever o código de autorização, já que o Apps Script faz isso por você.
  • não hospedar seu app, já que ele é armazenado e executado em servidores do Google na nuvem.

O Apps Script interage com outras tecnologias do Google de duas maneiras diferentes:

  • Como um serviço integrado
  • Como um serviço avançado

Um serviço integrado tem métodos de alto nível para interagir com dados do usuário, outros sistemas do Google e sistemas externos. Um serviço avançado é essencialmente um wrapper simples de uma API do Google Workspace ou uma API REST do Google. mas são totalmente compatíveis com a API REST e podem desempenhar mais funções do que os serviços integrados. No entanto, eles exigem uma programação mais complexa (embora ainda sejam mais fáceis de usar do que a API REST). É preciso ativar os serviços avançados para um projeto de script antes de usá-los.

Sempre que possível, os desenvolvedores devem usar um serviço integrado porque eles são mais fáceis de usar e fazem mais do que os serviços avançados. No entanto, algumas APIs do Google não têm serviços integrados. Nesses casos, usar um serviço avançado pode ser a única opção. Por exemplo, o Google BigQuery não tem um serviço integrado, mas o serviço do BigQuery existe. O serviço BigQuery é um serviço do console do Cloud que permite usar a API BigQuery para realizar consultas em grandes volumes de dados (por exemplo, vários terabytes) e ainda assim fornecer resultados em segundos.

Acessar o Planilhas e o Apresentações Google pelo Apps Script

Ao contrário do BigQuery, as Planilhas e as Apresentações Google têm serviços integrados. Eles também têm serviços avançados para acessar recursos encontrados apenas na API. Consulte a documentação dos serviços integrados Planilhas e Apresentações antes de começar a programar. Há também documentação para os serviços avançados do Planilhas e do Apresentações.

4. Tarefa 1: executar o BigQuery e registrar os resultados no app Planilhas

Introdução

Vamos fazer uma grande parte deste codelab com esta primeira tarefa. Na verdade, quando você terminar, já terá feito metade do codelab. Dividido em várias subseções, você vai:

  • Crie um projeto do Google Apps Script e do console do Cloud.
  • Ative o acesso ao serviço avançado do BigQuery.
  • Abra o editor de script e insira o código-fonte do aplicativo.
  • Navegue pelo processo de autorização de app (OAuth2).
  • Execute o aplicativo que envia uma solicitação ao BigQuery.
  • Analise a nova planilha Google criada com os resultados do BigQuery.

Configuração

  1. Para criar um projeto do Apps Script, acesse script.google.com e clique em Novo projeto.
  2. Para renomear seu projeto do Apps Script, clique em Projeto sem título, insira um título e clique em Renomear.

Em seguida, crie um projeto do Cloud Console para consultar dados no BigQuery.

  1. Para criar um projeto do Cloud Console, use este link de atalho para criar um projeto, dê um nome a ele e clique em Criar.
  1. Quando a criação do projeto é concluída, uma notificação aparece na página. Verifique se o novo projeto está selecionado na lista de projetos na parte de cima da página.
  2. Clique em Menu f5fbd278915eb7aa.png e acesse APIs e serviços > Tela de permissão OAuth (link direto).
  3. Clique em Interno > Criar para criar um app para usuários do Google Workspace na sua organização.
  4. No campo Nome do app, insira "Codelab de Big Data".
  5. Insira os e-mails de contato nos campos Suporte ao usuário e Dados de contato do desenvolvedor.
  6. Clique em Salvar e continuar > Salvar e continuar.
  7. Clique em Mais 50fa7e30ed2d1b1c.png na barra de navegação e selecione Configurações do projeto (link direto).
  8. Copie o valor listado em Número do projeto. Um campo ID do projeto separado será usado mais adiante no codelab.

Em seguida, conecte seu projeto do Apps Script ao projeto do console do Cloud.

  1. Mude para o editor de script do App Script e clique em Configurações do projeto settings-gear.
  2. Em "Projeto do Google Cloud Platform (GCP)", clique em Mudar projeto.
  3. Digite o número do projeto e clique em Definir projeto.
  4. Em seguida, clique em Editor code-editor para começar a adicionar o serviço avançado do BigQuery.
  5. Ao lado de Serviços, clique em Adicionar um serviço adicionar um serviço.
  6. Na caixa de diálogo "Adicionar um serviço", selecione API BigQuery e clique em Adicionar.

A última etapa é ativar a API BigQuery no Console do Cloud.

  1. Para fazer isso, mude para o console do Cloud e clique em APIs e serviços > Painel. Verifique se você ainda está no mesmo projeto criado na etapa 3.
  2. Clique em Ativar APIs e serviços.
  3. Pesquise "big query", selecione a API BigQuery (não a API Data Transfer) e clique em Ativar para ativar.

a0e07fa159de9367.png

Agora você já pode inserir o código do aplicativo, passar pelo processo de autorização e colocar em funcionamento a primeira iteração deste aplicativo.

Fazer upload e executar o aplicativo

  1. No editor de script, substitua o bloco de código myFunction() padrão pelo seguinte código:
// 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. Clique em Salvar salvar.
  2. Ao lado de Code.gs, clique em Mais 50fa7e30ed2d1b1c.png > Renomear. Mude o título de Code.gs para bq-sheets-slides.js.
  3. Em seguida, vamos analisar o código que consulta o BigQuery e grava os resultados em uma planilha Google. Ele aparece na parte de cima 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

Essa consulta examina as obras de Shakespeare, que fazem parte do conjunto de dados públicos do BigQuery, e retorna as 10 palavras mais comuns em todas as obras, classificadas em ordem decrescente de frequência. Para ter uma ideia de como o BigQuery é útil, imagine o trabalho que seria fazer essa compilação manualmente.

A função também declara uma variável PROJECT_ID que exige um ID do projeto válido do Console do Cloud. A declaração if na variável impede que o aplicativo continue sem o ID do projeto.

  1. Mude para seu projeto do console do Cloud, clique em Mais 50fa7e30ed2d1b1c.png na barra de navegação e selecione Configurações do projeto.
  2. Copie o valor listado em ID do projeto.
  3. Volte ao editor do Apps Script, localize a variável PROJECT_ID em bq-sheets-slides.js e adicione o valor.
  4. Clique em Salvar salvar > Executar.
  5. Clique em Revisar permissões para continuar.
  1. Quando o script começa a ser executado, o registro de execução integrado é aberto e registra as ações do script em tempo real.
  1. Quando o registro de execução mostrar "Execução concluída", acesse o Google Drive (drive.google.com) e encontre a planilha Google chamada "Most common words in all of Shakespeare's works" (ou o nome que você atribuiu à variável QUERY_NAME, se a atualizou):
  2. Abra a planilha para conferir as 10 palavras mais comuns e as contagens totais delas classificadas em ordem decrescente:

afe500ad43f8cdf8.png

Resumo da tarefa 1

Para recapitular, você executou um código que consultou todas as obras de Shakespeare, analisando cada palavra em cada peça. Ele contou as palavras e as classificou em ordem decrescente de aparição. Você também usou o serviço integrado do Apps Script para o Google Planilhas e mostrar esses dados.

O código usado para bq-sheets-slides.js também pode ser encontrado na pasta step1 do repositório do GitHub deste codelab em github.com/googlecodelabs/bigquery-sheets-slides. O código foi inspirado neste exemplo original na página de serviços avançados do BigQuery, que executou uma consulta um pouco diferente para recuperar as palavras mais usadas por Shakespeare com 10 ou mais caracteres. Confira um exemplo no repositório do GitHub.

Se você quiser saber mais sobre outras consultas que podem ser criadas com as obras de Shakespeare ou outras tabelas de dados públicos, acesse Como consultar as tabelas de amostra do BigQuery e este repositório do GitHub.

Também é possível executar consultas usando a página do BigQuery no Console do Cloud antes de executá-las no Apps Script. Para encontrar, clique em Menu f5fbd278915eb7aa.png e acesse IU do BigQuery > Espaço de trabalho SQL (link direto). Por exemplo, veja como nossa consulta aparece na interface gráfica do BigQuery:

BigQueryUI

5. Tarefa 2: criar um gráfico no Google Planilhas

O objetivo do runQuery() é usar o BigQuery e enviar os resultados dos dados para uma planilha Google. Em seguida, precisamos criar um gráfico usando os dados. Vamos criar uma nova função chamada createColumnChart() que chama o método newChart() das Planilhas.

  1. No editor de script do Apps Script, adicione a função createColumnChart() a bq-sheets-slides.js depois de runQuery(). O código busca a planilha e solicita um gráfico de colunas com todos os dados. O intervalo de dados começa na célula A2, porque a primeira linha tem os cabeçalhos das colunas.
/**
 * 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. A função createColumnChart() exige um parâmetro de objeto de planilha. Por isso, precisamos atualizar runQuery() para retornar um objeto spreadsheet que possa ser transmitido para createColumnChart(). No final de runQuery(), retorne o objeto spreadsheet depois de registrar a criação da planilha:
  Logger.log('Results spreadsheet created: %s', spreadsheet.getUrl());

  // NEW: Return the spreadsheet object for later use.
  return spreadsheet;
}
  1. Crie uma função createBigQueryPresentation() para chamar runQuery() e createColumnChart(). Separar logicamente o BigQuery e a funcionalidade de criação de gráficos é uma prática recomendada:
/**
 * Runs the query, adds data and a chart to a spreadsheet.
 */
function createBigQueryPresentation() {
  var spreadsheet = runQuery();
  createColumnChart(spreadsheet);
}
  1. Você retornou o objeto da planilha e criou a função de entrada, que são duas etapas importantes. Para tornar runQuery() mais utilizável, precisamos mover a linha de registro de runQuery() para createBigQueryPresentation(). Seu método vai ficar assim:
/**
 * 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);
}

Com as mudanças acima (exceto PROJECT_ID), seu bq-sheets-slides.js vai ficar assim: Esse código também pode ser encontrado em step2 do repositório do 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);
}

No editor de script, salve o projeto. Em seguida, selecione createBigQueryPresentation na lista de funções e clique em Executar. Depois que ele for concluído, outra planilha será criada no seu Google Drive, mas desta vez um gráfico será incluído na planilha ao lado dos dados:

Página com gráfico

6. Tarefa 3: coloque os dados dos resultados em uma apresentação de slides

A parte final do codelab envolve criar uma apresentação Google, adicionar o título e o subtítulo ao slide de título e criar slides para as células de dados e o gráfico.

  1. No editor de script do Apps Script, adicione a função createSlidePresentation() a bq-sheets-slides.js depois de createColumnChart(). Todo o trabalho na apresentação de slides acontece nessa função. Vamos começar criando uma apresentação de slides e adicionando um título e um subtítulo ao slide de título padrão.
/**
 * 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. A próxima etapa em createSlidePresentation() é importar os dados das células do Google Planilhas para a nova apresentação de slides. Adicione este snippet de código à função:
  // 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. A etapa final em createSlidePresentation() é adicionar mais um slide, importar o gráfico da planilha e retornar o objeto Presentation. Adicione este snippet de código à função:
  // 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. Agora que a função está completa, confira de novo a assinatura dela. O createSlidePresentation() exige parâmetros de objeto de planilha e gráfico. Já ajustamos runQuery() para retornar o objeto Spreadsheet, mas precisamos fazer uma mudança semelhante em createColumnChart() para que ele retorne um objeto de gráfico (EmbeddedChart). Volte a createColumnChart() e adicione o seguinte snippet de código ao final da função:
  // NEW: Return the chart object for later use.
  return chart;
}
  1. Como createColumnChart() agora retorna um objeto de gráfico, precisamos salvar o gráfico em uma variável. Em seguida, transmitimos as duas variáveis (planilha e gráfico) para createSlidePresentation(). Da mesma forma que o URL da nova planilha é registrado, também é possível registrar o URL da nova apresentação de slides. Atualize o createBigQueryPresentation() para que ele fique assim:
/**
 * 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. Salve e execute createBigQueryPresentation() de novo. Antes da execução, o app precisa de mais um conjunto de permissões do usuário para visualizar e gerenciar apresentações Google. Depois que você analisar e permitir essas permissões, ele vai funcionar como antes.
  2. Agora, além da planilha criada, você também vai receber uma nova apresentação com três slides (título, tabela de dados e gráfico), conforme mostrado abaixo:

f6896f22cc3cd50d.png

59960803e62f7c69.png

5549f0ea81514360.png

7. Conclusão

Parabéns! Você criou um aplicativo que usa os dois lados do Google Cloud. Ele faz uma solicitação do Google BigQuery que consulta um dos conjuntos de dados públicos, cria uma planilha do Google Planilhas para armazenar os resultados, adiciona um gráfico com base nos dados e, por fim, cria uma apresentação do Google Slides com os dados e os resultados do gráfico da planilha.

Essas etapas são o que você fez tecnicamente. De um modo geral, você passou da análise de Big Data para um resultado que pode apresentar às partes interessadas — tudo automatizado usando código. Esperamos que este exemplo inspire você a personalizar para seus próprios projetos. Ao final deste codelab, vamos dar algumas sugestões de como melhorar ainda mais esse app de exemplo.

Com as mudanças da tarefa final (exceto PROJECT_ID), seu bq-sheets-slides.js vai ficar assim:

/**
 * 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());
}

Esse exemplo de código também pode ser encontrado na pasta final do repositório do GitHub.

8. Outros recursos

Confira abaixo mais recursos para se aprofundar no material abordado neste codelab e conhecer outras formas de acessar as ferramentas para desenvolvedores do Google de maneira programática.

Recursos para este aplicativo

Documentação

Vídeos

Notícias e atualizações

Outros codelabs

Básico

Intermediário

9. Próxima etapa: desafios de programação

Confira abaixo diferentes maneiras de melhorar ou aumentar a amostra criada neste codelab. Essa lista não é completa, mas oferece algumas ideias inspiradoras sobre como dar o próximo passo.

  • Aplicativo: não quer ficar limitado ao uso de JavaScript ou às restrições impostas pelo Apps Script? Porte esse aplicativo para sua linguagem de programação favorita que usa as APIs REST do Google BigQuery, Planilhas e Apresentações.
  • BigQuery: teste uma consulta diferente para o conjunto de dados de Shakespeare que interessa a você. Outra consulta de exemplo pode ser encontrada no app de exemplo do BigQuery no Apps Script original.
  • BigQuery: teste outros conjuntos de dados públicos do BigQuery para encontrar um que seja mais significativo para você.
  • BigQuery: mencionamos outras consultas que podem ser criadas com as obras de Shakespeare ou outras tabelas de dados públicos. Elas podem ser encontradas nesta página da Web e neste repositório do GitHub.
  • Planilhas: teste outros tipos de gráficos na Galeria de gráficos.
  • Planilhas e BigQuery: use seu próprio conjunto de dados de planilha grande. Em 2016, a equipe do BigQuery lançou um recurso para permitir que os desenvolvedores usassem uma planilha como fonte de dados. Para mais informações, acesse Integração do Google BigQuery com o Google Drive.
  • Slides: adicione outros slides à apresentação gerada, como imagens ou outros recursos vinculados à sua análise de dados de Big Data. Confira a documentação de referência do serviço integrado do Apresentações.
  • Google Workspace: use outros serviços do Google Workspace ou Google integrado no Apps Script. Por exemplo, Gmail, Agenda, Documentos, Drive, Maps, Analytics, YouTube etc., além de outros serviços avançados. Para mais informações, acesse a visão geral de referência dos serviços integrados e avançados.