GSP240

Descripción general
Existen muchas herramientas que les permiten a los científicos de datos analizar macrodatos, pero ¿cuál de esas herramientas puede ayudarte a explicar y justificar tu análisis ante los directivos y las partes interesadas? Los números sin procesar, en papel o en una base de datos, difícilmente lo harán. Este lab de Google Apps Script usa dos plataformas para desarrolladores de Google: Workspace y Google Cloud, con el objetivo de ayudarte a completar ese proceso.
Con las herramientas para desarrolladores de Google Cloud, puedes recopilar y procesar tus datos, luego, generar una presentación de diapositivas y hojas de cálculo para impresionar a los directivos y a las partes interesadas con tu asombroso análisis y tus conclusiones reveladoras.
En este lab, se explican la API de BigQuery de Google Cloud (como un servicio avanzado de Apps Script) y los servicios integrados de Apps Script para Hojas de cálculo de Google y Presentaciones de Google.
Además, se establece una situación muy similar a la vida real. La app que se utiliza muestra algunas APIs y funciones de todo Google Cloud. El objetivo es demostrar cómo puedes aprovechar Google Cloud y Workspace para resolver problemas complejos para tu organización o tus clientes.
Aprendizajes esperados
- Cómo usar Google Apps Script con múltiples servicios de Google
- Cómo usar BigQuery para realizar un análisis de macrodatos
- Cómo crear una hoja de cálculo de Google y propagar datos en ella, y también cómo crear un gráfico con datos de esa hoja
- Cómo transferir el gráfico y los datos de la hoja de cálculo a diapositivas separadas de un documento de Presentaciones de Google
Configuración
Antes de hacer clic en el botón Comenzar lab
Lee estas instrucciones. Los labs cuentan con un temporizador que no se puede pausar. El temporizador, que comienza a funcionar cuando haces clic en Comenzar lab, indica por cuánto tiempo tendrás a tu disposición los recursos de Google Cloud.
Este lab práctico te permitirá realizar las actividades correspondientes en un entorno de nube real, no en uno de simulación o demostración. Para ello, se te proporcionan credenciales temporales nuevas que utilizarás para acceder a Google Cloud durante todo el lab.
Para completar este lab, necesitarás lo siguiente:
- Acceso a un navegador de Internet estándar. Se recomienda el navegador Chrome.
Nota: Usa una ventana del navegador privada o de incógnito (opción recomendada) para ejecutar el lab. Así evitarás conflictos entre tu cuenta personal y la cuenta de estudiante, lo que podría generar cargos adicionales en tu cuenta personal.
- Tiempo para completar el lab (recuerda que, una vez que comienzas un lab, no puedes pausarlo).
Nota: Usa solo la cuenta de estudiante para este lab. Si usas otra cuenta de Google Cloud, es posible que se apliquen cargos a esa cuenta.
Introducción
Google Apps Script y BigQuery
Google Apps Script es una plataforma de desarrollo de Workspace que funciona a un nivel superior que las APIs de REST de Google. Es un entorno de desarrollo y hosting de aplicaciones sin servidores que pueden usar desarrolladores con distintos niveles de habilidades. A modo de resumen, “Apps Script es un entorno de ejecución de JavaScript sin servidores para la integración, extensión y automatización de Workspace”.
Es un lenguaje JavaScript del lado del servidor, similar a Node.js, pero se enfoca en la integración estrecha con Workspace y otros servicios de Google, y no en el hosting de aplicaciones rápido, asíncrono y basado en eventos. También presenta un entorno de desarrollo que puede ser completamente diferente al que conoces. Con Apps Script, puedes realizar las siguientes acciones:
- Desarrollar en un editor de código basado en navegador, pero puedes elegir hacerlo localmente si usas clasp, la herramienta de implementación de línea de comandos para Apps Script
- Escribir código en una versión especializada de JavaScript, personalizada para acceder a Workspace y a otros servicios externos o de Google (con los servicios de URLfetch o Jdbc de Apps Script)
- Evitar escribir código de autorización, ya que Apps Script lo puede manejar
- Evitar alojar tu aplicación, ya que esta reside y se ejecuta en los servidores de Google en la nube
Nota: Para obtener más información sobre Apps Script, consulta la documentación oficial, que incluye una descripción general con guías de inicio rápido, instructivos y videos.
Apps Script interactúa con otras tecnologías de Google de dos maneras diferentes:
- Servicio integrado
- Servicio avanzado
Un servicio integrado proporciona métodos de alto nivel que puedes usar para acceder a datos de productos de Workspace o de Google, y también otros métodos convenientes de utilidad. Un servicio avanzado es simplemente un wrapper delgado en torno a una API de REST de Google o de Workspace. Los servicios avanzados proporcionan una cobertura completa de la API de REST y, a menudo, pueden hacer más que los servicios integrados, pero requieren un código más complejo (y, a su vez, son más fáciles de usar que la API de REST).
Los servicios avanzados también deben estar habilitados para un proyecto de secuencia de comandos antes de que se los pueda usar. Siempre que sea posible, se prefiere un servicio integrado, ya que es más fácil de usar y ejecuta más trabajo pesado que los servicios avanzados. Sin embargo, algunas APIs de Google no tienen servicios integrados, por lo que un servicio avanzado puede ser la única opción. BigQuery es un ejemplo de esto: no hay un servicio integrado disponible, pero sí existe un servicio avanzado de BigQuery (mejor que ningún servicio, ¿cierto?).
Nota: En caso de que no tengas experiencia en BigQuery, se trata de un servicio de Google Cloud que se usa para realizar consultas simples (o complejas) en grandes volúmenes de datos, por ejemplo, de varios terabytes, y proporcionar resultados en segundos, en lugar de horas o días.
Accede a Hojas de cálculo y Presentaciones de Google desde Apps Script
BigQuery solo está disponible como un servicio avanzado de Apps Script. Sin embargo, tanto Hojas de cálculo como Presentaciones de Google tienen servicios integrados de Apps Script, así como servicios avanzados, por ejemplo, para acceder a funciones que solo se encuentran en la API y que no están disponibles en la versión integrada. Siempre que sea posible, elige un servicio integrado en lugar de su equivalente avanzado, ya que el servicio integrado proporciona constructos de nivel superior y llamadas convenientes, lo que simplifica el desarrollo.
Nota: Para hacer una revisión antes de pasar al código, consulta el servicio de Hojas de cálculo y el servicio de Presentaciones.
Tarea 1. Consulta BigQuery y registra los resultados en un documento de Hojas de cálculo
Cubrirás gran parte del contenido de este lab cuando realices esta primera tarea. Luego de finalizar esta sección, estarás casi en la mitad del lab.
En esta sección, realizarás las siguientes tareas:
- Iniciar un nuevo proyecto de Google Apps Script
- Habilitar el acceso al servicio avanzado de BigQuery
- Ir al editor de desarrollo y, luego, ingresar el código fuente de la aplicación
- Realizar el proceso de autorización de la aplicación (OAuth2)
- Ejecutar la aplicación que envía una solicitud a BigQuery
- Ver un documento completamente nuevo de Hojas de cálculo de Google con los resultados de BigQuery
Crea un nuevo proyecto de Apps Script
- Crea un nuevo proyecto de Apps Script desde script.google.com. Para este lab, haz clic en el vínculo Crear una secuencia de comandos de Apps Script.

