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:
- O app de exemplo do serviço BigQuery do Google Apps Script, que é de código aberto no GitHub.
- O app de exemplo apresentado no vídeo para desenvolvedores Como gerar slides de dados de planilha e publicado nesta postagem do blog.
- O app de exemplo apresentado no codelab da API Google Slides.
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?
Como você classificaria sua experiência com as ferramentas e APIs para desenvolvedores do Google Workspace?
Como você classificaria sua experiência com o Apps Script especificamente?
Como você classificaria sua experiência com as ferramentas e APIs para desenvolvedores do console do Cloud?
3. Visão geral
Agora que você já sabe sobre o que é este codelab, confira o que você vai fazer:
- Pegue um exemplo do Apps Script-BigQuery e faça com que ele funcione.
- Com o exemplo, aprenda a enviar uma consulta ao BigQuery e receber os resultados.
- Crie uma planilha Google e insira os resultados do BigQuery nela.
- Modifique o código para alterar um pouco os dados retornados e inseridos na planilha.
- Use o serviço Planilhas no Apps Script para criar um gráfico com os dados do BigQuery.
- Use o serviço Apresentações para criar uma apresentação Google.
- Adicione um título e um subtítulo ao slide de título padrão.
- Crie um slide com uma tabela de dados e exporte as células de dados da planilha para ele.
- 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 FetchouJDBCdo 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
- Para criar um projeto do Apps Script, acesse
script.google.come clique em Novo projeto. - 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.
- 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.
- 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.
- Clique em Menu
e acesse APIs e serviços > Tela de permissão OAuth (link direto). - Clique em Interno > Criar para criar um app para usuários do Google Workspace na sua organização.
- No campo Nome do app, insira "Codelab de Big Data".
- Insira os e-mails de contato nos campos Suporte ao usuário e Dados de contato do desenvolvedor.
- Clique em Salvar e continuar > Salvar e continuar.
- Clique em Mais
na barra de navegação e selecione Configurações do projeto (link direto). - 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.
- Mude para o editor de script do App Script e clique em Configurações do projeto
. - Em "Projeto do Google Cloud Platform (GCP)", clique em Mudar projeto.
- Digite o número do projeto e clique em Definir projeto.
- Em seguida, clique em Editor
para começar a adicionar o serviço avançado do BigQuery. - Ao lado de Serviços, clique em Adicionar um serviço
. - 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.
- 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.
- Clique em Ativar APIs e serviços.
- Pesquise "big query", selecione a API BigQuery (não a API Data Transfer) e clique em Ativar para ativar.

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
- 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());
}
- Clique em Salvar
.
- Ao lado de
Code.gs, clique em Mais
> Renomear. Mude o título de Code.gsparabq-sheets-slides.js. - 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.
- Mude para seu projeto do console do Cloud, clique em Mais
na barra de navegação e selecione Configurações do projeto. - Copie o valor listado em ID do projeto.
- Volte ao editor do Apps Script, localize a variável
PROJECT_IDembq-sheets-slides.jse adicione o valor. - Clique em Salvar
> Executar.
- Clique em Revisar permissões para continuar.
- 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.
- 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ávelQUERY_NAME, se a atualizou): - Abra a planilha para conferir as 10 palavras mais comuns e as contagens totais delas classificadas em ordem decrescente:

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
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:

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.
- No editor de script do Apps Script, adicione a função
createColumnChart()abq-sheets-slides.jsdepois derunQuery(). 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);
}
- A função
createColumnChart()exige um parâmetro de objeto de planilha. Por isso, precisamos atualizarrunQuery()para retornar um objetospreadsheetque possa ser transmitido paracreateColumnChart(). No final derunQuery(), retorne o objetospreadsheetdepois 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;
}
- Crie uma função
createBigQueryPresentation()para chamarrunQuery()ecreateColumnChart(). 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);
}
- 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 derunQuery()paracreateBigQueryPresentation(). 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:

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.
- No editor de script do Apps Script, adicione a função
createSlidePresentation()abq-sheets-slides.jsdepois decreateColumnChart(). 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');
- 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]));
}
}
- A etapa final em
createSlidePresentation()é adicionar mais um slide, importar o gráfico da planilha e retornar o objetoPresentation. 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;
}
- 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á ajustamosrunQuery()para retornar o objetoSpreadsheet, mas precisamos fazer uma mudança semelhante emcreateColumnChart()para que ele retorne um objeto de gráfico (EmbeddedChart). Volte acreateColumnChart()e adicione o seguinte snippet de código ao final da função:
// NEW: Return the chart object for later use.
return chart;
}
- 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) paracreateSlidePresentation(). Da mesma forma que o URL da nova planilha é registrado, também é possível registrar o URL da nova apresentação de slides. Atualize ocreateBigQueryPresentation()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
}
- 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. - 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:



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
- Repositório de código-fonte
- Vídeo e postagem do blog para desenvolvedores
- Sessão do Google Cloud NEXT ‘18
Documentação
- Site da documentação do Google Apps Script
- Apps Script: serviço de planilha
- Apps Script: serviço do Apresentações
- Apps Script: serviço avançado do BigQuery
Vídeos
- Mais um segredo do Google Apps Script
- Como acessar o Google Maps usando uma planilha
- Totalmente sem roteiro
- Google Workspace Developer Show (em inglês)
Notícias e atualizações
- Blog do Google Cloud Platform
- Blog de análise de dados do Google Cloud
- Blog do Google Developers
- Twitter: Google Developers (@googledevs)
- Blog para desenvolvedores do Google Workspace
- Twitter: Google Workspace Developers (@workspacedevs)
Outros codelabs
Básico
- [Google Planilhas] Conceitos básicos do Apps Script com o Google Planilhas
- [APIs REST] Usar o Google Workspace e as APIs do Google para acessar arquivos e pastas no Google Drive
Intermediário
- [Apps Script] Ferramenta de linha de comando CLASP do Apps Script
- [Apps Script] Complementos do Google Workspace para o Gmail
- [Apps Script] Bots personalizados para o Hangouts Chat
- [APIs REST] Usar o Google Planilhas como ferramenta de relatórios do aplicativo
- [APIs REST] Gerar apresentações Google usando a API BigQuery
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.