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:
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):
Il risultato dell'esecuzione è poi mostrato nel file di log, Fig. 3, ed è pronto per essere elaborato da codice 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.
Buongiorno
chiedo se è fattibile utilizzando query modificare dinamicamente origine dati per convalida dati in una cella.
Grazie.
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.
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
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?
Grazie del feedback ma sono alcuni giorni che provo; ho la sensazione che where non accetti riferimenti di cella
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
RISOLTO =QUERY(Responses!B1:I, "Select B where G contains '"& B1 &"' ")
leggi qui https://stackoverflow.com/questions/23427421/query-syntax-using-cell-reference
Grande Sandro!
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)