Todo el calendario puede transformarse en una hoja de cálculo. La vista de calendario es muy útil en casi todos los casos, pero si quisiéramos hacer un análisis más detallado sobre los eventos, sería mejor tener la información en una simple hoja de cálculo. Podrías, por ejemplo, contabilizar el número de reuniones a las que asististe o cuánto tiempo pasaste en ellas. O tal vez, como yo, simplemente te gusta poder ver todo en filas y columnas si se puede. Hoy, justamente vamos a ver cómo extraer la información de un calendario de Google Calendar para exportarla a columnas de una hoja de cálculo de Google Sheets.

Preparando el documento

Como recordarás de una guía anterior, ya habíamos aprovechado la integración de Google Calendar con Apps Script para insertar eventos hacia Google Calendar desde Google Sheets. Ahora vamos a hacer algo similar pero en el sentido inverso, es decir, vamos a extraer o exportar los datos del calendario y los vamos a escribir en nuestro documento de hoja de cálculo.

Google Calendar

Entonces, primero debemos preparar nuestro documento. Tendremos dos hojas principales: una para Eventos y otra para configurar la exportación, que llamaremos simplemente config. Es importante que los nombres de las hojas sean exactamente así: Eventos y config, más adelante verás por qué.

En la hoja Eventos tenemos las columnas de los datos que esperamos traer de un calendario particular, como Título, Fecha de inicio, Fecha de fin, Ubicación, Información adicional, Invitados, la URL que nos lleva directamente al evento en Google Calendar y el identificador único de cada evento.

Columnas de eventos de calendario para exportar

Ahora, en la hoja de configuración que llamamos config, vamos a tener tres datos sencillos pero importantes para hacer nuestra consulta a Google Calendar. Primero tenemos dos fechas que limitarán la búsqueda de eventos, que serán la Fecha de inicio y la Fecha de fin de consulta. Es importante que estas celdas sean de tipo fecha. Como hemos visto antes, esto lo comprobamos fácilmente dando doble click sobre la celda y confirmando que aparece un calendario y no solamente el editor de texto de la celda.

Dato tipo fecha en Google Sheets

El tercer dato es el identificador del calendario sobre el que tengamos permiso de lectura. Este identificador lo encontramos fácilmente si vamos a Google Calendar, ubicamos el calendario deseado, en sus opciones vamos a Configuración y uso compartido, luego en el apartado de Integrar calendario copiamos el dato que dice ID del calendario. En mi caso exportaré los eventos de mi calendario de conciertos 🤘🎸, pero puedes usar el que tú quieras.

Configuración para exportar calendario
Calendario - Opciones de configuración y uso compartido
Calendario – Opciones de configuración y uso compartido
Calendario - Integrar calendario - ID de calendario
Calendario – Integrar calendario – ID de calendario

Estos tres datos nos servirán para cambiar de calendario y fechas de consulta de los eventos que necesitemos a nuestro gusto. 😃

Código para exportar calendarios a Google Sheets

OK, ahora que ya tenemos todo listo para recibir los datos, es hora de crear el proyecto de código que nos permitirá hacer justo eso. No te preocupes, es poco código y lo explicaremos paso a paso.

Vamos al menú Extensiones – Apps Script y reemplazamos el código que vemos por default por este:

function onOpen() {  
  var ui = SpreadsheetApp.getUi();
  ui.createMenu('Calendario')
      .addItem('Traer eventos de calendario', 'traer_eventos')
      .addToUi();
}

