GOOGLE SHEETS PER LA GESTIONE DEI WORKFLOW CONSULENTI-CLIENTE CON GOOGLE APP SCRIPT

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.
Google Apps Script

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.

Articolo creato 17

Lascia un commento

Il tuo indirizzo email non sarà pubblicato. I campi obbligatori sono contrassegnati *

Questo sito usa Akismet per ridurre lo spam. Scopri come i tuoi dati vengono elaborati.

Articoli correlati

Inizia a scrivere il termine ricerca qua sopra e premi invio per iniziare la ricerca. Premi ESC per annullare.

Torna in alto