JavaScript, HTML, CSS e... !
9 commenti

Con l'API Calendar.Events.insert

Creare un evento con allegato in Google Calendar con Google Apps Script

La creazione degli eventi su Google Calendar, oltre che effettuata manualmente, può essere automatizzata con Google Apps Script.
Sfruttando le API di Calendar è possibile creare un evento nel calendario corredato di tutte le informazioni gestibili normalmente da interfaccia, perfino allegarvi file da Google Drive (fino a un massimo di 25 allegati per evento).

Il codice che ho realizzato, e che riporto di seguito, richiede la semplice immissione delle informazioni dell'evento che si intende creare ovvero, l'id del calendario nel quale si intende creare l'evento (se diverso da quello di default che viene rilevato automaticamente dallo script), il nome dell'evento, la descrizione dell'evento, il luogo dove si svolgerà l'evento, la data e l'ora di inizio e di fine evento, la lista degli gli id degli eventuali allegati (separati da virgola) e la lista degli indirizzi mail dei destinatari (separati da virgola). Al resto penserà tutto il codice:

function prepareAttachmentsObj(arr_source) {
  var arr_output = [];
  var file = '';
  var arr_source_arr = arr_source.split(",");
  var arr_source_arr_len = arr_source_arr.length;
  for (var i = 0; i < arr_source_arr_len; i++) {
    file = DriveApp.getFileById(arr_source_arr[i]);
    arr_output.push({
      'fileId': arr_source_arr[i],
      'fileUrl': file.getUrl(),
      'mimeType': file.getMimeType(),
      'title': file.getName()
    });
  }
  return arr_output;
}

function prepareAttendeesObj(arr_source) {
  var arr_output = [];
  var arr_source_arr = arr_source.split(",");
  var arr_source_arr_len = arr_source_arr.length;
  for (var i = 0; i < arr_source_arr_len; i++) {
    arr_output.push({
      'email': arr_source_arr[i]
    });
  }
  return arr_output;
}

function createCalendarEvent(calendarId, summary, description, location, date_start, date_end, attachmentsIdList, attendeesList) {
  
  var start = new Date(date_start);
  var end = new Date(date_end);
  
  var date_start_arr = date_start.split(" ");
  var date_start_arr_date = date_start_arr[0].split("/");
  var date_start_arr_time = date_start_arr[1].split(":")
  var start = new Date(date_start_arr_date[0], date_start_arr_date[1]-1, date_start_arr_date[2], date_start_arr_time[0], date_start_arr_time[1], date_start_arr_time[2]);
  
  var date_end_arr = date_end.split(" ");
  var date_end_arr_date = date_end_arr[0].split("/");
  var date_end_arr_time = date_end_arr[1].split(":")  
  var end = new Date(date_end_arr_date[0], date_end_arr_date[1]-1, date_end_arr_date[2], date_end_arr_time[0], date_end_arr_time[1], date_end_arr_time[2]);
  
  
  var blnAttachments = false;
  var attachments = [];
  if (attachmentsIdList != '') { blnAttachments = true; }
  if (blnAttachments) {
    // In caso di presenza di uno o più allegati genero il relativo oggetto contenente le opportune informazioni
    // Nel caso specifico: l'id del file, l'url del file, il mimeType del file ed il nome del file
    attachments = prepareAttachmentsObj(attachmentsIdList);
  }
  
  var blnAttendees = false;
  var attendees = [];
  if (attendeesList != '') { blnAttendees = true; }
  if (blnAttendees) {
    // In caso di presenza di uno o più partecipanti genero il relativo oggetto contenente le opportune informazioni
    // Nel caso specifico: l'indirizzo mail del partecipante
    attendees = prepareAttendeesObj(attendeesList);
  }
  
  // Oggetto contenente tutte le informazioni per la generazione dell'evento nel Calendar
  var calendarEvent = {
    summary: summary,
    description: description,
    location: location,
    start: { dateTime: start.toISOString() },
    end: { dateTime: end.toISOString() },
    attachments: attachments,
    attendees: attendees
  };
  
  // Il parametro supportsAttachments è impostato a true o false in base alla presenza o meno di allegati 
  calendarEvent = Calendar.Events.insert(calendarEvent, calendarId, { supportsAttachments: blnAttachments });
  
  // Nel log è visualizzabile l'oggetto con tutte le informazioni relative all'evento creato
  Logger.log(calendarEvent); 
  
}

