Passa ai contenuti principali

Creiamo uno script per non dimenticarci dei compleanni importanti

Oggi voglio sospendere temporaneamente la panoramica sugli Apps Script e iniziare con voi un piccolo progetto. Avevo in mente un Google Apps Script che giornalmente invitasse una email con il riepilogo dei compleanni odierni dei propri contatti e quelli dei prossimi 7 giorni in modo da potersi ricordare per tempo un eventuale regalo.

Procediamo a creare il nostro script come abbiamo imparato a fare in precedenza.

Google riversa automaticamente (prendendoli dai nostri contatti) i compleanni, e altri eventi, in un calendario speciale. Dovremmo quindi puntare questo calendario per recuperarli.

Ci tengo a precisare che per ottenere il riferimento a un calendario ci sono 3 diversi metodi della classe CalendarApp:
  • getDefaultCalendar() restituisce il calendario di default quindi non servono parametri e otteniamo un unico calendario
  • getCalendarsByName(name) restituisce un array di calendari, di proprietà dell'utente o a lui accessibili, il cui nome combacia con la stringa passata come parametro.
  • getCalendarById(id) restituisce il calendario che risponde a uno specifico id (i vari id dei calendari a cui avete accesso li trovate ovviamente in Google Calendar, nelle impostazioni dello specifico calendario)
In questo caso andremo ad usare il terzo metodo visto che l'id del calendario dei contatti è univoco per tutti: #contacts@group.v.calendar.google.com

In questo progetto useremo 3 file diversi. Oltre a Codice.gs, presente di default in ogni nuovo progetto, dovremmo creare due file HTML (Email.html e Stylesheet.html), dal menù File -> Nuovo -> File HTML

In Codice.gs ci saranno tutte le funzioni che verranno utilizzate nel nostro progetto, in caso di progetti più complessi si potrà suddividerle in più file che dovranno avere estensione .gs
In Stylesheet.html ci sarà il tag <style> con tutto il CSS necessario a dare uno stile alla nostra mail (Gmail supporta i CSS).
In Email.html ci sarà il template che, a partire dai dati recuperati da una funzione, genererà l'HTML che verrà inviato via mail.

Come potrete vedere non mi sono impegnato molto per creare un HTML particolarmente accattivante ma ho cercato di fare del mio meglio per documentare chiaramente il codice.

Di seguito il codice commentato di tutti e 3 i file.


Il progetto nella sua interezza è su Github, la versione relativa a questo articolo è qui ma se voleste contribuire a migliorarlo o semplicemente andare a vedere l'ultima versione disponibile allora recatevi subito qui. Ovviamente qualsiasi contributo all'html e ai css sarà il benvenuto.

Come potrete intuire al momento dovrete configurare manualmente l'esecuzione automatica dello script come avevamo già visto qui. Io vi consiglio di metterlo giornaliero ma se volete potrete modificare velocemente il codice per eseguire lo script una volta a settimana, recuperare gli eventi dei successivi 30 giorni, mostrare i compleanni della settimana in primo piano e i restanti in coda.

Nei prossimi articoli vorrei illustrarvi come scrivere agevolmente il codice offline e caricarlo velocemente (in modo da poter usare strumenti di versioning come git e in modo da poter caricare con più comodità i miei futuri progetti), vorrei trattare la creazione programmatica dei trigger e migliorare questo progetto inserendo anche un modo per filtrare i contatti per cui ricevere il promemoria. Se avete preferenze fatemi sapere.

Commenti

Unknown ha detto…
Script molto elegante Edo.
Ho difficoltà a capire alcuni punti.

=========================================================

contactsBirthdays.forEach(function(bday) {
if(bday.getAllDayStartDate().getDate() === now.day){
result.today.push(contactsBirthdays.shift())
}
});
// Assegno i restanti compleanni a result.remaining
result.remaining = contactsBirthdays;
return result;

========================================================

Qui penso che la funzione esegua un controllo su tutto l'array delle date comprese tra oggi e days (con foreach che analizza tutto l'array in base ad una funzione)

Appena trova una data in oggi la inserisce nell'oggetto result e rimuove con shift il valore dall'array delle date.

L'array che rimane viene poi caricato sempre nell'oggetto con un parametro nuovo .remaining che dovrebbe essere un array (dico nuovo perchè non c'era nella prima dichiarazione).

A questo punto ho un oggetto che contiene l'array delle date compleanno di oggi (today) e le rimanenti (remaining).

Poi lo script procede mandando la mail che utilizza un template html.

Nel template c'è un punto:

=========================================================================

Oggi



=====================================================================

bday dovrebbe essere l'item dell'array, ovvero ogni data (o meglio è un array o oggetto con i valori del calendario), invece getDescription() dovrebbe essere la funzione del calendario, la descrizione, qindi forse il nome delle persone.

e l'ultima parte dovrebbe fare lo stesso però per quelli che verranno nei prossimi giorni.

Andrea
Edo ha detto…
Ciao Andrea,
contactsBirthdays.forEach cicla su ogni elemento dell'array contactsBirthdays (che è stato popolato recuperando gli eventi dal calendario).
Come hai ipotizzato per ogni evento viene effettuato un controllo e se la data dell'evento è uguale al primo giorno del periodo allora l'evento viene rimosso dall'array originale e aggiunto all'array "today" che viene definito nell'oggetto "result". A ciclo ultimato l'array originale, privo degli eventi odierni viene assegnato alla proprietà "remaining" dell'oggetto "result". Il motivo per cui "today" era stato definito inizialmente come array mentre "remaining" no solo perché "today" deve essere un array affinché si possa richiamare il metodo "push".

Per quanto riguarda la seconda curiosità tramite birthdays.today.forEach ciclo su ogni evento dell'array e, ogni volta, questo evento viene passato alla funzione come parametro di nome "bday" e tramite la funzione getDescription() viene recuperata la descrizione dell'evento così come viene mostrata nel calendario.

Spero che questo abbia chiarito i tuoi dubbi.