El calendario de Google es una de las aplicaciones más útiles para programar y recordar eventos en el futuro. Agregar un evento es realmente muy sencillo: simplemente elegimos una fecha, escribimos el título y tal vez la ubicación y terminamos. Pero… ¿y si quisiéramos agregar 100 o 1000? Ahí es donde una hoja de cálculo de Google Sheets nos puede ayudar. Hoy veremos cómo usar Google Sheets para insertar varios eventos a un calendario de Google rápidamente.
Preparar los datos
Como siempre, tenemos que empezar con datos en el formato correcto. Imagínate que tenemos información de varios conciertos a los que asistiremos, y queremos agregarlos al calendario todos al mismo tiempo. Tenemos varias columnas que usaremos para crear nuestros eventos: Título, Fecha de inicio y Fecha de fin, Ubicación, Información adicional, Invitados, el identificador del calendario, la URL del evento y el identifcador del evento.
Vamos a explicar un poco algunas de estas para no tener errores después. Las fechas de inicio y de fin deben ser fechas. Esto suena obvio, pero hay que fijarnos si en realidad sí son fechas reconocidas por Sheets o es nada más texto. Esto lo podemos comprobar fácilmente dando doble click sobre la celda, si nos aparece un calendario, es una fecha, pero si solo nos pone a editar el texto, entonces no es y hay que darle el formato adecuado. Mi recomendación es usar un formato estándar y si necesitas incluir la hora, usar el formato de 24 horas. Otro detalle a tomar en cuenta en este paso es que se tomará la zona horaria de la configuración de tu documento para todas las horas.
La ubicación, la información adicional y los invitados son opcionales, pero si sí incluyes a los invitados, asegúrate que estén en una lista de correos válidos separados por comas.
correo1@ejemplo.com, correo2@ejemplo.com
El identificador del calendario corresponderá a un calendario específico al que tengamos acceso y permiso para modificar. Por ejemplo, yo he creado este calendario llamado ‘Conciertos’. Para obtener su identificador, debemos estar en la interfaz de escritorio de Google Calendar, y dar click en los 3 puntos del calendario que quieras para mostrar las opciones y elegir Config. y uso compartido. En esta sección de configuración, vamos a elegir la opción de Integrar calendario o simplmente nos desplazamos hacia abajo hasta encontrarla. Aquí encontraremos el ID del calendario que buscamos, entonces solo lo copiamos y lo pegamos en nuestra hoja de cálculo en donde corresponda. Con este método, puedes usar diferentes calendarios para diferentes eventos.
Por ahora la URL y el ID evento se quedarán vacíos, porque no existen los eventos todavía, y los usaremos como parámetros para saber cuando un evento ya se creó y no duplicarlos si ejecutamos nuestro proceso dos veces si quisiéramos agregar eventos después.
Código para agregar eventos a un calendario de Google Calendar con Google Sheets
Muy bien, ahora que ya tenemos nuestros datos listos. Vamos a usar la integración que tiene Google Sheets con Apps Script para insertar estos eventos en el calendario. Usaremos un poco de código, pero no te asustes, no será mucho ni muy complicado y lo explicaremos todo.
Entonces, en nuestra hoja de cálculo vamos al menú Extensiones – Apps Script y pegamos este código en vez del que está puesto por default:
function onOpen() {
var ui = SpreadsheetApp.getUi();
ui.createMenu('Calendario')
.addItem('Agregar eventos a calendario', 'agregar_eventos')
.addToUi();
}
function agregar_eventos() {
var sheet = SpreadsheetApp.getActiveSheet();
var fila_inicial = 2;
var columna_inicial = 1;
var columna_url_evento = 8;
var columna_id_evento = 9;
var ultima_fila = sheet.getLastRow() - 1;
// El rango con la información necesaria:
// desde A2 (columna Nombre) hasta la última fila con datos,
// abarcando 9 columnas
var range = sheet.getRange(fila_inicial, columna_inicial, ultima_fila, columna_id_evento);
// Mapeamos los valores a un arreglo de objetos con sus propiedades correspondientes
var datos = range.getValues().map(
([titulo, fecha_inicio, fecha_fin, ubicacion, info_adicional, invitados, id_calendario, url_evento, id_evento]) =>
({titulo, fecha_inicio, fecha_fin, ubicacion, info_adicional, invitados, id_calendario, url_evento, id_evento})
);
// Para cada elemento de la lista de datos agregamos un evento
datos.forEach((dato,index) => {
// Solamente procesamos las filas que no tengan ya información de id de evento
// Y que tengan título, fecha de inicio y fecha de fin
if(dato.id_evento == "" && dato.titulo != "" && dato.fecha_inicio != "" && dato.fecha_fin != "") {
var fecha_inicio = new Date(dato.fecha_inicio);
var fecha_fin = new Date(dato.fecha_fin);
// Creamos el evento createEvent(title, startTime, endTime, options)
var evento = CalendarApp.getCalendarById(dato.id_calendario).createEvent(
dato.titulo,
fecha_inicio,
fecha_fin,
{
location: dato.ubicacion,
description: dato.info_adicional,
guests: dato.invitados
}
)
// Construimos la URL del evento a partir de los IDs de evento y calendario
var evento_url = "https://calendar.google.com/r/eventedit/" + Utilities.base64Encode(evento.getId().split('@')[0] + " " + dato.id_calendario).replace("==",'');
// Escribimos en la hoja la confirmación de la creación
// en la columna de URL evento y ID evento
sheet.getRange(fila_inicial + index, columna_url_evento).setValue(evento_url);
sheet.getRange(fila_inicial + index, columna_id_evento).setValue(evento.getId());
// Recomendado por Google para obligar a la hoja a actualizarse
SpreadsheetApp.flush();
}
})
}
Lenguaje del código: JavaScript (javascript)
Vamos a explicarlo un poco.
Lo primero que hacemos es nuestra usual función de onOpen para crear un menú en la hoja desde donde podamos ejecutar el código fácilmente. Y hacemos referencia a la función agregar_eventos.
function onOpen() {
var ui = SpreadsheetApp.getUi();
ui.createMenu('Calendario')
.addItem('Agregar eventos a calendario', 'agregar_eventos')
.addToUi();
}
Lenguaje del código: JavaScript (javascript)
Luego, en la función agregar_eventos creamos algunas variables necesarias para obtener los rangos de la hoja, como son la fila inicial donde empezarán nuestros datos, es decir, la 2, la columna inicial, la columna donde estará la URL del evento, que en este caso será la 8 y el identificador del evento, que será la 9. También calculamos la última fila con datos, restándole 1 para tomar en cuenta que la primera fila la usamos para los encabezados.
function agregar_eventos() {
var sheet = SpreadsheetApp.getActiveSheet();
var fila_inicial = 2;
var columna_inicial = 1;
var columna_url_evento = 8;
var columna_id_evento = 9;
var ultima_fila = sheet.getLastRow() - 1;
Lenguaje del código: JavaScript (javascript)
Después, obtenemos el rango con el método que ya conocemos, getRange
, utilizando estas variables. Luego mapeamos los valores a un arreglo de objetos con sus propiedades correspondientes. Ojo aquí, el orden de las columnas de izquierda a derecha debe corresponder con nuestra hoja y con el número de columnas que tengamos. Si quieres agregar más columnas, debes hacerlo aquí y modificar las variables de columna_url_evento
y columna_id_evento
también.
var range = sheet.getRange(fila_inicial, columna_inicial, ultima_fila, columna_id_evento);
// Mapeamos los valores a un arreglo de objetos con sus propiedades correspondientes
var datos = range.getValues().map(
([titulo, fecha_inicio, fecha_fin, ubicacion, info_adicional, invitados, id_calendario, url_evento, id_evento]) =>
({titulo, fecha_inicio, fecha_fin, ubicacion, info_adicional, invitados, id_calendario, url_evento, id_evento})
);
Lenguaje del código: JavaScript (javascript)
Ahora vamos uno por uno de estos datos y ponemos una condición inicial importante, porque nos permitirá solamente crear el evento si en la fila en cuestión el dato de id_evento
está vacío para no duplicar eventos si ya habíamos ejecutado el código con esa información. También revisamos que los datos del título, la fecha de inicio y la fecha de fin del evento no estén vacíos, porque son obligatorios para nosotros.
// Para cada elemento de la lista de datos agregamos un evento
datos.forEach((dato,index) => {
// Solamente procesamos las filas que no tengan ya información de id de evento
// Y que tengan título, fecha de inicio y fecha de fin
if(dato.id_evento == "" && dato.titulo != "" && dato.fecha_inicio != "" && dato.fecha_fin != "") {
Lenguaje del código: JavaScript (javascript)
Para la fecha de inicio y de fin, tenemos que crear un objeto Date
a partir de los mismos, y por eso era importante lo que hablábamos hace un rato sobre que las fechas estuvieran en el formato correcto, ya que si no lo están aquí podemos tener errores.
var fecha_inicio = new Date(dato.fecha_inicio);
var fecha_fin = new Date(dato.fecha_fin);
Lenguaje del código: JavaScript (javascript)
Ahora sí, esta es la parte más importante de todo, porque toda esta preparación de datos culmina en que usamos la clase CalendarApp
y el método createEvent
para crear un evento en el calendario con el identificador correspondiente. Si te fijas bien, estamos pasándole los datos que tenemos como título, fecha de inicio y fecha fin y un objeto de opciones opcionales con la ubicación, la información adicional y los invitados.
// Creamos el evento createEvent(title, startTime, endTime, options)
var evento = CalendarApp.getCalendarById(dato.id_calendario).createEvent(
dato.titulo,
fecha_inicio,
fecha_fin,
{
location: dato.ubicacion,
description: dato.info_adicional,
guests: dato.invitados
}
)
Lenguaje del código: JavaScript (javascript)
Por último, construimos la URL del evento y escribimos en la hoja tanto esta URL como el identificador de evento que acabamos de crear en las columnas correspondientes.
var evento_url = "https://calendar.google.com/r/eventedit/" + Utilities.base64Encode(evento.getId().split('@')[0] + " " + dato.id_calendario).replace("==",'');
// Escribimos en la hoja la confirmación de la creación
// en la columna de URL evento y ID evento
sheet.getRange(fila_inicial + index, columna_url_evento).setValue(evento_url);
sheet.getRange(fila_inicial + index, columna_id_evento).setValue(evento.getId());
Lenguaje del código: JavaScript (javascript)
Ejecutar el código para crear eventos en un calendario desde Google Sheets
Bueno, es hora de guardar y probar nuestro código. Si refrescamos la página de nuestra hoja de cálculo, debe aparecer nuestro menú, y al ejecutarlo una vez, tendremos oportunidad de revisar y aceptar los permisos como siempre. Si lo ejecutamos de nuevo, veremos cómo se crean los eventos en nuestro calendario correctamente. Incluso podemos dar click en la URL creada para editar cada evento individualmente o simplemente verlos en el calendario en la vista por mes. ¡Genial!, ¿no? 😉
Documentación y limitaciones de Apps Script y Google Sheets para crear eventos en Google Calendar
Como siempre, te recomiendo revisar la documentación oficial de la clase CalendarApp, porque hay muchas cosas más que puedes hacer con ella. Por ejemplo, también existe el método CreateEventFromDescription, con el que podrías solamente usar una línea de texto para crear cada evento, sin tantas columnas, por ejemplo “Concierto de Taylor a las 8 pm”.
También es importante revisar las cuotas de Apps Script para crear eventos de calendario, que al momento de publicar esta guía es de 5,000 eventos diarios para cuentas gratuitas y 10,000 para cuentas de empresa.
¡Y listo! Ahora ya sabes cómo crear eventos de Google Calendar directamente desde Google Sheets. Si tienes mucha información que quieras agregar al calendario rápidamente, esto te ahorrará muchísimo tiempo. 😃
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 excelente tutorial, muchas gracias por compartir, lamentablemente a mi no me resulto, me envió un error ” TypeError: Cannot read properties of null (reading ‘createEvent’). ” pero estoy revisando que puede ser. Saludos desde Chile
Buenos días y muchas gracias por el Tutorial. Ahora tengo la siguiente pregunta que va algo mas allá. Como podría eliminar en Calendar alguno de los eventos que ya se hayan creado a partir de esta hoja de calculo desde la eliminación del evento en la propia hoja de calculo.
Muchas gracias.