Funzioni personalizzate in Fogli Google

Mantieni tutto organizzato con le raccolte Salva e classifica i contenuti in base alle tue preferenze.

Fogli Google offre centinaia di funzioni integrate come AVERAGE, SUM e VLOOKUP. Se questi non sono sufficienti per le tue esigenze, puoi utilizzare Google Apps Script per scrivere funzioni personalizzate, ad esempio convertire gli strumenti in miglia o recuperare i contenuti dal vivo da Internet, quindi utilizzarli in Fogli Google come una funzione integrata.

Per cominciare

Le funzioni personalizzate vengono create tramite 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 funzione personalizzata semplice, denominata DOUBLE, che moltiplica un valore di input per 2:

function DOUBLE(input) {
  return input * 2;
}

Se non sai come scrivere JavaScript e non hai tempo per imparare, controlla nello store dei componenti aggiuntivi per vedere se qualcun altro ha già creato la funzione personalizzata di cui hai bisogno.

Creazione di una funzione personalizzata

Per scrivere una funzione personalizzata:

  1. Crea o apri un foglio di lavoro in Fogli Google.
  2. Seleziona la voce di menu Estensioni > Apps Script.
  3. Elimina qualsiasi codice nell'editor di script. Per la funzione DOUBLE riportata sopra, è sufficiente copiare e incollare il codice nell'editor di script.
  4. Fai clic su Salva in alto.

Ora puoi utilizzare la funzione personalizzata.

Acquisizione 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:

  1. Crea o apri un foglio di lavoro in Fogli Google.
  2. In alto, fai clic su Componenti aggiuntivi > Installa componenti aggiuntivi.
  3. Una volta aperta la Google Workspace Marketplace, fai clic sulla casella di ricerca nell'angolo in alto a destra.
  4. Digita "funzione personalizzata" e premi Invio.
  5. Se trovi un componente aggiuntivo di funzione personalizzata che ti interessa, fai clic su Installa per installarlo.
  6. È possibile che venga visualizzata una finestra di dialogo che indica che il componente aggiuntivo richiede l'autorizzazione. In questo caso, leggi attentamente la notifica e fai clic su Consenti.
  7. 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 che vuoi utilizzare e fai clic su Opzioni > Utilizza in questo documento.

Utilizzare una funzione personalizzata

Dopo aver scritto una funzione personalizzata o averne installato una daGoogle Workspace Marketplace, è facile da utilizzare come una funzione integrata:

  1. Fai clic sulla cella in cui vuoi utilizzare la funzione.
  2. Digita un segno di uguale (=) seguito dal nome della funzione e da qualsiasi valore di input, ad esempio =DOUBLE(A1), e premi Invio.
  3. La cella mostrerà temporaneamente Loading..., quindi restituirà il risultato.

Linee guida per le funzioni personalizzate

Prima di scrivere una funzione personalizzata, è necessario 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 distinto 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 con la sintassi function myFunction(), non con var myFunction = new Function().
  • L'uso delle lettere maiuscole non è rilevante, anche se i nomi delle funzioni dei fogli di lavoro sono generalmente maiuscole.

Argomenti

Come una funzione integrata, una funzione personalizzata può assumere 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 (come =DOUBLE(A1:B10)), l'argomento sarà una matrice bidimensionale dei valori'. Ad esempio, nello screenshot di seguito, gli argomenti in =DOUBLE(A1:B2) sono interpretati da Apps Script come double([[1,3],[2,4]]). Tieni presente che il codice di esempio di DOUBLE vedi sopra dovrebbe essere modificato per accettare un array come input.


  • Gli argomenti delle funzioni personalizzate devono essere deterministici. In altre parole, le funzioni integrate dei fogli di lavoro che restituiscono un risultato diverso ogni volta che vengono calcolate, come NOW() o RAND(), non sono consentite come argomenti per una funzione personalizzata. Se una funzione personalizzata tenta di restituire un valore in base a una di queste funzioni volatili integrate, mostrerà Loading... a tempo indeterminato.

Valori restituiti