- Se abrirá el editor de código de Apps Script:

-
Haz clic en el nombre del proyecto de la parte superior (“Proyecto sin título” en la imagen de arriba) para asignar un nombre a tu proyecto.
-
En el diálogo Cambiar nombre del proyecto, asigna el nombre que quieras al proyecto (por ejemplo, “BigQuery”, “Hojas de cálculo”, “Demostración de Presentaciones”, etc.) y haz clic en Cambiar nombre.
Habilita el servicio avanzado de BigQuery
Habilita el servicio avanzado de BigQuery para tu proyecto nuevo y habilita la API de BigQuery.
- Haz clic en el ícono Agregar un servicio junto a Servicios.

- En el diálogo Agregar un servicio, selecciona los servicios y las APIs que correspondan.

- Ve a la consola de Cloud y selecciona el menú de navegación > APIs y servicios > Biblioteca.

- Escribe o pega API de BigQuery en el cuadro de búsqueda y selecciona la API de BigQuery.

- Haz clic en Habilitar para habilitar la API de BigQuery si es necesario.

-
Vuelve al proyecto. El diálogo Agregar un servicio debería seguir abierto.
-
Selecciona API de BigQuery y haz clic en Agregar para cerrarlo.

Ingresa y ejecuta el código de tu aplicación
Ya estás listo para ingresar el código de la aplicación, realizar el proceso de autorización y hacer funcionar la primera versión de esta aplicación.
- Copia el código del siguiente recuadro y pégalo por encima de lo que aparece en el editor de código:
/**
* Copyright 2018 Google LLC
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at apache.org/licenses/LICENSE-2.0.
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
// Filename for data results
var QUERY_NAME = "Most common words in all of Shakespeare's works";
// Replace this value with your Google Cloud API project ID
var PROJECT_ID = '<YOUR_PROJECT_ID>';
if (!PROJECT_ID) throw Error('Project ID is required in setup');
/**
* Runs a BigQuery query; puts results into Sheet. You must enable
* the BigQuery advanced service before you can run this code.
* @see http://developers.google.com/apps-script/advanced/bigquery#run_query
* @see http://github.com/gsuitedevs/apps-script-samples/blob/master/advanced/bigquery.gs
*
* @returns {Spreadsheet} Returns a spreadsheet with BigQuery results
* @see http://developers.google.com/apps-script/reference/spreadsheet/spreadsheet
*/
function runQuery() {
// Replace sample with your own BigQuery query.
var request = {
query:
'SELECT ' +
'LOWER(word) AS word, ' +
'SUM(word_count) AS count ' +
'FROM [bigquery-public-data:samples.shakespeare] ' +
'GROUP BY word ' +
'ORDER BY count ' +
'DESC LIMIT 10'
};
var queryResults = BigQuery.Jobs.query(request, PROJECT_ID);
var jobId = queryResults.jobReference.jobId;
// Wait for BQ job completion (with exponential backoff).
var sleepTimeMs = 500;
while (!queryResults.jobComplete) {
Utilities.sleep(sleepTimeMs);
sleepTimeMs *= 2;
queryResults = BigQuery.Jobs.getQueryResults(PROJECT_ID, jobId);
}
// Get all results from BigQuery.
var rows = queryResults.rows;
while (queryResults.pageToken) {
queryResults = BigQuery.Jobs.getQueryResults(PROJECT_ID, jobId, {
pageToken: queryResults.pageToken
});
rows = rows.concat(queryResults.rows);
}
// Return null if no data returned.
if (!rows) {
return Logger.log('No rows returned.');
}
// Create the new results spreadsheet.
var spreadsheet = SpreadsheetApp.create(QUERY_NAME);
var sheet = spreadsheet.getActiveSheet();
// Add headers to Sheet.
var headers = queryResults.schema.fields.map(function(field) {
return field.name.toUpperCase();
});
sheet.appendRow(headers);
// Append the results.
var data = new Array(rows.length);
for (var i = 0; i < rows.length; i++) {
var cols = rows[i].f;
data[i] = new Array(cols.length);
for (var j = 0; j < cols.length; j++) {
data[i][j] = cols[j].v;
}
}
// Start storing data in row 2, col 1
var START_ROW = 2; // skip header row
var START_COL = 1;
sheet.getRange(START_ROW, START_COL, rows.length, headers.length).setValues(data);
Logger.log('Results spreadsheet created: %s', spreadsheet.getUrl());
}
-
Para guardar el archivo que acabas de crear, haz clic en elícono Guardar proyecto de la barra de menú o presiona Ctrl + S.
-
Para cambiar el nombre del archivo, haz clic en los tres puntos junto a su nombre y selecciona Cambiar nombre.