function main() {
  var calendarId = CalendarApp.getDefaultCalendar().getId();
  var summary = 'I Vantaggi di Apps Script per le Aziende';
  var description = 'Speech in Fortezza Vecchia';
  var location = 'Piazzale dei Marmi, 57126 Livorno LI';
  var date_start = '2018/02/20 09:30:00';
  var date_end = '2018/02/20 11:30:00';
  var attachmentsIdList = '1MyUOpS2ogYFN4pgKXnXuZIOmLYl...,17GPIMbqs4qZ8mEaRLTX-wTR62I...';
  var attendeesList = 'destinatario1@gmail.com,destinatario2@gmail.com,destinatario3@libero.it';
  
  // Richiama la funziona per la generazione dell'evento nel Calendar passando come parametri:
  // l'id del calendar nel quale si intende creare l'evento
  // il nome dell'evento
  // la descrizione dell'evento
  // il luogo dove si svolgerà l'evento
  // la data e l'ora di inizio evento
  // la data e l'ora di fine evento
  // una stringa con gli id degli allegati separati da virgola
  // una stringa con gli indirizzi mail dei destinatari separati da virgola
  createCalendarEvent(calendarId, summary, description, location, date_start, date_end, attachmentsIdList, attendeesList)
}

Una volta personalizzate le informazioni all'interno della funzione main() ed avviato lo script eseguendo tale funzione, verrà richiamata l'effettiva funzione per la generazione dell'evento nel Calendar passando come parametri i valori che sono stati specificati.

Viene elaborata la data di inizio e di fine evento al fine di formattarla in ISO 8601 (YYYY-MM-DDTHH:mm:ss.sssZ), poi, in caso di presenza di uno o più allegati viene generato il relativo oggetto contenente le opportune informazioni per ciascun allegato (l'id del file, l'url del file, il mimeType del file ed il nome del file), successivamente,  in caso di presenza di uno o più partecipanti viene generato il relativo oggetto contenente le opportune informazioni (l'indirizzo mail del partecipante).
A questo punto l'oggetto contenente tutte le informazioni per la generazione dell'evento nel Calendar è pronto per essere utilizzato come parametro dell'API Calendar.Events.insert (nota: il parametro supportsAttachments è impostato a true o false in base alla presenza o meno di allegati) ed una volta eseguita la chiamata sarà possibile trovare l'evento appena generato sul proprio calendario.

L'immagine di seguito mostra la creazione di un evento in Calendar con Google Apps Script al quale sono stati allegati 2 file e per il quale sono state invitate 3 persone, Fig. 1:



evento inserito in Google Calendar con Apps Script

Fig. 1 - Evento inserito in Google Calendar con Apps Script con le informazioni di evento, la data di inizio e di fine evento, i partecipanti e gli allegati


Nel log dell'editor di Apps Script è visualizzabile l'oggetto con tutte le informazioni relative all'evento creato.

Utilizzando le API di Calendar è necessario abilitare l'uso delle API dei Servizi Avanzati di Google nel progetto in questione (nel caso dello script oggetto del presente tutorial l'abilitazione deve essere effettuata per le Calendar API).

Per maggiori informazioni sui metodi e parametri della risorsa Eventi di Google Calendar rimando alla documentazione ufficiale.

Tags

Michele Pisani

Michele Pisani

Sviluppatore Javascript ed esperto in Digital Analytics

L'esperienza nel settore Digital Analytics unita ad anni di sviluppo in Javascript ha trovato la massima espressione in Google Apps Script che mi ha permesso, con estrema facilità e poche righe di codice, di realizzare potenti applicazioni interattive e processi automatizzati integrati con i prodotti della G Suite.

Come contattarmi
scrivi un commento