Ogni funzione personalizzata deve restituire un valore da visualizzare, in modo che:

  • Se una funzione personalizzata restituisce un valore, viene visualizzato nella cella da cui è stata richiamata la funzione.
  • Se una funzione personalizzata restituisce un array di valori bidimensionali, i relativi valori superano le celle adiacenti, purché quelle celle siano vuote. Se questo causa la sovrascrittura del contenuto della cella esistente, la funzione personalizzata genera un errore. Per un esempio, consulta la sezione sull'ottimizzazione delle funzioni personalizzate.
  • Una funzione personalizzata non può influire su celle diverse da quelle a cui restituisce un valore. In altre parole, una funzione personalizzata non può modificare le celle arbitrarie, solo le celle da cui è chiamata e le celle adiacenti. Per modificare celle arbitrarie, utilizza un menu personalizzato per eseguire una funzione.
  • Una chiamata funzione personalizzata deve tornare 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 formati diversi a seconda della natura dei dati. Quando questi valori vengono utilizzati nelle funzioni personalizzate, Apps Script li considera come il tipo di dati appropriato in JavaScript. Di seguito sono riportate le aree più comuni di confusione:

  • Orari 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 della durata in Fogli diventano oggetti Date, ma utilizzarli può essere complicato.
  • I valori percentuali in Fogli diventano numeri decimali in Apps Script. Ad esempio, una cella con valore 10% diventa 0.1 in Apps Script.

Completamento automatico

Fogli Google supporta il completamento automatico per le funzioni personalizzate, come per le funzioni integrate. Mentre digiti il nome di una funzione in una cella, verrà visualizzato un elenco di funzioni integrate e personalizzate corrispondenti a ciò che inserisci.

Le funzioni personalizzate verranno 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;
}

Avanzate

Utilizzo dei servizi Apps Script

Le funzioni personalizzate possono chiamare determinati servizi Apps Script per svolgere attività più complesse. Ad esempio, una funzione personalizzata può chiamare il servizio Language per tradurre una frase inglese in spagnolo.

A differenza della maggior parte degli altri tipi di script, le funzioni personalizzate non richiedono mai agli utenti di autorizzare l'accesso ai dati personali. Di conseguenza, possono chiamare solo i servizi che non hanno accesso ai dati personali, in particolare:

Servizi supportati Note
Cache Funziona, ma non è particolarmente utile nelle funzioni personalizzate
HTML Può generare codice HTML, ma non può visualizzarlo (raramente utile)
JDBC
Language
Blocca Funziona, ma non è particolarmente utile nelle funzioni personalizzate
Maps Può calcolare le indicazioni stradali, ma non visualizzare le mappe
Proprietà getUserProperties() riceve solo le proprietà del proprietario del foglio di lavoro. Gli editor di fogli di lavoro non possono impostare le proprietà utente in una funzione personalizzata.
Foglio di lavoro Sola lettura (può 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 chiede all'utente l'autorizzazione, se necessario, e può quindi utilizzare tutti i servizi Apps Script.

Condivisione

Le funzioni personalizzate iniziano 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 copiare il testo dello script dal foglio di lavoro originale e incollarlo 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 si copia un foglio di lavoro, vengono copiati anche tutti gli script allegati. Chiunque abbia accesso al foglio di lavoro può copiare lo script. I collaboratori che hanno solo l'accesso in visualizzazione non possono aprire l'editor di script nel foglio di lavoro originale. Tuttavia, quando creano una copia, ne diventano proprietari e possono visualizzare lo script.
  • Pubblica lo script come componente aggiuntivo di Fogli Google.

Ottimizzazione

Ogni volta che si utilizza una funzione personalizzata 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 personalizzate, la procedura può essere molto lenta.

Di conseguenza, se prevedi di utilizzare una funzione personalizzata più volte in un ampio intervallo di dati, valuta la possibilità 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 per 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 utilizza il metodo map dell'oggetto Array di JavaScript per chiamare in modo ricorsivo DOUBLE su ogni valore nell'array bidimensionale di celle. Restituisce una matrice bidimensionale che contiene i risultati. In questo modo, puoi chiamare DOUBLE una sola volta, ma fare in modo che venga calcolato per un numero elevato di celle contemporaneamente, come mostrato nello screenshot di seguito. Puoi svolgere la stessa operazione con le istruzioni if nidificate anziché con la chiamata map.

Analogamente, la funzione personalizzata 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 ha richiesto una propria chiamata funzione, l'operazione richiederebbe molto più tempo, dato che il server Apps Script dovrebbe scaricare e analizzare ogni volta il feed XML.

/**
 * 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 ripetutamente in un foglio di lavoro, anche se i dettagli di implementazione varieranno a seconda del comportamento della funzione.