Muchas veces tenemos coordenadas o direcciones en nuestra hoja de cálculo, y nos gustaría verlas representadas en el mapa. Tal vez nos iremos de vacaciones o tenemos información logística sobre algunos puntos, y no queremos tener que estar copiando y pegando en Google Maps solo para verlas. Pues bien, hoy aprenderemos a crear un panel dentro de nuestra hoja que mostrará un mapa con la información de los puntos geográficos que queramos, ya sea una sola ubicación o una ruta con direcciones.
Preparando nuestros datos
Primero, como siempre, vamos a crear nuestra hoja con varias direcciones disponibles en formato adecuado para luego trabajar los datos. Nuestro primer objetivo será mostrar cualquiera de estos puntos en el mapa, por ejemplo, el que elijamos seleccionando una celda. Después, mostraremos todos los puntos en el orden en el que se ven como una ruta secuencial.
Mostrar direcciones con un mapa de Google Maps incrustado en una página
Entonces, vamos a intentar mostrar un punto en un mapa de Google Maps. Para lograr esto, necesitamos usar el panel lateral e incrustar ahí el código HTML de un mapa. Si queremos hacerlo de la forma oficial, Google nos dice que requerimos crear una API key e inscribirnos en Google Cloud Platform, pero hay un método no oficial que nos permite simplemente usar los mapas libremente sin API key si codificamos las direcciones dentro de una URL de una forma particular. Este método es el que usaremos para nuestro ejemplo.
Este código que te muestro aquí corresponde al código HTML necesario para incrustar un mapa en cualquier página web.
<iframe
width="290"
height="500"
frameborder="0" style="border:0"
referrerpolicy="no-referrer-when-downgrade"
src="https://maps.google.com/maps?q=DIRECCION&saddr=DIRECCION_INICIO&daddr=DIRECCION_DESTINO+to:DIRECCION_DESTINO_ADICIONAL+to:DIRECCION_DESTINO_ADICIONAL&t=h&output=embed"
allowfullscreen>
</iframe>
Lenguaje del código: HTML, XML (xml)
Fíjate especialmente en la URL que usaremos como fuente del iframe. Tiene algunos parámetros que debemos explicar: https://maps.google.com/maps?q=DIRECCION&saddr=DIRECCION_INICIO&daddr=DIRECCION_DESTINO+to:DIRECCION_DESTINO_ADICIONAL+to:DIRECCION_DESTINO_ADICIONAL&t=h&output=embed
q
es la dirección principal a mostrar. Este parámetro es obligatorio.output
indica qué tipo de salida debe regresar Google Maps. Para nuestro caso el valor siempre seráembed
. Este parámetro también es obligatorio.saddr
es la dirección inicial si vamos a pintar una ruta. Este parámetro y los siguientes son opcionales.daddr
es la direccón de destino si vamos a pintar una ruta.+to:
solo lo usamos si tenemos más destinos para pintar en la ruta, y deben estar dentro del parámetro daddrt
indica qué tipo de mapa queremos. Las opciones que se pueden usar son:m
para mapa normal oh
para híbrido (osea normal con vista de terreno al mismo tiempo).
Hay más parámetros disponibles, pero la realidad es que no están muy bien documentados para este método. Aquí puedes encontrar algo más de información al respecto.
Tal vez te preguntes ¿por qué nos estamos complicando? Si vamos al sitio oficial de Google Maps es muy fácil obtener un código para incrustar el mapa, pero eso supone ingresar las direcciones manualmente y nosotros lo que queremos es hacerlo programáticamente a partir de cualquier valor de nuestra hoja de cálculo. Sigamos entonces 😉
Mostrar un mapa de Google Maps dentro de Google Sheets
Bien, ahora que ya entendimos la parte del embed con un iframe de Google Maps, pasemos a crear la funcionalidad que permite mostrar ese código con una dirección de nuestra hoja de cálculo.
Lo que haremos será tomar el valor de una celda seleccionada y pasarle esa información al código de Apps Script para que muestre un mapa con la misma en el panel lateral derecho.
Entonces, vamos al menú Extensiones – Apps Script y reemplazamos el código inicial por este otro:
function onOpen() {
SpreadsheetApp.getUi()
.createMenu("Mapas")
.addItem("Mostrar mapa de dirección seleccionada", "mostrar_panel_seleccionada")
.addItem("Mostrar mapa de ruta", "mostrar_panel_ruta")
.addToUi();
}
function mostrar_panel_seleccionada() {
var direccion = SpreadsheetApp.getActiveSheet().getCurrentCell().getValue();
var direcciones = Array();
if(direccion != "") {
direcciones.push(direccion);
}
var html = embed_mapa_html(direcciones);
// Mostramos el panel de la derecha e insertamos código HTML
SpreadsheetApp.getUi().showSidebar(HtmlService.createHtmlOutput(html).setTitle("Mapa"));
}
function mostrar_panel_ruta() {
var sheet = SpreadsheetApp.getActiveSheet();
var fila_inicial = 2; // Fila 2
var columna = 1; // Columna A
var ultima_fila = sheet.getLastRow() - 1;
var range = sheet.getRange(fila_inicial, columna, ultima_fila);
// Se regresan como Array() entonces hay que sacarlos para solo tener los valores de string
var direcciones = range.getValues().map(([dir]) => (dir));
var html = embed_mapa_html(direcciones);
// Mostramos el panel de la derecha e insertamos código HTML
SpreadsheetApp.getUi().showSidebar(HtmlService.createHtmlOutput(html).setTitle("Mapa"));
}
function embed_mapa_html(direcciones) {
// Codificamos las direcciones para el formato de URL
direcciones = direcciones.map(dir => (encodeURIComponent(dir)));
var parametros_url = "";
// Para un solo punto
if(direcciones.length === 1) {
parametros_url = `q=${direcciones[0]}`;
} else if(direcciones.length > 1) {
// Para dos puntos, mostrar la ruta entre ambos
parametros_url = `q=${direcciones[0]}&saddr=${direcciones[0]}&daddr=${direcciones[1]}`;
// Para más de dos, mostrar los siguientes con +to:
if (direcciones.length > 2) {
direcciones.forEach((direccion, index) => {
parametros_url += index > 1 ? `+to:${direccion}` : '';
});
}
}
var embed_url = `https://maps.google.com/maps?${parametros_url}&t=h&output=embed`;
var html = `
<!DOCTYPE html>
<html>
<head>
<base target="_top">
</head>
<body>
<iframe
width="290"
height="500"
frameborder="0" style="border:0"
referrerpolicy="no-referrer-when-downgrade"
src="${embed_url}"
allowfullscreen></iframe>
</body>
</html>
`;
return html;
}
Lenguaje del código: JavaScript (javascript)
Se ve un poco largo, pero no te preocupes, en realidad es sencillo, vamos a explicarlo por partes. 😃
Primero tenemos, como siempre, la función onOpen
, desde la cual creamos un menú para manejar las opciones que necesitamos: Mostrar la dirección seleccionada y Mostrar mapa de ruta, cada una asociada a su función correspondiente en el código.
function onOpen() {
SpreadsheetApp.getUi()
.createMenu("Mapas")
.addItem("Mostrar mapa de dirección seleccionada", "mostrar_panel_seleccionada")
.addItem("Mostrar mapa de ruta", "mostrar_panel_ruta")
.addToUi();
}
Lenguaje del código: JavaScript (javascript)
Comencemos por la funcionalidad de mostrar una dirección seleccionada en la hoja. En la función mostrar_panel_seleccionada()
, primero obtenemos el valor de la celda que estemos enfocando explícitamente. Después, creamos un arreglo de direcciones e insertamos la dirección que obtuvimos de la hoja en el mismo. Ese arreglo se lo damos a la función embed_mapa_html, será la encargada de construir el código HTML del mapa. Por último abrimos el sidebar o panel lateral y le damos este código html para mostrar.
function mostrar_panel_seleccionada() {
var direccion = SpreadsheetApp.getActiveSheet().getCurrentCell().getValue();
var direcciones = Array();
if(direccion != "") {
direcciones.push(direccion);
}
var html = embed_mapa_html(direcciones);
// Mostramos el panel de la derecha e insertamos código HTML
SpreadsheetApp.getUi().showSidebar(HtmlService.createHtmlOutput(html).setTitle("Mapa"));
}
Lenguaje del código: JavaScript (javascript)
Ahora vamos a analizar la función de embed_mapa_html
. Lo que hacemos primero aquí es convertir el texto de las direcciones a un formato seguro para una URL con encodeURIComponent
. Tal vez lo recordarás de cuando hemos tratado códigos QR, pues usan URLs y necesitan este tratamiento para que no entren caracteres no deseados. Luego vamos a construir la URL correcta que contiene los parámetros que Google Maps utilizará a partir de las direcciones que le pasemos. Si solo es una dirección como en el caso que estamos revisando, no hay más que usar el parámetro q
con el primer elemento del arreglo. Si es más de una, agregamos los parámetros necesarios para convertir el mapa en una ruta. Ojo aquí, porque si son más de dos, las siguientes ubicaciones a mapear deben tener el formato de +to:
.
function embed_mapa_html(direcciones) {
// Codificamos las direcciones para el formato de URL
direcciones = direcciones.map(dir => (encodeURIComponent(dir)));
var parametros_url = "";
// Para un solo punto
if(direcciones.length === 1) {
parametros_url = `q=${direcciones[0]}`;
} else if(direcciones.length > 1) {
// Para dos puntos, mostrar la ruta entre ambos
parametros_url = `q=${direcciones[0]}&saddr=${direcciones[0]}&daddr=${direcciones[1]}`;
// Para más de dos, mostrar los siguientes con +to:
if (direcciones.length > 2) {
direcciones.forEach((direccion, index) => {
parametros_url += index > 1 ? `+to:${direccion}` : '';
});
}
}
var embed_url = `https://maps.google.com/maps?${parametros_url}&t=h&output=embed`;
var html = `
<!DOCTYPE html>
<html>
<head>
<base target="_top">
</head>
<body>
<iframe
width="290"
height="500"
frameborder="0" style="border:0"
referrerpolicy="no-referrer-when-downgrade"
src="${embed_url}"
allowfullscreen></iframe>
</body>
</html>
`;
return html;
}
Lenguaje del código: JavaScript (javascript)
Finalmente creamos esta URL con los parámetros listos como ya los habíamos explicado. Luego simplemente lo insertamos en el código HTML y nuestra función está lista.
Si guardamos nuestro código y ejecutamos la función onOpen
desde aquí mismo, nos pedirá los permisos de siempre.
Los autorizamos y ejecutamos la función de nuevo. Eso debe hacer que aparezca nuestro menú personalizado en la hoja. Si usamos este menú con alguna ubicación que seleccionemos y la opción de Mostrar mapa de dirección seleccionada, debemos ver cómo se abre el panel lateral con el mapa listo para ver y manipular. ¿Genial, no? 😉
Mostrar un mapa con una ruta de Google Maps dentro de Google Sheets
Por último, vamos a revisar el segundo objetivo que teníamos, que nuestro código ya cubre. Con la función de mostrar_panel_ruta() lo único que nos queda por hacer es tomar las direcciones del rango que necesitemos. En este caso las direcciones aparecerán comenzando por la fila 2 y la columna A (osea la columna 1), y con la función getLastRow obtenemos la última con datos. Si tus direcciones están en otro rango, deberás ajustar esta parte del código como corresponda. Fíjate cómo estamos creando el mismo arreglo de direcciones y dándoselo a la misma función de antes, que ya prevee todos los casos que teníamos contemplados.
function mostrar_panel_ruta() {
var sheet = SpreadsheetApp.getActiveSheet();
var fila_inicial = 2; // Fila 2
var columna = 1; // Columna A
var ultima_fila = sheet.getLastRow() - 1;
var range = sheet.getRange(fila_inicial, columna, ultima_fila);
// Se regresan como Array() entonces hay que sacarlos para solo tener los valores de string
var direcciones = range.getValues().map(([dir]) => (dir));
var html = embed_mapa_html(direcciones);
// Mostramos el panel de la derecha e insertamos código HTML
SpreadsheetApp.getUi().showSidebar(HtmlService.createHtmlOutput(html).setTitle("Mapa"));
}
Lenguaje del código: JavaScript (javascript)
Vamos a demostrarlo usando la otra opción del menú que preparamos, que se llama Mostrar mapa de ruta.
Y como por arte de magia, vemos la ruta en nuestro panel lateral, sin tener que salir de la hoja de cálculo ni escribir las direcciones manualmente. Yo creo que esto puede ser muy útil para muchas situaciones. ¿Qué opinas? 😏
Limitaciones y consideraciones para incrustar un mapa
Ahora, este método sí tiene sus limitaciones. Por ejemplo, mapear más de aproximadamente 20 direcciones puede causar que el mapa deje de funcionar, porque la URL final se hará muy grande y Google Maps mismo no soporta rutas tan largas usando solamente el iframe. Como siempre, te recomiendo estudiar la documentación oficial si necesitas consultar más información.
¡Y listo! Ahora ya sabes cómo incrustar un mapa de Google Maps dentro de Google Sheets usando nada más que Apps Script y un poco de ingenio.
Plantilla terminada para descargar
Guía en video
Si tienes dudas puedes ver esta misma guía explicada en video
¡Espero que te haya sido útil esta guía! No olvides seguirnos en YouTube para más tips, trucos y guías de productividad.
Alekz es un apasionado de la tecnología y los videojuegos. Además de ser locutor comercial, disfruta de la expresión artística más sastisfactoria y técnica que existe: programar (y pintar algo de pixel art). Fundó Tesel para ayudar a empoderar a las empresas a desarrollar su máximo potencial mediante la tecnología. Es un absoluto nerd de Star Trek.
Alekz es un apasionado de la tecnología y los videojuegos. Además de ser locutor comercial, disfruta de la expresión artística más sastisfactoria y técnica que existe: programar (y pintar algo de pixel art). Fundó Tesel para ayudar a empoderar a las empresas a desarrollar su máximo potencial mediante la tecnología. Es un absoluto nerd de Star Trek.