9 Commenti

  1. Tuesday, June 26, 2018 alle ore 17:18 Gabriele

    Ciao, molto interessante l'articolo, anche perchè farebbe proprio al caso mio.
    Purtroppo non riesco a capire bene come muovermi e preferisco scrivere per non impazzire...
    Ho creato un nuovo progetto nella Platform di Google, abilitato le Goole Api Calendar, ho una chiave API, un ID client ma mi manca proprio il mettere insieme tutte queste informazioni nel modo corretto e vedere se funzionano.
    Io utilizzo PHP ei il Framework Yii.
    Sapresti darmi una "semplice scaletta" (se esiste) da seguire per implementare le tue funzioni che hai riportato in questo post?
    Grazie, ciao Gabriele.

    Rispondi a questo commento
    • Wednesday, June 27, 2018 alle ore 09:47 Michele PisaniAutore

      Ciao Gabriele,
      questo post, così come l'intero blog, è orientato all'utilizzo di Google Apps Script ed alla gestione dei servizi Google (e non solo) con tale tecnologia.
      La tua richiesta esula dal contesto e dall'articolo in questione in quanto nel tuo caso stai utilizzando PHP per interfacciarti con Google Calendar e quindi della relativa libreria che necessita di tutti i passaggi di creazione di un progetto nella Google Platform così come la generazione di una chiave API e di un ID client, cose che con Apps Script non servono perchè il sistema pensa autonomamente sia alla creazione del progetto che alla fase di autenticazione.
      L'unica cosa che posso fare è darti il link alla documentazione ufficiale della libreria (Google API Client Libraries) che fornisce tutte le informazioni di base necessarie per iniziare a utilizzarla e quello all'uso delle Google Calendar API con PHP:

      Google API Client Libraries (PHP Beta): https://developers.google.com/api-client-library/php/start/get_started
      Google Calendar API (PHP Quickstart): https://developers.google.com/calendar/quickstart/php

      Rispondi a questo commento
      • Wednesday, June 27, 2018 alle ore 10:17 Gabriele

        Ti ringrazio per la risposta e la spiegazione che mi hai dato. Quelle guide le ho viste ma proverò a seguirle più attentamente.
        Nel caso non riesca proverò a contattarti per una consulenza.
        Grazie ancora.

  2. Monday, September 10, 2018 alle ore 21:54 Dino

    Buona sera avrei la necessità di collegare alcuni campi di una maschera di access 2007 che gestisce appuntamenti direttamente con Google Calendar. Esiste un modo?
    Grazie

    Rispondi a questo commento
    • Monday, September 10, 2018 alle ore 23:03 Michele PisaniAutore

      Ciao Dino,
      non ho ben chiaro quello che intendi, tuttavia se l'intento è quello di collegare gli appuntamenti presenti all'interno un database Access in Google Calendar, una possibile soluzione può essere quella di pianificare l'esportazione delle informazioni in CSV da Access ed importarle in modo manuale o programmatico nel Calendar di Google (per quest'ultima fase puoi fare riferimento alla documentazione ufficiale https://support.google.com/calendar/answer/37118?hl=it).

      Rispondi a questo commento
  3. Friday, May 3, 2019 alle ore 11:15 MarcoM

    Ciao,
    il tuo post è molto interessante e potrei utilizzare il codice che hai pubblicato per asllineare su google calendar l'agenda di una applicazione PHP. Tutto chiaro per scrivere un vevento, ma per cancellarlo e/o modificarlo?
    Puoi aiutarmi?
    Grazie
    Marcom

    Rispondi a questo commento
  4. Thursday, March 11, 2021 alle ore 15:22 domenico

    Buongiorno, ho un problema con la creazione di un evento sul mio calendario poiche, prendo le date dal foglio, nel mio script quando reperisco queste date il sistema me li carica con un fuso orario diverso da quello del foglio , che è impostato Italia e fuso "(GMT+01:00)Rome" Quindi reperisco il valore della cella con l'istruzione "var data=foglio.getRange(2,2).getValue()" con il debug mi sono accorto che il valore della variabile è il seguente "Tue Mar 09 2021 04:03:00 GMT-0500 (Eastern Standard Time)" e quindi mi sfalsa l'orario. Quindi nonostante la data inizio e fine siano identici quando cerco di creare l'evento sul calendario, con la funzione "createAllDayEvent" mi da l'errore "Exception: Event start date must be before event end date."

    Rispondi a questo commento

Scrivi un commento

Il tuo indirizzo email non sarà pubblicato.I campi contrassegnati da un * sono obbligatori
Puoi utilizzare i seguenti tag nei commenti:
[bold]testo[/bold] se vuoi evidenziare un testo con il grassetto[code]function helloworld() { }[/code] se vuoi pubblicare una porzione di codice[url]https://www.appsscript.it[/url] se devi riferirti ad un indirizzo web