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.

Datos de eventos en Sheets para enviar a Google Calendar

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.

Doble click para elegir fecha con calendario en hoja de cálculo
Configuración de zona horaria en hoja de cálculo de Google Sheets

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.

Configuración y uso compartido calendarios
ID del calendario en opciones de integrar calendario en configuración de calendario

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? 😉

Menú personalizado en sheets agregar eventos a calendario
Eventos creados en el calendario y confirmados en la hoja de cálculo
Eventos de calendario creados desde Google Sheets y Apps Script

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.

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