Error when trying to create Calendar Events from Google Sheets

122 views
Skip to first unread message

Joaquín Carrillo Bascary

unread,
Apr 15, 2024, 5:16:14 PM4/15/24
to Google Apps Script Community
Hi, I'm working on automating my sales process, and I need the due dates for payment to be automatically recorded on Google Calendar as soon as we register the sale in Google Sheets.

So far, I've made a script that was working very well, but I'm getting an error that is quite annoying: the event has the day OK, the year OK, the starting and ending times OK, it sends the invites OK, but it's the month that raises an issue—the event is created on the current month instead of the actual month the spreadsheet indicates.

The script has an automatic trigger whenever there is a change in the spreadsheet, and the script is as follows

function agregar_eventos() {
  var sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("Prueba Automatizacion");
  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,sendInvites: true
        }
      )

      // 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();
    }
  })
}


Thanks in advance!

Fabrice Faucheux

unread,
Apr 16, 2024, 1:26:55 PM4/16/24
to Google Apps Script Community
Hola,

En JavaScript, el constructor del objeto `Date` puede comportarse de manera inconsistente en diferentes navegadores y entornos cuando se analizan cadenas de fecha. Esto podría explicar por qué el mes se establece incorrectamente en los eventos del calendario, aunque el día y el año estén correctos. El constructor de `Date` podría estar interpretando la cadena de fecha de una manera que no esperabas, especialmente si el formato de `fecha_inicio` y `fecha_fin` no es reconocido como esperas.

Aquí tienes una estrategia para diagnosticar y potencialmente arreglar el problema:

1. Interpretación explícita de fechas: Asegúrate de que el formato de las cadenas de fecha en tu hoja de Google (`fecha_inicio` y `fecha_fin`) sea consistente y reconocido correctamente por JavaScript. Si el formato de la fecha es ambiguo (por ejemplo, `"01/02/2023"` podría ser el 1 de enero o el 2 de febrero, dependiendo de la localidad), debes interpretarlo de manera explícita usando un método más confiable.

2. Ajustar la interpretación de fechas en el script: Puedes analizar manualmente las cadenas de fecha para evitar ambigüedades y asegurar consistencia. Por ejemplo, si tus fechas están en formato `DD/MM/YYYY` (común fuera de EE. UU.), deberías interpretarlas adecuadamente en tu script.

Aquí te muestro cómo modificar tu script para interpretar manualmente las fechas si están en formato `DD/MM/YYYY`:

function parseDate(dateStr) {
  var parts = dateStr.split("/");
  return new Date(parts[2], parts[1] - 1, parts[0]); // año, mes (basado en cero), día
}

datos.forEach((dato, index) => {

  if(dato.id_evento == "" && dato.titulo != "" && dato.fecha_inicio != "" && dato.fecha_fin != "") {
    var fecha_inicio = parseDate(dato.fecha_inicio);
    var fecha_fin = parseDate(dato.fecha_fin);


    var evento = CalendarApp.getCalendarById(dato.id_calendario).createEvent(
      dato.titulo,
      fecha_inicio,
      fecha_fin,
      {
        location: dato.ubicacion,
        description: dato.info_adicional,
        guests: dato.invitados,
        sendInvites: true
      }
    );


    var evento_url = "https://calendar.google.com/r/eventedit/" + Utilities.base64Encode(evento.getId().split('@')[0] + " " + dato.id_calendario).replace("==", '');
    sheet.getRange(fila_inicial + index, columna_url_evento).setValue(evento_url);
    sheet.getRange(fila_inicial + index, columna_id_evento).setValue(evento.getId());
    SpreadsheetApp.flush();
  }
});

Recomendaciones adicionales:
- Registrar información de depuración: Para entender mejor lo que está sucediendo, agrega instrucciones `Logger.log()` en tu script para mostrar las fechas tal como se interpretan y cualquier otra información relevante. Esto te puede ayudar a rastrear donde podrían estar ocurriendo los errores.
- Verificar formato de fecha en Hojas de Cálculo: Asegúrate de que el formato de fecha en Google Sheets coincida con lo que espera tu script. Google Sheets y JavaScript pueden interpretar las fechas de manera diferente según la configuración regional.

Ajustando cómo se interpretan las fechas, puedes controlar mejor el manejo de estas y evitar problemas con los meses o cualquier otro componente de la fecha.
Reply all
Reply to author
Forward
0 new messages