- Cambia el nombre del archivo a bq-sheets-slides.gs y presiona Intro.
¿Qué hace este código? Sabemos que consultas a BigQuery y que escribes los resultados en un documento nuevo de Hojas de cálculo de Google, pero ¿qué representa esta consulta?
- Examina el código de consulta en la función
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
Esta consulta revisa las obras de Shakespeare, que forman parte del conjunto de datos públicos de BigQuery, y muestra las 10 palabras que aparecen con mayor frecuencia en todas sus obras, en orden descendente de popularidad. Para tener una idea de lo útil que es BigQuery, basta con imaginar lo tedioso que sería hacer esta tarea manualmente.
Ya falta poco. Se requiere un ID de proyecto válido para establecer la variable PROJECT_ID
en la parte superior de bq-sheets-slides.gs
.
- Reemplaza
<YOUR_PROJECT_ID>
por el ID del proyecto que se encuentra en el panel izquierdo.
A continuación, veremos un ejemplo del código con un ID de proyecto de muestra. El valor real de tu PROJECT_ID será diferente.
Código de ejemplo:
// Filename for data results
var QUERY_NAME = "Most common words in all of Shakespeare's works";
// Replace this value with your Google Cloud API project ID
var PROJECT_ID = '<YOUR_PROJECT_ID>';
if (!PROJECT_ID) throw Error('Project ID is required in setup');
Nota: En este fragmento de código, la sentencia if
sirve para evitar que la aplicación avance sin un ID de proyecto implementado.
Nota: Si el selector de menú está fijo y no funciona, vuelve a cargar la página.
-
Haz clic en la opción Ejecutar de la barra de menú para guardar el archivo y ejecutar tu código.
-
Luego, haz clic en Revisar permisos.
Nota: Si se produce el error Exception: Service BigQuery API has not been enabled for your Apps..
quita el servicio de la API de BigQuery y vuelve a agregarlo.
- En el diálogo Elegir una cuenta de qwiklabs.net, haz clic en tu Nombre de usuario y, luego, en Permitir.
Nota: Una vez que hayas autorizado la app, no necesitas repetir este proceso para cada ejecución. Cuando llegues a la sección “Coloca los datos de resultados en una presentación de diapositivas” más adelante en este lab, verás la pantalla de diálogo nuevamente. Ahí se te pedirá permiso de usuario para crear y administrar los documentos de Presentaciones de Google.
- Cuando se ejecuta la función, se abre un pequeño cuadro de mensaje en la parte superior.

