di Gianluca Tavella
Il 20 agosto 2010 scrissi «versione alpha» in cima a un file di codice. Il progetto si chiamava S.E.A., Simple Enquiries Automation, e nasceva da una scena piuttosto comune all’Azienda Sociale di Castano Primo. Per chiedere un giorno di ferie si compilava un modulo di carta, lo si firmava e lo si portava al responsabile per la controfirma. Per una missione, uno straordinario o una mancata timbratura, il giro ricominciava.
Volevo accorciare quel giro usando gli strumenti che avevo a disposizione nel browser. La prima release uscì a dicembre. Riaprendo oggi il codice, ritrovo due momenti del progetto. Il primo è quello in cui un modulo online cominciò a far risparmiare passaggi. Il secondo è quello in cui dovetti insegnare allo script a riprendere il lavoro quando qualcosa si fermava.
Il modulo online era già il primo pezzo dell’archivio
Nel 2010 i moduli di Google facevano ancora parte di Google Documenti. Io ne usai uno come sportello per le richieste del personale. Il dipendente indicava le date nel browser e, appena inviava il modulo, nel foglio compariva una riga con la richiesta, la data e l’ora di inserimento. L’ufficio aveva già i dati da usare per il riepilogo di fine mese. I moduli di Google nel 2010
Google Apps Script metteva il foglio al lavoro
Google aveva aperto Apps Script a tutti gli utenti dei suoi fogli di calcolo nel marzo di quell’anno. La mia funzione principale, inviaMail(), leggeva una riga del foglio Collect, verificava la chiave del dipendente e consultava una tabella per trovare il suo responsabile. Poi preparava la mail in base al tipo di richiesta. Per le ferie servivano le date, per una mancata timbratura gli orari e la motivazione. L’annuncio di Google Apps Script del marzo 2010
La scelta che rifarei oggi riguarda il campo Rispondi a. Ci mettevo l’indirizzo del dipendente. Il responsabile leggeva la richiesta nella posta che usava tutti i giorni, premeva Rispondi e comunicava la sua decisione direttamente alla persona interessata. Nel foglio restava l’esito dell’invio. La decisione restava nella conversazione.
Due funzioni ricorsive per riprendere il lavoro
Nel 2015 tornai sul codice per affrontare due casi. A volte più richieste arrivavano a breve distanza e una rimaneva indietro. Altre volte il foglio veniva aggiornato, ma l’invio della mail falliva. In entrambi i casi usai la ricorsione. La funzione faceva un passo e richiamava sé stessa per quello successivo, finché incontrava una condizione di uscita.
La prima funzione risaliva il foglio. ultimaRigaDaAgg() partiva dall’ultima riga di Collect e leggeva la colonna dello stato. Se la riga era ancora da lavorare, guardava quella sopra. Quando trovava uno stato già scritto, restituiva il numero della riga immediatamente successiva. Se anche la riga sopra era vuota, continuava a risalire.
return ultimaRigaDaAgg(sheet, lastRow - 1);
Immaginiamo che la riga 119 avesse già uno stato e che le righe 120, 121 e 122 fossero ancora da lavorare. La ricerca partiva dalla 122, passava alla 121 e arrivava alla 120. A quel punto riconosceva il confine e restituiva 120, la richiesta più vecchia di quel gruppo. Avevo programmato alcuni controlli notturni per riprendere le righe rimaste indietro. Il metodo funzionava sul gruppo di righe ancora vuote in fondo al foglio. Se l’ultima aveva già uno stato, la ricerca si fermava lì.
La seconda funzione recuperava le mail rimaste in sospeso. Quando usavo troppo il servizio di posta di Google, raggiungevo il limite di invio e dovevo aspettare qualche ora prima che il servizio accettasse altre mail. La richiesta era già nel foglio. Per poterla riprendere più tardi, lo script annotava il numero della riga in emailERR.
Al controllo successivo, inviaMailInevase() prendeva l’ultima voce registrata e richiamava inviaMail() per ritentare la spedizione. Se l’invio riprendeva, la funzione richiamava sé stessa e passava alla voce successiva, fino a svuotare la lista. Se il limite era ancora attivo, il segnale esciLoopInevase interrompeva il giro e rimandava gli altri tentativi al controllo seguente.
Le matrici dinamiche mi hanno insegnato a pensare per tabelle
Con IMPORTRANGE portavo in un foglio le righe di un altro file. Con FILTER sceglievo quali mostrare e con SORT le mettevo in ordine. Una formula scritta in una sola cella poteva restituire un prospetto intero. Cambiavo le date di inizio e fine e il prospetto si aggiornava.
La stessa raccolta di richieste alimentava il riepilogo del dipendente, quello del responsabile e quello dell’ufficio del personale. Nel report complessivo potevo ordinare per data di inserimento, per vedere cosa era arrivato per ultimo, oppure lavorare sulle date a cui si riferivano le richieste, per preparare le presenze del periodo. È nei fogli di Google che ho imparato questo modo di ragionare. Microsoft avrebbe presentato in anteprima le matrici dinamiche di Excel nel settembre del 2018. L’annuncio di Microsoft
Nelle slide avevo stimato un risparmio di circa 800 fogli di carta all’anno. Il dettaglio che oggi mi fa più sorridere l’ho ritrovato nel codice. Dopo aver impostato i controlli notturni avevo scritto «vediamo stanotte dai log.. speriamo bene». Facevo il tifo per un foglio di calcolo.

Lascia un commento