Premessa
Durante un incarico di consulenza svolto con i colleghi Chiara C. Rizzarda, Marco Bottero, Federico Nigro e Giorgio Marongiu abbiamo avuto la necessità di gestire la comunicazione con il cliente, soprattutto per quello che riguardava le cosiddette Q&A (Questions & Answers), le domande a cui il cliente era necessario desse delle risposte, per poter procedere con il lavoro sul progetto.
Il modo più efficace di interazione sullo specifico progetto era l’interazione personale, trattandosi di un affiancamento.
Questo però ci lasciava carenti quanto a documentazione e tracciamento del workflow di progetto. All’interno del nostro team, abbiamo colmato la carenza con l’uso di Google Sheets.
In linea con alcune delle best pratices di PRINCE2 abbiamo nostri registri che giornalmente aggiorniamo.
Tra questi, il file delle “Q&A” serve a raccogliere dubbi o domande cui ciascun membro del team può confrontarsi liberamente, per fornire una risposta.
In questo “Q&A” era necessario però inserire anche le domande fatte al cliente e le sue risposte, per tracciare anche le scelte che da queste risposte prendono vita.
Punti critici
Durante una conference call di gruppo per trovare una soluzione a questo problema abbiamo prima portato alla luce i punti critici della comunicazione con il cliente, che possono essere così riassunti :
- Impossibilità di condividere semplicemente il Google Sheet con tutte le nostre informazioni interne;
- Impossibilità di creare due file per le “Q&A” interne e quelle con il cliente per problemi di praticità;
- Desiderio di non introdurre un passaggio manuale per il trasferimento delle informazioni dal Google Sheet alla mail, per la possibilità di perdere informazioni durante il processo manuale.
Soluzione
La soluzione poteva essere quella di creare uno script con Google Apps Script, che leggesse dal nostro Google Sheet e inviasse una mail al cliente solo delle informazioni necessarie, per ricevere poi un eventuale commento (ad esempio, se quanto riportato andasse in contrasto rispetto ai loro standard o fosse in errore).
Questo ci permette di avere un unico punto di raccolta per la conoscenza interna ed esterna, pur consentendoci di mantenere la riservatezza circa un file di lavoro interno al team.
Si trattava solo di programmare il tool, cercando come sempre di farlo al meglio.
Google sheet
Il nostro spreadsheet Google è suddiviso in un file per ogni progetto che seguiamo sul quale teniamo traccia, secondo le best pratices del framework di Project management PRINCE2 di alcuni aspetti del progetto stesso, come per esempio:
- i dati principali di progetto;
- il Daily Log;
- il Risk Register;
- il To Do List;
- le Q&A (le Domande e le Risposte).
Abbiamo quindi modificato il formato del tab “Q&A” in modo che riuscisse anche a tenere traccia delle domande e delle risposte non solo interne al gruppo, ma anche quelle relative al cliente.
Oltre alle due colonne per le domande e le risposte sono stati aggiunte colonne per :
- Cliente;
- Data Q&A;
- Inviata;
- Data Invio;
- Utente.
Abbiamo poi aggiunto nelle due righe ad inizio foglio il nome del progetto, una casella con gli indirizzi di posta elettronica a cui inviare le e-mail ed un campo ccn. dove poter mettere casomai i nostri indirizzi di posta per avere un backup della mail.
Cliente
La colonna cliente, con la checkbox spenta servirà per distinguere le Q&A da inviare al Cliente per mail e quelle che invece sono interne al gruppo e che non è necessario che vengano inviate.
Di default la checkbox è vuota, in modo che solo spuntandola volutamente quella Q&A verrà inviata.
Data
La colonna data si riferisce alla data nella quale è stata creata la Q&A, o almeno la data in cui è stata data la risposta.
Domanda
La colonna Domanda rappresenta la domanda, il dubbio, l’informazione mancante a cui dare una risposta. Fino ad oggi era solo per uso interno, ed ognuno di noi scriveva le sue domande e gli altri, per quanto di loro competenza davano una risposta.
Adesso è un repository anche delle risposte del cliente, date per via verbale e riportate per scritto.
Risposte
La colonna risposte contiene niente meno che “le risposte”.
Inviata
In questa colonna lo script spunterà la checkbox inviata a seguito dell’invio della mail al cliente, in modo da evitare un doppio invio di informazioni. Se lo script troverà questa checkbox spuntata non metterà la Q&A tra quelle da inviare nuovamente.
Data invio
La colonna data invio verrà compilata dallo script a seguito di invio della mail con la data effettiva di invio. Un ulteriore controllo di quello che è effettivamente stato mandato e quando.
Utente
La colonna utente verrà compilata dallo script con la mail di chi in quel momento starà lanciando il comando per inviare la mail, dato che il Google Sheet è un documento condiviso dove lavoriamo insieme.
Google Apps Script
Google Apps Script è una piattaforma di scripting sviluppata da Google per la piattaforma G-Suite, di cui fanno parte anche Google Drive, Google Sheet, Gmail e tutte le altre app di Google Docs.
Google Apps Script fornisce modi semplici per automatizzare le attività su prodotti Google e servizi di terze parti. Ed effettivamente è proprio così.
Il codice
//funzione per la creazione del menu personalizzato function onOpen() { var ui = SpreadsheetApp.getUi(); // Or DocumentApp or FormApp. ui.createMenu('Menu BIM') // il menu si chiamerà Menu BIM .addItem('Invio Mail Q&A’, 'sendEmails') // questo sarà il comando del Manu BIM che richiama la funzione sendEmails .addToUi(); } /** * Funzione per creare delle date nel formato 8-Aug-1977 */ function CreaData(date){ var giorno = Utilities.formatDate(date, Session.getScriptTimeZone(), "d"); var mese = Utilities.formatDate(date, Session.getScriptTimeZone(), "MMM"); var anno = Utilities.formatDate(date, Session.getScriptTimeZone(), "YYY"); date = (giorno + "-" + mese + "-" + anno); return date; } /** * Invia una mail con i dati contenuti nel foglio FAQ */ function sendEmails() { var sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("Q&A"); //seleziono il foglio con cui devo lavorare, nel nostro caso il Tab del foglio è Q&A var startRow = 4; // La prima riga da processare - le righe hanno gli stessi numeri di quello che vediamo a video in google sheets var numRows = 100; // Quante righe processare - dalla riga di partenza quante righe devo leggere var dataRange = sheet.getRange(startRow, 1, numRows, 5); // seleziona le righe da quella passata in StartRow fino a startRow+100 e dalla colonna 1 alla colonna 5 var mail = sheet.getRange(1,4).getValue(); // nella cella D1 e quindi la posizione riga-> 1 colonna -> D -> 4 //metto gli indirizzi mail a cui voglio mandare la mail, separati da vergola var bccmail = sheet.getRange(2,4).getValue();// nella cella D2 metto invece gli indirizzi mail che voglio mettere in BCC, sempre separati da virgola. var progetto = sheet.getRange(1,2).getValue(); // prendo il nome del progetto var date = new Date(); // creo la data di oggi in modo automatico questa data è formattata anche con le ore,minuti, secondi. var oggi = CreaData(date); // richiamo la funzione CreaData che mi restituisce una data formattata g/mmm/yyyy es 2-Aug-1977 var data = dataRange.getValues(); // con getValues raccolgo tutto quanto è tra la prima riga che ho passato a dataRange e l'ultima righa, per l'intervallo di colonne definito var message = ""; // Creo un messaggio vuoto var n = startRow // creo una variabile n che mi darà la riga a cui sono durante il ciclo for per scrivere sulle celle for (var i in data) { // faccio il ciclo for per iterare su tutte le righe selezionate del google sheet Q&A var row = data[i]; if (row[0] == 1){ // controllo la checkbox sulla colonna A , se è true, cipè è spuntata e va mandata la Q&A al cliente, allora procedo, altirmenti esco dalla IF if(row[4] == 0){ // controllo la checkbox sulla colonna E, se la Q&A è da inviare al cliente ed è stata già inviata, se ancora è da inviare la invio, altrimenti esco dall'IF var giornoFaq = CreaData(row[1]); // creo la data a partire da quella della colonna B per scrivere nella mail a che giorno si riferisce la FAQ message = message + "\r\n\r\n_______________________________________________\r\nGiorno : " + giornoFaq; message = message + "\r\n\r\n Domanda : " + row[2] + "\r\nRisposta: " + row[3]; var inviata = sheet.getRange(n,5).setValue(true); // setto su true, cioè metto un flag alla checkbox di colonna E per far sapere che la mail è già stata inviata var inviata = sheet.getRange(n,6).setValue(oggi); // scrivo nella colonna F la data di quando è stata inviata la mail per la FAQ specifica var user = Session.getActiveUser().getEmail(); // raccolgo la mail di chi invia la mail var inviata = sheet.getRange(n,7).setValue(user); // scrivo nella colonna G chi ha inviato la mail } } n = n+1; } var subject = 'Progetto : ' + progetto + ' - FAQ :' + oggi; // Questo è il subject della mail con il riferimento al giorno ed al nome del progetto if(message != ""){ if (user == "sandro@pellegrinetti.it"){ // dalla mail di chi è loggato a google sheet, ricavo il nome da mettere in firma from = "Sandro Pellegrinetti"; }else if (user == "chiara.c.rizzarda@gmail.com"){ from = "Chiara C. Rizzarda"; }else if (user == "ing.bottero@gmail.com"){ from = "Ing. Marco Bottero"; }else if (user == "marongiu28@gmail.com"){ from = "Arch. Giorgio Marongiu"; }else if (user == "federico.nigro.26@gmail.com"){ from = "Dott. Federico Nigro"; }else{ from = "BIM Team"; } //ampllio il messaggio del corpo della mail con una parte di introduzione alla mail ed una parte di saluto message = "Buonasera, questi sono i quesiti e le risposte emersi nelle scorse giornate e non ancora inviate." + "Se ci fosse quanlhe fraintendimento e/o errore siete pregati di rispondere per le correzioni del caso.\r\n" + message + "\r\n\r\nBuona serata, " + from + "\r\n" + user; MailApp.sendEmail(mail, subject, message, {bcc:bccmail} ); // invio la mail con l'app MailApp di google } }
Lo script è diviso in 3 funzioni:
- onOpen()
- CreaData()
- sendEmails()
onOpen è la funzione che all’apertura del Google Sheet crea il menu personalizato.
CreaData è la funzione che da una variabile contente una data formata da anno, mese, giorno, ore, minuti e secondi, essendo questo lo standard di data di Google App Script (Es. 2020-02-18 16:52:36) ricrea una data formata solo da giorno, mese, anno (18-02-2020) da poter essere utilizzata per compilare le celle del Google Sheet.
sendEmails è la funzione principale che oltre a fare i controlli sul Google Sheet, invia la mail e scrive sempre sul foglio cosa è stato fatto.
Controlla se il Q&A va inviato o meno al cliente, se gli è già stato inviato in una precedente mail.
Se è da inviare prepara la mail, la invia e scrive sul Google Sheet che è stata inviata, in che data e da chi è stata inviata.
Nella parte finale c’è anche un controllo su chi è loggato nel Google Sheet e che utilizza la funzione per inviare le mail, così a seconda dell’utente, mette il nome e cognome corretti sia nella firma della mail inviata che nella cella.
Menu personalizzato
Scrittura sul foglio
Invio mail
That’s all folks
In realtà l’applicazione nel tempo è migliorata, ha integrato altre funzioni e segue le nostre necessità.
Indipendentemente da quello che avete visto la forza di tutta la suite di Google Apps è proprio la possibilità di collegare tutto l’ecosistema di Google, e di molti altri software (ad esempio Slack).
La base di Google Apps Script è Javasript e quindi iniziare a capire come funziona questo linguaggio potrebbe essere una buona partenza.
Allegati
Qui trovate il PDF di questo articolo, se volete salvarlo nel vostro computer o nel vostro cloud.