function traer_eventos() {
  var sheet_config = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("config");
  var fecha_inicio = sheet_config.getRange("B1").getValue();
  var fecha_fin = sheet_config.getRange("B2").getValue();
  var id_calendario = sheet_config.getRange("B3").getValue();

  var sheet_eventos = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("Eventos");
  var ultima_fila_vacia_eventos = sheet_eventos.getLastRow() + 1;

  //Agregamos 23:59:59 horas al rango final para incluir el día final entero
  var fecha_fin_mas_un_dia = new Date(fecha_fin.getTime() + (23*59*59*1000));

  // https://developers.google.com/apps-script/reference/calendar/calendar#getEvents(Date,Date,Object)
  var eventos = CalendarApp
                  .getCalendarById(id_calendario)
                  .getEvents(
                        fecha_inicio,
                        fecha_fin_mas_un_dia
                        );

  eventos.forEach((evento,index) => {
    // https://developers.google.com/apps-script/reference/calendar/calendar-event
    var titulo = evento.getTitle();
    var fecha_inicio_evento = evento.getStartTime();
    var fecha_fin_evento = evento.getEndTime();
    var ubicacion_evento = evento.getLocation();
    var info_evento = evento.getDescription();
    var invitados_evento = evento.getGuestList();
    var id_calendario_evento = evento.getOriginalCalendarId();
    var url_evento = "https://calendar.google.com/r/eventedit/" + Utilities.base64Encode(evento.getId().split('@')[0] + " " + id_calendario_evento).replace("==",'');
    var id_evento = evento.getId();

    var invitados = invitados_evento.map((invitado) => invitado.getEmail()).join(', ');

    var rango_fila_nueva = [[
                            titulo,
                            fecha_inicio_evento, 
                            fecha_fin_evento,
                            ubicacion_evento,
                            info_evento,
                            invitados,
                            id_calendario_evento,
                            url_evento,
                            id_evento
                            ]];

    // Escribimos los valores en la fila
    sheet_eventos.getRange(row = ultima_fila_vacia_eventos + index,
                            column = 1,
                            numRows = 1,
                            numColumns = 9)
                  .setValues(rango_fila_nueva);
  });

}
Lenguaje del código: JavaScript (javascript)

Vamos a explicarlo un poco:

Primero estamos agregando un menú como los que hacemos siempre, con el que ejecutamos nuestra función principal de traer_eventos.

function onOpen() {  
  var ui = SpreadsheetApp.getUi();
  ui.createMenu('Calendario')
      .addItem('Traer eventos de calendario', 'traer_eventos')
      .addToUi();
}
Lenguaje del código: JavaScript (javascript)

En esta función de traer_eventos creamos algunas variables importantes que nos servirán para manejar las información de cada hoja y hacer la consulta correctamente. Nombrar cada cosa es útil para mantenernos organizados.