El cuadro de mensaje desaparece una vez que finaliza la función. Si no lo ves, es probable que haya finalizado su ejecución.
- Ve a tu unidad de Google Drive y busca una nueva hoja de cálculo de Google con el nombre Most common words in all of Shakespeare's works, o bien con el nombre que le asignaste a la variable
QUERY_NAME
.

- Abre la hoja de cálculo. Deberías ver 10 filas de palabras y su conteo total en orden descendente.

Haz clic en Revisar mi progreso para verificar el objetivo.
Consultar BigQuery y registrar los resultados en un documento de Hojas de cálculo
Resumen
¿Qué acaba de suceder? Ejecutaste el código que consultó todas las obras de Shakespeare. No es una cantidad ENORME de datos, pero definitivamente es más texto del que puedes revisar por tu cuenta para examinar todas las palabras en todas las obras, llevar un conteo de esas palabras y clasificarlas en orden descendente. No solo le derivaste este trabajo a BigQuery, sino que también pudiste usar el servicio integrado en Apps Script para Hojas de cálculo de Google con el fin de organizar los datos y facilitar su utilización.
Siempre puedes probar la consulta en la consola de BigQuery antes de ejecutarla en Apps Script. La interfaz de usuario de BigQuery está disponible para los desarrolladores.
- Ve a la consola de Cloud y selecciona el menú de navegación > BigQuery.

- En el diálogo Te damos la bienvenida a BigQuery en la consola de Cloud, haz clic en LISTO.
Se abrirá la consola de BigQuery.
- Ingresa tu código en el editor de consultas y, luego, haz clic en Ejecutar:
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

