Javascript, HTML, CSS e... !
0 commenti

Estrarre un log giornaliero dei file modificati nelle ultime 24 ore

Monitorare i File in Google Drive con Google Apps Script

Lo script proposto di seguito si avvale del metodo DriveApp.searchFiles(parametro) il quale ottiene una raccolta di tutti i file nell'unità dell'utente che corrispondono ai criteri di ricerca specificati come parametro.
I criteri di ricerca sono dettagliati nella documentazione delle Google Drive API alla voce 'Search for Files and Team Drives'. Considerando che il parametro sarà tradotto dal sistema come una querystring è bene fare attenzione al corretto utilizzo delle virgolette onde evitare errori e male interpretazioni della stringa passata.

Il funzionamento del codice si basa sulla ricerca all'interno del proprio Google Drive dei file in cui l'ultima modifica vi è stata effettuata nell'arco delle ultime 24 ore. Lo script poi, una volta recuperate le informazioni di tali file le scriverà, appendendole, all'interno del foglio dello Spreadsheet al quale lo script è stato associato (bound-script).

Avvalendosi di un trigger dovutamente impostato dall'interfaccia dell'editor di script di Google Apps Script è possibile far eseguire la funzione in modo automatico a cadenza giornaliera.
Il risultato è qualcosa di simile al seguente, Fig. 1:



spreadsheet con il log giornaliero dei file modificati

Fig. 1 - Spreadsheet con il log giornaliero dei file modificati


Come intuibile dall'intestazione delle colonne il contenuto, da sinistra verso destra, rappresenta la data di creazione, quella di ultima modifica, il nome del file, il suo URL e (e qui la sfida dello script proposto) l'informazione se il file modificato è stato poi spostato nel cestino (e quale era la sua cartella di origine).

Il codice Apps Script da inserire come script incorporato è il seguente:

// Per attivare o disattivare la ricerca dei file modificati all'interno del cestino
var blnTrashed = true;

function driveActivityReport() {
  
  var ss = SpreadsheetApp.getActiveSpreadsheet(); 
  var sheet = ss.getActiveSheet();
  
  // Recupera il timezone dello Spreadsheet
  var timezone = ss.getSpreadsheetTimeZone();
  
  var today     = new Date();
  var oneDayAgo = new Date(today.getTime() - 1 * 24 * 60 * 60 * 1000);  
  var startTime = oneDayAgo.toISOString();
  
  // Trova i file modificati nelle ultime 24 ore
  var search = 'modifiedDate > "' + startTime + '"';
  var files  = DriveApp.searchFiles(search);
  
  // Effettua un ciclo su tutti i file recuperati dal criterio di ricerca utilizzato
  while( files.hasNext() ) {  
    var file = files.next();
    
    var fileName     = file.getName();
    var fileURL      = file.getUrl();
    var dateCreated  = Utilities.formatDate(file.getDateCreated(), timezone, "yyyy-MM-dd HH:mm");
    var dateModified = Utilities.formatDate(file.getLastUpdated(), timezone, "yyyy-MM-dd HH:mm");
    
    // Appende una riga allo Spreadsheet con le info del file
    sheet.appendRow([dateCreated, dateModified, fileName, fileURL]);  
  }
  
  // Se la variabile blnTrashed è true controlla in tutti i file nel cestino quelli modificati nelle ultime 24 ore
  if (blnTrashed == true) {
    var files = DriveApp.searchFiles("trashed = true");
    while (files.hasNext()) {
      var file = files.next();
      if (Utilities.formatDate(file.getLastUpdated(), "GMT", "yyyy-MM-dd hh:mm:ss") > Utilities.formatDate(oneDayAgo, "GMT", "yyyy-MM-dd hh:mm:ss")) {
        var parentFolder = file.getParents();
        if(parentFolder.hasNext()){
          
          var fileName     = file.getName();
          var fileURL      = file.getUrl();
          var dateCreated  = Utilities.formatDate(file.getDateCreated(), timezone, "yyyy-MM-dd HH:mm");
          var dateModified = Utilities.formatDate(file.getLastUpdated(), timezone, "yyyy-MM-dd HH:mm");
          var trashInfo = "TRASHED (was located inside '" + parentFolder.next().getName()+"' folder)";
          
          // Appende una riga allo Spreadsheet con le info del file ed il nome della cartella
          // dove si trovava originariamente il file prima di essere spostato nel cestino
          sheet.appendRow([dateCreated, dateModified, fileName, fileURL, trashInfo]);
        }
      }
    }
  }
}

La query è basata appunto sul criterio modifiedDate qualora fosse maggiore del contenuto della variabile startTime che contiene il valore del lasso di tampo definito come le ultime 24 ore.
Ad inizio codice è presente la variabile blnTrashed il cui scopo è quello di attivare o disattivare la ricerca dei file modificati all'interno del cestino, questo è stato necessario in quanto (per motivi non particolarmente evidenti) il criterio 'trashed = true' per la ricerca dei file all'interno del cestino viene ignorato qualora si trova unito alla ricerca sulla base della data dell'ultima modifica.
L'ideale sarebbe stato appunto utilizzare il seguente criterio:

var search = '(trashed = true or trashed = false) and (modifiedDate > "' + startTime + '")';

Tuttavia non risulta funzionante non restituendo i file modificati spostati nel cestino.
Per ovviare a questo inconveniente ho inserito nello script un ciclo a se stante, sicuramente non performante in termini di tempo di esecuzione, che verifica la data di ogni file all'interno del cestino e nel caso corrisponda ai criteri desiderati lo appende allo Spreadsheet.

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

0 Commenti

Non ci sono commenti

Nessuno ha ancora commentato questo articolo, fallo tu per primo!

scrivi un 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]http://www.appsscript.it[/url] se devi riferirti ad un indirizzo web