Cuando tenemos información geográfica de forma que los humanos la entendemos, lo más común es tenerlas en forma de una dirección que lleva una calle, un número, código postal, etcétera. Pero hay veces en que por cualquier razón tenemos que ser más precisos, y para eso existe una forma más técnica de representar información geográfica, con coordenadas exactas de latitud y longitud. Utilizando el poder de las hojas de cálculo de Google y su integración con Google Maps, hoy veremos cómo hacer geocoding (geocodificación), o lo que es lo mismo, convertir direcciones en coordenadas de latitud y longitud.
Preparando nuestras direcciones
Lo primero es que tengamos nuestra lista de direcciones en la hoja de cálculo. En este ejemplo tendremos varios lugares de interés para visitar como turistas en la Ciudad de México, que también ya usamos previamente para crear un mapa con Google My Maps. También tendremos una columna para cada coordenada geográfica, una para guardar la latitud y otra para la longitud.
Configurando nuestro proyecto de Apps Script
A partir de ahora, vamos a tener que usar un poco de código de Apps Script para comunicarnos con Google Maps y pedirle que interprete estas direcciones.
Para eso, vamos al menú Extensiones – Apps Script
Lo siguiente que tenemos que hacer es crear mediante código un pequeño menú, que al seleccionar ejecute una función propia llamada geocodificar
. Por ahora reemplazaremos el código default por este, que hace justo lo que acabamos de decir:
var ss = SpreadsheetApp.getActiveSpreadsheet();
var sheet = ss.getActiveSheet();
var dataRangeAll = sheet.getDataRange();
var ultimaFila = dataRangeAll.getLastRow();
function onOpen() {
var ui = SpreadsheetApp.getUi();
ui.createMenu('Geocodificar')
.addItem('Convertir direcciones en coordenadas', 'geocodificar')
.addToUi();
}
// Geocodificar todas las filas con texto a partir de la 2da
function geocodificar() {
}
Lenguaje del código: JavaScript (javascript)
Geocodificar direcciones a coordenadas de latitud y longitud
Y ahora sí, lo que resta por hacer es recorrer todas las filas a partir de la segunda y utilizar el geocoder de Google Maps para enviarle las direcciones en texto, y del resultado que nos devuelva, extraer la parte que nos interesa, que es la latitud y la longitud.
// Geocodificar todas las filas a partir de la 2da
function geocodificar() {
var filaInicial = 2;
var dataRange = sheet.getRange(filaInicial, 1,ultimaFila, 3);
var data = dataRange.getValues();
// Recorremos todas las filas del rango
for(var i=0; i< data.length; i++) {
var fila = data[i];
var direccion = fila[0];
// Solamente haremos algo si hay algo en la celda de dirección,
// para no generar errores inesperados
if(direccion != "") {
// Aquí es donde nos conectamos con Google Maps
var geocoder = Maps.newGeocoder().geocode(direccion);
var resultado = geocoder.results[0];
var latitud = 0;
var longitud = 0;
// Si el geocoder de Google Maps nos devuelve un resultado satisfactorio,
// escribimos la latitud y longitud en las celdas correspondientes al a fila
if(resultado) {
latitud = resultado.geometry.location.lat;
longitud = resultado.geometry.location.lng;
sheet.getRange(filaInicial + i, 2).setValue(latitud);
sheet.getRange(filaInicial + i, 3).setValue(longitud);
}
}
}
}
Lenguaje del código: JavaScript (javascript)
Si vamos paso por paso, podemos fijarnos bien en que hay que asegurarnos de que nos devuelva un resultado correcto, por cada dirección que estemos evaluando.
Este sería el código completo, con todo y menú, por si venías solo a copiar y a pegar 😜
var ss = SpreadsheetApp.getActiveSpreadsheet();
var sheet = ss.getActiveSheet();
var dataRangeAll = sheet.getDataRange();
var ultimaFila = dataRangeAll.getLastRow();
function onOpen() {
var ui = SpreadsheetApp.getUi();
ui.createMenu('Geocodificar')
.addItem('Convertir direcciones en coordenadas', 'geocodificar')
.addToUi();
}
// Geocodificar todas las filas a partir de la 2da
function geocodificar() {
var filaInicial = 2;
var dataRange = sheet.getRange(filaInicial, 1,ultimaFila, 3);
var data = dataRange.getValues();
// Recorremos todas las filas del rango
for(var i=0; i< data.length; i++) {
var fila = data[i];
var direccion = fila[0];
// Solamente haremos algo si hay algo en la celda de dirección,
// para no generar errores inesperados
if(direccion != "") {
// Aquí es donde nos conectamos con Google Maps
var geocoder = Maps.newGeocoder().geocode(direccion);
var resultado = geocoder.results[0];
var latitud = 0;
var longitud = 0;
// Si el geocoder de Google Maps nos devuelve un resultado satisfactorio,
// escribimos la latitud y longitud en las celdas correspondientes al a fila
if(resultado) {
latitud = resultado.geometry.location.lat;
longitud = resultado.geometry.location.lng;
sheet.getRange(filaInicial + i, 2).setValue(latitud);
sheet.getRange(filaInicial + i, 3).setValue(longitud);
}
}
}
}
Lenguaje del código: JavaScript (javascript)
Probando el código de geocodificación
Bien, ahora solo queda guardar el código de nuestro proyecto, y damos click en el botón de Ejecutar una vez, para que nos pida los permisos correspondientes para poder escribir en la hoja de cálculo
Y permitimos al proyecto el acceso a los datos de nuestra propia hoja de cálculo:
Ahora, para ver el código en acción, regresamos a la pestaña de la hoja de cálculo y refrescamos la página para ver nuestro menú llamado ‘Geocodificar’:
Al ejecutarlo, veremos cómo se llenan las columnas de Latitud y Longitud a partir de las direcciones escritas:
Corroborando los datos en Google Maps
Los resultados que obtengamos dependerán de qué tan específicos hayamos sido con cada dirección escrita, porque a partir de una dirección con un nombre de calle muy común, Google Maps podría interpretar varios resultados en países o estados diferentes, pero solo te devolverá el más probable. Es decir, debes corroborar tus resultados.
Una forma sencilla de confirmar tus datos es simplemente copiando y pegando las coordenadas desde tu hoja de cálculo en Google Maps:
En la documentación oficial de Google puedes revisar más información sobre todo lo que se puede hacer con el resultado que devuelve Google Maps, ya que nosotros solo estamos usando la latitud y la longitud. También es importante que revises los límites diarios de uso de las peticiones de Maps, por si tienes muchas direcciones.
¡Y listo! Ahora ya sabes cómo convertir varias direcciones en coordenadas de latitud y longitud con hojas de cálculo de Google y Google Maps fácilmente.
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.
Hola. Gracias por compartir este artículo. Hice una prueba con 60 direcciones y funciona muy bien. Pero hice una prueba con 500 direcciones pero no funciona, El programa me recomienda usar Utilities.sleep(1000) pero se sobrepasa del tiempo de ejecución. Puedes ayudarme?
Hola Alvin, si se detiene cerca de las 1000 direcciones geocodificadas, puede ser que más bien estés llegando al límite diario que permite Google Maps para las cuentas personales de Google. Esos límites los encuentras acá: https://developers.google.com/apps-script/guides/services/quotas . Lo de Utilities.sleep(1000) es más bien para asegurar que ciertas operaciones no se harán antes de que el servidor tenga tiempo de responder. Puedes probarlo poniéndolo en alguna parte del ciclo for (detectando cuando llegas a 499 por ejemplo), pero no podría asegurar que eso resuelva el problema. Espero que te ayude 😀
hola, buenas tardes, me sale que las coordenadas no se puede convertir en DOUBLE
como se podría solucionar?
Hola amigo:
A)El codigo se ejecuta ,pero algunas tuplas (LATITUD,LONGITUD), las repite en otros domicilios diferentes que ni si quiera estan cerca.
B)Y para confirmar en el GoogleMaps si son correctas las coordenadas;en el GoogleMaps, cambian las tuplas segun el acercamiento con la lupa, o sea , al no saber a QUE ALTURA entrega tu codigo las tuplas, uno no puede chequear con presicion en el GoogleMaps.
Saludos.
Jorge desde Argentina
hola, con que crs quedan las coordenadas? Gracias de antemano
hola, y tendras algun scrip para integrear la APIKEY? ya tengo mi cuenta y metodo de facturacion y mi propia llave API pero no encuentro como invocarla
Muy agradecido. Funcionó a la perfección!… Copié y pegué :),
Hola Alekz, tienes alguna opción para hacer lo contrario, quiero obtener ciudad y estado en base a una lista de coordenadas.
Hola Eduardo, sí es posible, puedes encontrar la guía del proceso inverso aquí: https://tesel.mx/convertir-coordenadas-de-latitud-y-longitud-en-direcciones-con-google-sheets-y-google-maps-reverse-geocoding-8059/ . Espero que te ayude 😀
Buenas, tendrás algún tutorial para saber en que polígono se encuentra una coordenada, por ejemplo dibujo un polígono con cada barrio de una ciudad en maps y luego quiero saber en que barrio cae esa coordenada
Hola, yo ya tengo las coordenadas, no obstante el my maps me dice que hay un error. ¿Por qué podría suceder?
Porque no me aparece la función Geocodificar después de haber ejecutado el código?
Hola lo probe pero me da un error Error
TypeError: Cannot read properties of null (reading ‘getActiveSheet’) no se como se pudiera corregir