Tarea 2. Crea un gráfico en Hojas de cálculo de Google
Vuelve al Editor de secuencias de comandos. Hasta ahora, codificaste una aplicación que consulta las obras de Shakespeare, las ordena y, luego, presenta los resultados en Hojas de cálculo. En el código, la función runQuery()
se comunica con BigQuery y envía sus resultados a un documento de Hojas de cálculo. Ahora agregarás código para crear un gráfico con los datos. En esta sección, crearás una nueva función llamada createColumnChart()
, que llama al método newChart()
de Hojas de cálculo para crear un gráfico con los datos.
La función createColumnChart()
recibe la hoja de cálculo con los datos y solicita un gráfico de columnas con todos los datos. El rango de datos comienza en la celda A2 debido a que la primera fila contiene los encabezados de las columnas, y no datos.
- Para crear el gráfico, agrega la función
createColumnChart()
a bq-sheets-slides.gs
justo después de runQuery()
(después de la última línea de código):
/**
* Uses spreadsheet data to create columnar chart.
* @param {Spreadsheet} Spreadsheet containing results data
* @returns {EmbeddedChart} visualizing the results
* @see http://developers.google.com/apps-script/reference/spreadsheet/embedded-chart
*/
function createColumnChart(spreadsheet) {
// Retrieve the populated (first and only) Sheet.
var sheet = spreadsheet.getSheets()[0];
// Data range in Sheet is from cell A2 to B11
var START_CELL = 'A2'; // skip header row
var END_CELL = 'B11';
// Place chart on Sheet starting on cell E5.
var START_ROW = 5; // row 5
var START_COL = 5; // col E
var OFFSET = 0;
// Create & place chart on the Sheet using above params.
var chart = sheet.newChart()
.setChartType(Charts.ChartType.COLUMN)
.addRange(sheet.getRange(START_CELL + ':' + END_CELL))
.setPosition(START_ROW, START_COL, OFFSET, OFFSET)
.build();
sheet.insertChart(chart);
}
-
Para devolver la hoja de cálculo, en el código anterior, createColumnChart()
necesita el objeto de la hoja de cálculo, por lo que debes modificar la app para que devuelva el objeto spreadsheet
y lo pase a createColumnChart()
. Luego de registrar la creación correcta de la hoja de cálculo de Google, devuelve el objeto al final de runQuery()
.
-
Reemplaza la última línea (la que comienza con Logger.log) por lo siguiente:
Logger.log('Results spreadsheet created: %s', spreadsheet.getUrl());
// Return the spreadsheet object for later use.
return spreadsheet;
}
- Acciona la función
createBigQueryPresentation()
: segregar de manera lógica la funcionalidad para crear gráficos de BigQuery es una gran idea. Crea la función createBigQueryPresentation()
para accionar la app llamando a esa función y a createColumnChart()
. El código que agregues debería verse así:
/**
* Runs a BigQuery query, adds data and a chart in a Sheet.
*/
function createBigQueryPresentation() {
var spreadsheet = runQuery();
createColumnChart(spreadsheet);
}
- Coloca la función
createBigQueryPresentation()
justo después del siguiente bloque de código:
// Filename for data results
var QUERY_NAME = "Most common words in all of Shakespeare's works";
// Replace this value with your Google Cloud API project ID
var PROJECT_ID = '<YOUR_PROJECT_ID>';
if (!PROJECT_ID) throw Error('Project ID is required in setup');
- Haz que el código se pueda reutilizar. Previamente realizaste 2 pasos importantes: devolviste el objeto de la hoja de cálculo y creaste una función de accionamiento. ¿Qué sucede si un colega quisiera reutilizar
runQuery()
y no quiere que se registre la URL?
Con el fin de que runQuery()
sea más accesible para un uso general, mueve la línea de registro. ¿Cuál es el mejor lugar donde colocarla? Si pensaste en createBigQueryPresentation()
, estás en lo correcto.
Después de mover la línea de registro, el código debería verse así:
/**
* Runs a BigQuery query, adds data and a chart in a Sheet.
*/
function createBigQueryPresentation() {
var spreadsheet = runQuery();
Logger.log('Results spreadsheet created: %s', spreadsheet.getUrl());
createColumnChart(spreadsheet);
}
Con los cambios anteriores, bq-sheets-slides.js
debería verse como el siguiente código (excepto en PROJECT_ID
):
/**
* Copyright 2018 Google LLC
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at apache.org/licenses/LICENSE-2.0.
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
// Filename for data results
var QUERY_NAME = "Most common words in all of Shakespeare's works";
// Replace this value with your Google Cloud API project ID
var PROJECT_ID = '<YOUR_PROJECT_ID>';
if (!PROJECT_ID) throw Error('Project ID is required in setup');
/**
* Runs a BigQuery query, adds data and a chart in a Sheet.
*/
function createBigQueryPresentation() {
var spreadsheet = runQuery();
Logger.log('Results spreadsheet created: %s', spreadsheet.getUrl());
createColumnChart(spreadsheet);
}
/**
* Runs a BigQuery query; puts results into Sheet. You must enable
* the BigQuery advanced service before you can run this code.
* @see http://developers.google.com/apps-script/advanced/bigquery#run_query
* @see http://github.com/gsuitedevs/apps-script-samples/blob/master/advanced/bigquery.gs
*
* @returns {Spreadsheet} Returns a spreadsheet with BigQuery results
* @see http://developers.google.com/apps-script/reference/spreadsheet/spreadsheet
*/
function runQuery() {
// Replace sample with your own BigQuery query.
var request = {
query:
'SELECT ' +
'LOWER(word) AS word, ' +
'SUM(word_count) AS count ' +
'FROM [bigquery-public-data:samples.shakespeare] ' +
'GROUP BY word ' +
'ORDER BY count ' +
'DESC LIMIT 10'
};
var queryResults = BigQuery.Jobs.query(request, PROJECT_ID);
var jobId = queryResults.jobReference.jobId;
// Wait for BQ job completion (with exponential backoff).
var sleepTimeMs = 500;
while (!queryResults.jobComplete) {
Utilities.sleep(sleepTimeMs);
sleepTimeMs *= 2;
queryResults = BigQuery.Jobs.getQueryResults(PROJECT_ID, jobId);
}
// Get all results from BigQuery.
var rows = queryResults.rows;
while (queryResults.pageToken) {
queryResults = BigQuery.Jobs.getQueryResults(PROJECT_ID, jobId, {
pageToken: queryResults.pageToken
});
rows = rows.concat(queryResults.rows);
}
// Return null if no data returned.
if (!rows) {
return Logger.log('No rows returned.');
}
// Create the new results spreadsheet.
var spreadsheet = SpreadsheetApp.create(QUERY_NAME);
var sheet = spreadsheet.getActiveSheet();
// Add headers to Sheet.
var headers = queryResults.schema.fields.map(function(field) {
return field.name.toUpperCase();
});
sheet.appendRow(headers);
// Append the results.
var data = new Array(rows.length);
for (var i = 0; i < rows.length; i++) {
var cols = rows[i].f;
data[i] = new Array(cols.length);
for (var j = 0; j < cols.length; j++) {
data[i][j] = cols[j].v;
}
}
// Start storing data in row 2, col 1
var START_ROW = 2; // skip header row
var START_COL = 1;
sheet.getRange(START_ROW, START_COL, rows.length, headers.length).setValues(data);
Logger.log('Results spreadsheet created: %s', spreadsheet.getUrl());
// Return the spreadsheet object for later use.
return spreadsheet;
}
/**
* Uses spreadsheet data to create columnar chart.
* @param {Spreadsheet} Spreadsheet containing results data
* @returns {EmbeddedChart} visualizing the results
* @see http://developers.google.com/apps-script/reference/spreadsheet/embedded-chart
*/
function createColumnChart(spreadsheet) {
// Retrieve the populated (first and only) Sheet.
var sheet = spreadsheet.getSheets()[0];
// Data range in Sheet is from cell A2 to B11
var START_CELL = 'A2'; // skip header row
var END_CELL = 'B11';
// Place chart on Sheet starting on cell E5.
var START_ROW = 5; // row 5
var START_COL = 5; // col E
var OFFSET = 0;
// Create & place chart on the Sheet using above params.
var chart = sheet.newChart()
.setChartType(Charts.ChartType.COLUMN)
.addRange(sheet.getRange(START_CELL + ':' + END_CELL))
.setPosition(START_ROW, START_COL, OFFSET, OFFSET)
.build();
sheet.insertChart(chart);
}
-
Guarda el archivo.
-
En la barra de menú, haz clic en runQuery y selecciona createBigQueryPresentation en el menú desplegable.
-
Luego, haz clic en Ejecutar.
Después de ejecutarlo, obtendrás otro documento de Hojas de cálculo de Google en tu unidad de Google Drive, pero esta vez aparecerá un gráfico junto a los datos en el documento:

Tarea 3. Coloca los datos de resultados en una presentación de diapositivas
La parte final del lab consiste en crear un documento nuevo de Presentaciones de Google, completar el título y el subtítulo en la primera diapositiva y, luego, agregar 2 nuevas diapositivas, una para cada una de las celdas de datos y otra para el gráfico.
- Crea una presentación de diapositivas, luego agrega un título y subtítulo en la primera diapositiva predeterminada que se genera en toda presentación nueva. Todo el trabajo en la presentación se realiza en la función
createSlidePresentation()
, que se agrega a bq-sheets-slides.gs
justo después del código de la función createColumnChart()
:
/**
* Create presentation with spreadsheet data & chart
* @param {Spreadsheet} Spreadsheet with results data
* @param {EmbeddedChart} Sheets chart to embed on slide
* @returns {Presentation} Slide deck with results
*/
function createSlidePresentation(spreadsheet, chart) {
// Create the new presentation.
var deck = SlidesApp.create(QUERY_NAME);
// Populate the title slide.
var [title, subtitle] = deck.getSlides()[0].getPageElements();
title.asShape().getText().setText(QUERY_NAME);
subtitle.asShape().getText().setText('via GCP and G Suite APIs:\n' +
'Google Apps Script, BigQuery, Sheets, Slides');
- Agrega una tabla de datos. El siguiente paso en
createSlidePresentation()
es importar los datos de las celdas de la hoja de cálculo de Google a la nueva presentación. Agrega este fragmento de código a la función createSlidePresentation()
:
// Data range to copy is from cell A1 to B11
var START_CELL = 'A1'; // include header row
var END_CELL = 'B11';
// Add the table slide and insert an empty table on it of
// the dimensions of the data range; fails if Sheet empty.
var tableSlide = deck.appendSlide(SlidesApp.PredefinedLayout.BLANK);
var sheetValues = spreadsheet.getSheets()[0].getRange(
START_CELL + ':' + END_CELL).getValues();
var table = tableSlide.insertTable(sheetValues.length, sheetValues[0].length);
// Populate the table with spreadsheet data.
for (var i = 0; i < sheetValues.length; i++) {
for (var j = 0; j < sheetValues[0].length; j++) {
table.getCell(i, j).getText().setText(String(sheetValues[i][j]));
}
}
- Importa el gráfico: el paso final en
createSlidePresentation()
es crear una diapositiva más, importar el gráfico desde nuestra hoja de cálculo y devolver el objeto Presentation
. Agrega este fragmento final a la siguiente función:
// 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;
}
- Devuelve el gráfico. Ahora que la función final está completa, vuelve a ver su firma. Sí,
createSlidePresentation()
requiere tanto una hoja de cálculo como un objeto de gráfico. Ya ajustaste runQuery()
para que devuelva el objeto Spreadsheet
, pero ahora necesitas hacer un cambio similar en createColumnChart()
de forma que devuelva el objeto de gráfico (EmbeddedChart
). Para hacerlo, vuelve a tu aplicación y agrega una última línea al final de createColumnChart()
:
// Return chart object for later use
return chart;
}
- Actualiza
createBigQueryPresentation()
. Dado que createColumnChart()
devuelve el gráfico, es necesario guardarlo en una variable y, luego, pasar a createSlidePresentation()
los dos elementos: la hoja de cálculo y el gráfico. Como ya registras la URL de la hoja de cálculo creada, también puedes registrar la URL de la nueva presentación de diapositivas. Reemplaza este bloque de código:
/**
* Runs a BigQuery query, adds data and a chart in a Sheet.
*/
function createBigQueryPresentation() {
var spreadsheet = runQuery();
Logger.log('Results spreadsheet created: %s', spreadsheet.getUrl());
createColumnChart(spreadsheet);
}
Con este bloque:
/**
* Runs a BigQuery query, adds data and a chart in a Sheet,
* and adds the data and chart to a new slide presentation.
*/
function createBigQueryPresentation() {
var spreadsheet = runQuery();
Logger.log('Results spreadsheet created: %s', spreadsheet.getUrl());
var chart = createColumnChart(spreadsheet);
var deck = createSlidePresentation(spreadsheet, chart);
Logger.log('Results slide deck created: %s', deck.getUrl());
}
Luego de todas las actualizaciones, tu bq-sheets-slides.gs
debería verse de la siguiente manera, excepto por el PROJECT_ID
:
bq-sheets-slides.gs - final version
// Filename for data results
var QUERY_NAME = "Most common words in all of Shakespeare's works";
// Replace this value with your Google Cloud API project ID
var PROJECT_ID = '<YOUR_PROJECT_ID>';
if (!PROJECT_ID) throw Error('Project ID is required in setup');
/**
* Runs a BigQuery query; puts results into Sheet. You must enable
* the BigQuery advanced service before you can run this code.
* @see http://developers.google.com/apps-script/advanced/bigquery#run_query
* @see http://github.com/gsuitedevs/apps-script-samples/blob/master/advanced/bigquery.gs
*
* @returns {Spreadsheet} Returns a spreadsheet with BigQuery results
* @see http://developers.google.com/apps-script/reference/spreadsheet/spreadsheet
*/
function runQuery() {
// Replace sample with your own BigQuery query.
var request = {
query:
'SELECT ' +
'LOWER(word) AS word, ' +
'SUM(word_count) AS count ' +
'FROM [bigquery-public-data:samples.shakespeare] ' +
'GROUP BY word ' +
'ORDER BY count ' +
'DESC LIMIT 10'
};
var queryResults = BigQuery.Jobs.query(request, PROJECT_ID);
var jobId = queryResults.jobReference.jobId;
// Wait for BQ job completion (with exponential backoff).
var sleepTimeMs = 500;
while (!queryResults.jobComplete) {
Utilities.sleep(sleepTimeMs);
sleepTimeMs *= 2;
queryResults = BigQuery.Jobs.getQueryResults(PROJECT_ID, jobId);
}
// Get all results from BigQuery.
var rows = queryResults.rows;
while (queryResults.pageToken) {
queryResults = BigQuery.Jobs.getQueryResults(PROJECT_ID, jobId, {
pageToken: queryResults.pageToken
});
rows = rows.concat(queryResults.rows);
}
// Return null if no data returned.
if (!rows) {
return Logger.log('No rows returned.');
}
// Create the new results spreadsheet.
var spreadsheet = SpreadsheetApp.create(QUERY_NAME);
var sheet = spreadsheet.getActiveSheet();
// Add headers to Sheet.
var headers = queryResults.schema.fields.map(function(field) {
return field.name.toUpperCase();
});
sheet.appendRow(headers);
// Append the results.
var data = new Array(rows.length);
for (var i = 0; i < rows.length; i++) {
var cols = rows[i].f;
data[i] = new Array(cols.length);
for (var j = 0; j < cols.length; j++) {
data[i][j] = cols[j].v;
}
}
// Start storing data in row 2, col 1
var START_ROW = 2; // skip header row
var START_COL = 1;
sheet.getRange(START_ROW, START_COL, rows.length, headers.length).setValues(data);
// Return the spreadsheet object for later use.
return spreadsheet;
}
/**
* Uses spreadsheet data to create columnar chart.
* @param {Spreadsheet} Spreadsheet containing results data
* @returns {EmbeddedChart} visualizing the results
* @see http://developers.google.com/apps-script/reference/spreadsheet/embedded-chart
*/
function createColumnChart(spreadsheet) {
// Retrieve the populated (first and only) Sheet.
var sheet = spreadsheet.getSheets()[0];
// Data range in Sheet is from cell A2 to B11
var START_CELL = 'A2'; // skip header row
var END_CELL = 'B11';
// Place chart on Sheet starting on cell E5.
var START_ROW = 5; // row 5
var START_COL = 5; // col E
var OFFSET = 0;
// Create & place chart on the Sheet using above params.
var chart = sheet.newChart()
.setChartType(Charts.ChartType.COLUMN)
.addRange(sheet.getRange(START_CELL + ':' + END_CELL))
.setPosition(START_ROW, START_COL, OFFSET, OFFSET)
.build();
sheet.insertChart(chart);
// Return the chart object for later use.
return chart;
}
/**
* Create presentation with spreadsheet data & chart
* @param {Spreadsheet} Spreadsheet with results data
* @param {EmbeddedChart} Sheets chart to embed on slide
* @returns {Presentation} Returns a slide deck with results
* @see http://developers.google.com/apps-script/reference/slides/presentation
*/
function createSlidePresentation(spreadsheet, chart) {
// Create the new presentation.
var deck = SlidesApp.create(QUERY_NAME);
// Populate the title slide.
var [title, subtitle] = deck.getSlides()[0].getPageElements();
title.asShape().getText().setText(QUERY_NAME);
subtitle.asShape().getText().setText('via GCP and G Suite APIs:\n' +
'Google Apps Script, BigQuery, Sheets, Slides');
// Data range to copy is from cell A1 to B11
var START_CELL = 'A1'; // include header row
var END_CELL = 'B11';
// Add the table slide and insert an empty table on it of
// the dimensions of the data range; fails if Sheet empty.
var tableSlide = deck.appendSlide(SlidesApp.PredefinedLayout.BLANK);
var sheetValues = spreadsheet.getSheets()[0].getRange(
START_CELL + ':' + END_CELL).getValues();
var table = tableSlide.insertTable(sheetValues.length, sheetValues[0].length);
// Populate the table with spreadsheet data.
for (var i = 0; i < sheetValues.length; i++) {
for (var j = 0; j < sheetValues[0].length; j++) {
table.getCell(i, j).getText().setText(String(sheetValues[i][j]));
}
}
// Add a chart slide and insert the chart on it.
var chartSlide = deck.appendSlide(SlidesApp.PredefinedLayout.BLANK);
chartSlide.insertSheetsChart(chart);
// Return the presentation object for later use.
return deck;
}
/**
* Runs a BigQuery query, adds data and a chart in a Sheet,
* and adds the data and chart to a new slide presentation.
*/
function createBigQueryPresentation() {
var spreadsheet = runQuery();
Logger.log('Results spreadsheet created: %s', spreadsheet.getUrl());
var chart = createColumnChart(spreadsheet);
var deck = createSlidePresentation(spreadsheet, chart);
Logger.log('Results slide deck created: %s', deck.getUrl());
}
- Guarda y ejecuta
createBigQueryPresentation()
nuevamente. Antes de que se ejecute, se te solicitará un conjunto más de permisos para ver y administrar tus documentos de Presentaciones de Google.
- Ve a Mi unidad y observa que, además del documento de Hojas de cálculo que se creó, también deberías ver un nuevo documento de Presentaciones con 3 diapositivas (título, tabla de datos, gráfico de datos), como se muestra a continuación:



¡Felicitaciones!
Creaste una aplicación que aprovecha varias funciones de Google Cloud, ya que realiza una solicitud de BigQuery que consulta uno de sus conjuntos de datos públicos, crea una nueva hoja de cálculo de Google para almacenar los resultados, agrega un gráfico basado en los datos obtenidos y, por último, crea un documento de Presentaciones de Google con los resultados, así como un gráfico en la hoja de cálculo.
Técnicamente, eso es lo que hiciste. En términos generales, pasaste de un análisis de macrodatos a algo que puedes presentar a las partes interesadas, todo en código, todo automatizado. Ahora puedes partir desde este lab y personalizarlo para tus propios proyectos.
Próximos pasos y más información
El código que se muestra en este lab también está disponible en GitHub. El objetivo de este lab es mantenerse sincronizado con el repo. Aquí, encontrarás recursos adicionales que te ayudarán a analizar en profundidad el material que vimos en este lab y a explorar otras formas de acceder a las herramientas para desarrolladores de Google de manera programática.
Documentación
Videos relacionados y generales
Noticias y actualizaciones relacionadas y generales
Actualización más reciente del manual: 4 de noviembre de 2024
Prueba más reciente del lab: 4 de noviembre de 2024
Copyright 2025 Google LLC. All rights reserved. Google y el logotipo de Google son marcas de Google LLC. Los demás nombres de productos y empresas pueden ser marcas de las respectivas empresas a las que estén asociados.