JavaScript, HTML, CSS e... !
9 commenti

Metodo semplificato con .setFormula

Estrarre dati da uno Spreadsheet tramite la relativa funzione Query con Google Apps Script

Nei Fogli di Google esiste una funzione, QUERY(), che permette di effettuare un'interrogazione sui dati tramite il linguaggio di query della Google Visualization API.
Il vantaggio di utilizzare tale funzione è evidente, basti pensare alle sorgenti di dati con le quali abbiamo solitamente a che fare e che, nella maggioranza dei casi, non hanno la struttura desiderata pronta per essere utilizzata oppure necessitano di una manipolazione del dato per effettuare una pulizia di alcune colonne, righe o valori non necessari o per isolarne una determinata porzione.
Ad esempio potrei avere uno Spreadsheet con 5 colonne di dati, magari alcune superflue o non necessarie, e per ottenere un grafico per una ipotetica dashboard ho bisogno che la struttura sia a 2 colonne, oppure ho una serie di righe corrispondenti alle richieste di ferie, permessi e malattia dei dipendenti di un'azienda ed ho la necessità di isolare solo quelle di un determinato dipendente per una determinata tipologia di richiesta.

Il presente tutorial mostra un approccio, che definirei semplificato, all'utilizzo della funzione QUERY() in modo programmatico con Google Apps Script.
Dico semplificato in quanto le righe di codice proposte non si avvalgono della Google Visualization API bensì simulano l'uso diretto della funzione QUERY in uno Spreadsheet inserendola in una cella di un nuovo foglio per poi eliminarlo dopo aver recuperato il range di dati interrogato.

Per l'esempio invece più tecnico e professionale, ovvero che fa uso della Google Visualization API e del relativo metodo setQuery della classe google.visualization.Query, rimando all'articolo dedicato: Estrarre dati da uno Spreadsheet tramite query SQL con Apps Script e la Google Visualization API.

Tornando all'approccio semplificato, poniamo di avere un Foglio di Google con i seguenti dati, Fig. 1:



esempio di data source in un foglio di google

Fig. 1 - Esempio di un data source in un Foglio di Google


L'intenzione è quella di effettuare una query che recuperi tutte le righe del set di dati le cui visualizzazioni sono comprese tra 0 e 100.
L'idea, in questo caso, è quella di creare un nuovo foglio nello Spreadsheet tramite il metodo insertSheet, inserire la funzione QUERY con la relativa interrogazione all'interno della prima cella tramite il metodo setFormula, recuperare (con getDataRange().getValues()) l'intervallo dei risultati all'interno di una variabile in Google Apps Script ed eliminare il foglio appena creato, con il metodo deleteSheet, in modo che lo Spreadsheet risulti inalterato.

Lo script che effettua le operazioni di cui sopra è il seguente:

function startQuerySimpleMethod() {
  var req = query("=QUERY(Foglio1!A:C; \"select A, C where C >= 0 and C <= 100\")");
  Logger.log(req);
}

function query(request) { 
  var sheet = SpreadsheetApp.getActiveSpreadsheet().insertSheet();
  var r = sheet.getRange(1, 1).setFormula(request);

  var reply = sheet.getDataRange().getValues();
  SpreadsheetApp.getActiveSpreadsheet().deleteSheet(sheet);

  return reply;
}

Da notare i parametri obbligatori nella query, ovvero l'intervallo di celle all'interno del foglio specificato e la query.

Quello che succede, in modo relativamente trasparente all'utente (in quanto per una frazione di secondo è possibile vedere che viene creato un nuovo foglio e subito dopo questo viene cancellato), è mostrato nella Fig. 2: (ovvero quello che avviene al momento dell'esecuzione del codice):



foglio creato temporaneamente in modo programmatico per eseguire la funzione query

Fig. 2 - Foglio creato temporaneamente in modo programmatico per eseguire la funzione QUERY in una cella


Il risultato dell'esecuzione è poi mostrato nel file di log, Fig. 3, ed è pronto per essere elaborato da codice Apps Script.



risultato della query mostrato nel file di log

Fig. 3 - Risultato della query mostrato nel file di log di Apps Script


Il metodo del Foglio di Google che permette l'inserimento della funzione in una cella è setFormula, inutile dire che l'esempio in questione è centrato sull'utilizzo della funzione QUERY ma che con il metodo appena presentato può essere gestita qualsisi formula nativa dello 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

9 Commenti

  1. Thursday, May 28, 2020 alle ore 07:30 Riccardo

    Buongiorno
    chiedo se è fattibile utilizzando query modificare dinamicamente origine dati per convalida dati in una cella.
    Grazie.

    Rispondi a questo commento
    • Thursday, May 28, 2020 alle ore 14:16 Michele PisaniAutore

      Ciao Riccardo,
      la funzione QUERY permette di utilizzare la sintassi SQL con lo scopo di interrogare i dati in termini di applicazione filtri, aggregazione, ecc..., tuttavia il contesto SQL non si estende a quel tipo di operazioni che sarebbero destinate all'amministratore del database.

      Rispondi a questo commento
  2. Sunday, March 14, 2021 alle ore 15:06 pino

    intanto grazie delle tue pillole di conoscenza!
    La funzione query è molto utile ma una cosa che assolutamente non riesco a fare è di utilizzare un cella posta in un foglio diverso come clausola where;
    ti dò l'esempio: =query('Dati utenti'!A2:O1901;"select A,O where O CONTAINS 'ROC'") mi funziona ma se volessi dare un riferimento di cella del foglio attuale che contiene "ROC" ?
    Le ho tentate tutte ma niente da fare

    Rispondi a questo commento
    • Sunday, March 14, 2021 alle ore 16:03 Michele PisaniAutore

      Ciao Pino,
      grazie del feedback :)
      Per quanto riguarda il tuo problema, hai provato a richiamare il valore che ti serve in una cella del tuo foglio principale e includere quella nella query?

      Rispondi a questo commento
    • Sunday, March 21, 2021 alle ore 19:42 PINO

      Grazie del feedback ma sono alcuni giorni che provo; ho la sensazione che where non accetti riferimenti di cella

      Rispondi a questo commento
    • Tuesday, March 23, 2021 alle ore 12:48 SANDRO

      ciao mi sono imbattuto in questo post, ho lo stesso problema, tu sei riuscito a risolverlo utilizzando il riferimento ad una cella che contiene il valore immesso da utente.
      Grazie per l'aiuto

      Rispondi a questo commento
      • Tuesday, March 23, 2021 alle ore 13:41 SANDRO

        RISOLTO =QUERY(Responses!B1:I, "Select B where G contains '"& B1 &"' ")
        leggi qui https://stackoverflow.com/questions/23427421/query-syntax-using-cell-reference

        • Tuesday, March 23, 2021 alle ore 23:01 pino

          Grande Sandro!

  3. Friday, December 31, 2021 alle ore 12:23 Riccardo

    Buongiorno, ho bisogno di un'aiuto ho creato un database con 11 colonne e a fine anno conterrà 170000 righe, in un altro foglio ho creato una maschera di ricerca con filtri tramite
    funzione query+importrange la query al crescere del database inizia a visualizzarmi le prime 27 righe tutte dentro una cella per poi icolonnarle normalmente, inoltre i valori della colonna 10 vengono importati come se fossero testo non potendo effettuare nessun calcolo su di essi (chiaramente ho provato a cambiare formato ma è come se risulta bloccata quella colonna)

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