Fogli Google offre centinaia di
funzioni integrate come
AVERAGE
,
SUM
e
VLOOKUP
. Quando non sono sufficienti per le tue esigenze, puoi utilizzare Google Apps Script per scrivere funzioni personalizzate, ad esempio per convertire i misuratori in miglia o recuperare contenuti in tempo reale da Internet, quindi puoi utilizzarle in Fogli Google come una funzione integrata.
Come iniziare
Le funzioni personalizzate vengono create utilizzando JavaScript standard. Se non hai mai utilizzato JavaScript, Codecademy offre un ottimo corso per principianti. Nota: questo corso non è stato sviluppato da Google e non è associato a Google.
Ecco una semplice funzione personalizzata, denominata DOUBLE
, che moltiplica un valore di input per 2:
/**
* Multiplies an input value by 2.
* @param {number} input The number to double.
* @return The input multiplied by 2.
* @customfunction
*/
function DOUBLE(input) {
return input * 2;
}
Se non sai scrivere codice JavaScript e non hai tempo per imparare, controlla nello store dei componenti aggiuntivi se qualcun altro ha già creato la funzione personalizzata di cui hai bisogno.
Creazione di una funzione personalizzata
Per scrivere una funzione personalizzata:
- Crea o apri un foglio di lavoro in Fogli Google.
- Seleziona la voce di menu Estensioni > Apps Script.
- Elimina qualsiasi codice nell'editor di script. Per la funzione
DOUBLE
riportata sopra, basta copiare e incollare il codice nell'editor di script. - Fai clic su Salva in alto.
Ora puoi utilizzare la funzione personalizzata.
Recupero di una funzione personalizzata da Google Workspace Marketplace
Il Google Workspace Marketplace offre diverse funzioni personalizzate come componenti aggiuntivi per Fogli Google. Per utilizzare o esplorare questi componenti aggiuntivi:
- Crea o apri un foglio di lavoro in Fogli Google.
- In alto, fai clic su Componenti aggiuntivi > Installa componenti aggiuntivi.
- Quando si apre la Google Workspace Marketplace, fai clic sulla casella di ricerca nell'angolo in alto a destra.
- Digita "funzione personalizzata" e premi Invio.
- Se trovi un componente aggiuntivo per funzioni personalizzate che ti interessa, fai clic su Installa per installarlo.
- Una finestra di dialogo potrebbe indicare che il componente aggiuntivo richiede l'autorizzazione. In questo caso, leggi attentamente l'avviso, quindi fai clic su Consenti.
- Il componente aggiuntivo diventa disponibile nel foglio di lavoro. Per utilizzare il componente aggiuntivo in un altro foglio di lavoro, apri l'altro foglio di lavoro e, in alto, fai clic su Componenti aggiuntivi > Gestisci componenti aggiuntivi. Trova il componente aggiuntivo da utilizzare e fai clic su Opzioni > Utilizza in questo documento.
Utilizzare una funzione personalizzata
Dopo aver scritto una funzione personalizzata o installata una funzione daGoogle Workspace Marketplace, è facile da utilizzare quanto una funzione integrata:
- Fai clic sulla cella in cui vuoi utilizzare la funzione.
- Digita un segno di uguale (
=
) seguito dal nome della funzione e da qualsiasi valore di input, ad esempio=DOUBLE(A1)
, e premi Invio. - La cella mostrerà temporaneamente
Loading...
, quindi restituirà il risultato.
Linee guida per le funzioni personalizzate
Prima di scrivere una funzione personalizzata, è opportuno conoscere alcune linee guida.
Denominazione
Oltre alle convenzioni standard per la denominazione delle funzioni JavaScript, tieni presente quanto segue:
- Il nome di una funzione personalizzata deve essere diverso dai nomi delle funzioni integrate, come
SUM()
. - Il nome di una funzione personalizzata non può terminare con un trattino basso (
_
), che indica una funzione privata in Apps Script. - Il nome di una funzione personalizzata deve essere dichiarato utilizzando la sintassi
function myFunction()
, nonvar myFunction = new Function()
. - L'uso delle maiuscole non è importante, anche se i nomi delle funzioni dei fogli di lavoro sono tradizionalmente in maiuscolo.
Argomenti
Come una funzione integrata, una funzione personalizzata può assumere gli argomenti come valori di input:
- Se chiami la funzione con un riferimento a una singola cella come argomento (ad esempio
=DOUBLE(A1)
), l'argomento sarà il valore della cella. Se chiami la funzione con un riferimento a un intervallo di celle come argomento (ad esempio
=DOUBLE(A1:B10)
), l'argomento sarà un array bidimensionale dei valori delle celle. Ad esempio, nello screenshot di seguito, gli argomenti in=DOUBLE(A1:B2)
sono interpretati da Apps Script comedouble([[1,3],[2,4]])
. Tieni presente che il codice campione perDOUBLE
di cui sopra dovrà essere modificato per accettare un array come input.Gli argomenti delle funzioni personalizzate devono essere deterministici. In altre parole, le funzioni integrate del foglio di lavoro che restituiscono un risultato diverso ogni volta che viene calcolato, come
NOW()
oRAND()
, non sono consentite come argomenti di una funzione personalizzata. Se una funzione personalizzata cerca di restituire un valore basato su una di queste funzioni integrate volatili, mostreràLoading...
a tempo indeterminato.
Restituisci valori
Ogni funzione personalizzata deve restituire un valore da visualizzare, in modo che:
- Se una funzione personalizzata restituisce un valore, il valore viene visualizzato nella cella da cui è stata chiamata la funzione.
- Se una funzione personalizzata restituisce una matrice bidimensionale di valori, i valori straripano all'interno di celle adiacenti purché tali celle siano vuote. Se in questo modo l'array sovrascrive i contenuti esistenti delle celle, la funzione personalizzata genera invece un errore. Per un esempio, consulta la sezione sull'ottimizzazione delle funzioni personalizzate.
- Una funzione personalizzata non può influire sulle celle diverse da quelle a cui restituisce un valore. In altre parole, una funzione personalizzata non può modificare celle arbitrarie, ma solo le celle da cui viene richiamata e le celle adiacenti. Per modificare celle arbitrarie, utilizza un menu personalizzato per eseguire una funzione.
- Una chiamata di funzione personalizzata deve essere restituita entro 30 secondi. In caso contrario, la cella
mostrerà un errore:
Internal error executing the custom function.
Tipi di dati
Fogli Google archivia i dati in diversi formati a seconda della natura dei dati. Quando questi valori vengono utilizzati nelle funzioni personalizzate, Apps Script li considera il tipo di dati appropriato in JavaScript. Ecco le aree di confusione più comuni:
- Ora e date in Fogli diventano oggetti Data in Apps Script. Se il foglio di lavoro e lo script utilizzano fusi orari diversi (un problema raro), la funzione personalizzata dovrà compensare.
- Anche i valori di durata in Fogli diventano oggetti
Date
, ma lavorare con questi può essere complicato. - I valori percentuali in Fogli diventano numeri decimali in Apps Script. Ad esempio, una cella con il valore
10%
diventa0.1
in Apps Script.
Completamento automatico
Fogli Google supporta il completamento automatico per funzioni personalizzate, in modo molto simile alle funzioni integrate. Mentre digiti il nome di una funzione in una cella, viene visualizzato un elenco di funzioni integrate e personalizzate corrispondenti a ciò che inserisci.
Le funzioni personalizzate vengono visualizzate in questo elenco se il loro script include un tag JsDoc
@customfunction
, come nell'esempio DOUBLE()
riportato di seguito.
/**
* Multiplies the input value by 2.
*
* @param {number} input The value to multiply.
* @return The input multiplied by 2.
* @customfunction
*/
function DOUBLE(input) {
return input * 2;
}
Avanzato
Utilizzo dei servizi Google Apps Script
Le funzioni personalizzate possono chiamare determinati servizi di Google Apps Script per eseguire attività più complesse. Ad esempio, una funzione personalizzata può chiamare il servizio Language per tradurre una frase dall'inglese allo spagnolo.
A differenza della maggior parte degli altri tipi di script di Apps Script, le funzioni personalizzate non chiedono mai agli utenti di autorizzare l'accesso ai dati personali. Di conseguenza, possono chiamare solo servizi che non hanno accesso a dati personali, in particolare i seguenti:
Servizi supportati | Note |
---|---|
Cache | Funziona, ma non è particolarmente utile nelle funzioni personalizzate |
HTML | Può generare HTML, ma non può visualizzarlo (raramente utile) |
JDBC | |
Lingua | |
Blocca | Funziona, ma non è particolarmente utile nelle funzioni personalizzate |
Maps | Consente di calcolare le indicazioni stradali, ma non di visualizzare le mappe |
Proprietà | getUserProperties() riceve solo le proprietà del
proprietario del foglio di lavoro. Gli editor dei fogli di lavoro non possono impostare le proprietà utente in una
funzione personalizzata. |
Foglio di lavoro | Sola lettura (è possibile utilizzare la maggior parte dei metodi get*() , ma non set*() ).Impossibile aprire altri fogli di lavoro ( SpreadsheetApp.openById()
o SpreadsheetApp.openByUrl() ). |
Recupero URL | |
Utilità | |
XML |
Se la tua funzione personalizzata genera il messaggio di errore You do not have permission to
call X service.
, il servizio richiede l'autorizzazione dell'utente e quindi non può essere utilizzato in una funzione personalizzata.
Per utilizzare un servizio diverso da quelli elencati in precedenza, crea un menu personalizzato che esegua una funzione Apps Script anziché scrivere una funzione personalizzata. Una funzione che viene attivata da un menu richiederà l'autorizzazione all'utente, se necessario, e di conseguenza può utilizzare tutti i servizi di Apps Script.
Condivisione
Le funzioni personalizzate vengono avviate associate al foglio di lavoro in cui sono state create. Ciò significa che una funzione personalizzata scritta in un foglio di lavoro non può essere utilizzata in altri fogli di lavoro, a meno che non utilizzi uno dei seguenti metodi:
- Fai clic su Estensioni > Apps Script per aprire l'editor di script, quindi copia il testo dello script dal foglio di lavoro originale e incollalo nell'editor di script di un altro foglio di lavoro.
- Crea una copia del foglio di lavoro che contiene la funzione personalizzata facendo clic su File > Crea una copia. Quando un foglio di lavoro viene copiato, vengono copiati anche tutti gli script allegati. Chiunque abbia accesso al foglio di lavoro può copiare lo script. I collaboratori con accesso solo in visualizzazione non possono aprire l'editor di script nel foglio di lavoro originale. Tuttavia, quando fa una copia, ne diventa il proprietario e può visualizzare lo script).
- Pubblica lo script come componente aggiuntivo dell'Editor di Fogli Google.
Ottimizzazione
Ogni volta che una funzione personalizzata viene utilizzata in un foglio di lavoro, Fogli Google effettua una chiamata separata al server Apps Script. Se il foglio di lavoro contiene decine (o centinaia o migliaia!) di chiamate di funzioni personalizzate, il processo può essere piuttosto lento.
Di conseguenza, se prevedi di utilizzare una funzione personalizzata più volte su un ampio intervallo di dati, ti consigliamo di modificare la funzione in modo che accetti un intervallo come input sotto forma di array bidimensionale, quindi restituisca un array bidimensionale che può fuoriuscire nelle celle appropriate.
Ad esempio, la funzione DOUBLE()
mostrata sopra può essere riscritta in modo da accettare una singola cella o un intervallo di celle come segue:
/**
* Multiplies the input value by 2.
*
* @param {number|Array<Array<number>>} input The value or range of cells
* to multiply.
* @return The input multiplied by 2.
* @customfunction
*/
function DOUBLE(input) {
return Array.isArray(input) ?
input.map(row => row.map(cell => cell * 2)) :
input * 2;
}
L'approccio sopra riportato utilizza il metodo map dell'oggetto Array
di JavaScript per richiamare in modo ricorsivo DOUBLE
su ogni valore nell'array bidimensionale di celle. Restituisce un array bidimensionale che contiene i risultati. In questo modo, puoi chiamare DOUBLE
solo una volta, ma farlo calcolare contemporaneamente per un numero elevato di celle, come mostrato
nello screenshot di seguito. Puoi eseguire la stessa operazione con le istruzioni if
nidificate anziché con la chiamata map
.
Allo stesso modo, la funzione personalizzata riportata di seguito recupera in modo efficiente i contenuti in tempo reale da Internet e utilizza un array bidimensionale per visualizzare due colonne di risultati con una sola chiamata di funzione. Se ogni cella richiede la propria chiamata di funzione, l'operazione richiederebbe molto più tempo, poiché il server Apps Script dovrebbe scaricare e analizzare il feed XML ogni volta.
/**
* Show the title and date for the first page of posts on the
* Developer blog.
*
* @return Two columns of data representing posts on the
* Developer blog.
* @customfunction
*/
function getBlogPosts() {
var array = [];
var url = 'https://gsuite-developers.googleblog.com/atom.xml';
var xml = UrlFetchApp.fetch(url).getContentText();
var document = XmlService.parse(xml);
var root = document.getRootElement();
var atom = XmlService.getNamespace('http://www.w3.org/2005/Atom');
var entries = document.getRootElement().getChildren('entry', atom);
for (var i = 0; i < entries.length; i++) {
var title = entries[i].getChild('title', atom).getText();
var date = entries[i].getChild('published', atom).getValue();
array.push([title, date]);
}
return array;
}
Queste tecniche possono essere applicate a quasi tutte le funzioni personalizzate utilizzate più volte in un foglio di lavoro, anche se i dettagli di implementazione variano a seconda del comportamento della funzione.