function traer_eventos() {
  var sheet_config = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("config");
  var fecha_inicio = sheet_config.getRange("B1").getValue();
  var fecha_fin = sheet_config.getRange("B2").getValue();
  var id_calendario = sheet_config.getRange("B3").getValue();

  var sheet_eventos = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("Eventos");
  var ultima_fila_vacia_eventos = sheet_eventos.getLastRow() + 1;
Lenguaje del código: JavaScript (javascript)

Aquí hay un detalle con la fecha final de consulta. Como queremos poder incluir este día con sus eventos también, vamos a tener que sumarle 23 horas, 59 minutos y 59 segundos para abarcar cualquier evento que suceda ese día también. Si no lo hacemos, el límite de la consulta se asumirá como las 00:00 horas del día final, que apenas estaría empezando.

  //Agregamos 23:59:59 horas al rango final para incluir el día final entero
  var fecha_fin_mas_un_dia = new Date(fecha_fin.getTime() + (23*59*59*1000));
Lenguaje del código: JavaScript (javascript)

Acá viene una parte importante, pues vamos a guardar en una variable llamada eventos el resultado de haber utilizado la clase CalendarApp, eligiendo un calendario basado en el identificador que ya obtuvimos y luego obteniendo los eventos con el método getEvents.

  var eventos = CalendarApp
                  .getCalendarById(id_calendario)
                  .getEvents(
                        fecha_inicio,
                        fecha_fin_mas_un_dia
                        );
Lenguaje del código: JavaScript (javascript)

Lo que nos queda ahora es recorrer el objeto de eventos y acomodar la información que obtenemos de cada uno para escribirla después. Para esto creamos algunas variables y usamos métodos como getTitle para el título, getStartTime y getEndTime para la fecha de inicio y fin del evento, getDescription para la información adicional y getGuestList para obtener los invitados adicionales.

eventos.forEach((evento,index) => {
    // https://developers.google.com/apps-script/reference/calendar/calendar-event
    var titulo = evento.getTitle();
    var fecha_inicio_evento = evento.getStartTime();
    var fecha_fin_evento = evento.getEndTime();
    var ubicacion_evento = evento.getLocation();
    var info_evento = evento.getDescription();
    var invitados_evento = evento.getGuestList();
    var id_calendario_evento = evento.getOriginalCalendarId();
    var id_evento = evento.getId();
Lenguaje del código: JavaScript (javascript)

Para algunos datos debemos de hacer un poco más de trabajo, pero no mucho. Por ejemplo, la URL del evento debemos construirla a partir de los identificadores, y la lista de invitados la transformamos de un arreglo a una cadena de caracteres de correos separados por coma, para poderla escribir directamente en la celda después.

    var url_evento = "https://calendar.google.com/r/eventedit/" + Utilities.base64Encode(evento.getId().split('@')[0] + " " + id_calendario_evento).replace("==",'');
    var invitados = invitados_evento.map((invitado) => invitado.getEmail()).join(', ');
  
Lenguaje del código: JavaScript (javascript)

Toda esta información la acomodamos en un objeto de una fila nueva que incluirá todas las columnas que tenemos en la hoja en el mismo orden. Es importante que si vas a quitar o agregar un dato, hagas coincidir el número de columnas aquí también y las asignes a su dato correspondiente.

var rango_fila_nueva = [[
                            titulo,
                            fecha_inicio_evento, 
                            fecha_fin_evento,
                            ubicacion_evento,
                            info_evento,
                            invitados,
                            id_calendario_evento,
                            url_evento,
                            id_evento
                            ]];
Lenguaje del código: JavaScript (javascript)

Finalmente, escribimos esta fila en el índice correspondiente en la hoja de eventos, asegurándonos también de que el número de columnas coincide. De nuevo, si agregas o quitas columnas, debes tener en cuenta este dato y el tamaño del arreglo de la fila nueva.

// Escribimos los valores en la fila
    sheet_eventos.getRange(row = ultima_fila_vacia_eventos + index,
                            column = 1,
                            numRows = 1,
                            numColumns = 9)
                  .setValues(rango_fila_nueva);
  });
Lenguaje del código: JavaScript (javascript)

Exportar eventos de Google Calendar a Google Sheets

Si guardamos nuestro código y ejecutamos la función onOpen una vez, nos pedirá los permisos necesarios para acceder a nuestro calendario. Al regresr a nuestra hoja, debemos tener nuestro menú de Calendario listo para ejecutar, y si no, solamente refrescamos. Si usamos este menú de Calendario – Traer eventos de calendario, veremos cómo nuestra hoja de Eventos se empieza a llenar de filas correspondientes a cada evento que exista en el calendario que elegimos. ¡Genial!, ¿no crees? 😃

Esto nos puede servir mucho para crear un reporte, para hacer cálculos o análisis sobre cuántas horas pasamos a la semana en juntas o eventos fuera de la escuela u oficina, o hacer cruces de empalmes entre calendarios diferentes. Tu imaginación es el límite. 😉

Documentación de Apps Script y Google Sheets para 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, hay algunas opciones adicionales que puedes implementar fácilmente, como un filtro por una palabra clave, por si tienes muchos eventos para exportar.

También es importante revisar las cuotas de Apps Script relevantes a eventos de calendario si es que vas a crear eventos mediante Apps Script.

¡Y listo! Ahora ya sabes cómo exportar eventos de Google Calendar directamente hacia Google Sheets. Estoy seguro de que te servirá muchísimo. 😃

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.

Aprende Sheets: Curso práctico de Hojas de cálculo de Google
Aprende Sheets: Curso práctico de Hojas de cálculo de Google