In Google Apps Script e JavaScript, un runtime o un ambiente di runtime contiene il motore JavaScript che analizza ed esegue il codice dello script. Il runtime fornisce regole per l'accesso alla memoria, per l'interazione del programma con il sistema operativo del computer e per la sintassi legale del programma. Ogni browser web ha un ambiente di runtime per JavaScript.
Storicamente, Apps Script è stato alimentato dall'interprete JavaScript Rhino di Mozilla. Sebbene Rhino offrisse un modo pratico per Apps Script di eseguire script per sviluppatori, vincolava Apps Script a una versione specifica di JavaScript (ES5). Gli sviluppatori di Apps Script non possono utilizzare sintassi e funzionalità JavaScript più moderne negli script che utilizzano il runtime Rhino.
Per risolvere questo problema, Apps Script è ora supportato dal runtime V8 che alimenta Chrome e Node.js. Esegui la migrazione degli script esistenti a V8 per sfruttare la sintassi e le funzionalità JavaScript moderne.
Questa pagina descrive le nuove funzionalità abilitate da V8 e come puoi attivarlo per l'utilizzo negli script. Esegui la migrazione degli script a V8 descrive i passaggi per eseguire la migrazione degli script esistenti in modo che utilizzino il runtime V8.
Funzionalità del runtime V8
Gli script che utilizzano il runtime V8 possono sfruttare le seguenti funzionalità:
Sintassi ECMAScript moderna
Utilizza la sintassi ECMAScript moderna negli script basati sul runtime V8. Questa sintassi include
let, const e molte altre funzionalità popolari.
Consulta Esempi di sintassi V8 per un breve elenco di miglioramenti della sintassi che puoi apportare utilizzando il runtime V8.
Il runtime Apps Script V8 presenta alcune limitazioni e differenze chiave rispetto ad altri runtime JavaScript comuni. Per ulteriori dettagli, consulta la sezione Limitazioni del runtime V8 di Apps Script.
Rilevamento delle funzioni migliorato
Il rilevamento delle funzioni Apps Script è migliorato per gli script che utilizzano V8. Il nuovo runtime riconosce questi formati di definizione delle funzioni:
function normalFunction() {} async function asyncFunction() {} function* generatorFunction() {} var varFunction = function() {} let letFunction = function() {} const constFunction = function() {} var namedVarFunction = function alternateNameVarFunction() {} let namedLetFunction = function alternateNameLetFunction() {} const namedConstFunction = function alternateNameConstFunction() {} var varAsyncFunction = async function() {} let letAsyncFunction = async function() {} const constAsyncFunction = async function() {} var namedVarAsyncFunction = async function alternateNameVarAsyncFunction() {} let namedLetAsyncFunction = async function alternateNameLetAsyncFunction() {} const namedConstAsyncFunction = async function alternateNameConstAsyncFunction() {} var varGeneratorFunction = function*() {} let letGeneratorFunction = function*() {} const constGeneratorFunction = function*() {} var namedVarGeneratorFunction = function* alternateNameVarGeneratorFunction() {} let namedLetGeneratorFunction = function* alternateNameLetGeneratorFunction() {} const namedConstGeneratorFunction = function* alternateNameConstGeneratorFunction() {} var varLambda = () => {} let letLambda = () => {} const constLambda = () => {} var varAsyncLambda = async () => {} let letAsyncLambda = async () => {} const constAsyncLambda = async () => {}
Chiamare i metodi degli oggetti da trigger e callback
Gli script che utilizzano V8 possono chiamare metodi di oggetti e metodi statici di classi da posizioni in cui era già possibile chiamare metodi di librerie. Questi luoghi includono:
- Trigger manifest dei componenti aggiuntivi di Google Workspace
- Trigger installabili
- Voci di menu negli editor di Google Workspace
- Funzioni di callback dell'utente, come quella descritta nell'esempio di codice
ScriptApp.newStateToken().
Il seguente esempio di V8 mostra l'utilizzo dei metodi degli oggetti durante la creazione di voci di menu in Fogli Google:
function onOpen() {
const ui = SpreadsheetApp.getUi(); // Or DocumentApp, SlidesApp, or FormApp.
ui.createMenu('Custom Menu')
.addItem('First item', 'menu.item1')
.addSeparator()
.addSubMenu(ui.createMenu('Sub-menu')
.addItem('Second item', 'menu.item2'))
.addToUi();
}
const menu = {
item1: function() {
SpreadsheetApp.getUi().alert('You clicked: First item');
},
item2: function() {
SpreadsheetApp.getUi().alert('You clicked: Second item');
}
}
Visualizza i log
Apps Script fornisce due servizi di logging: il
servizio Logger e la
classe console. Entrambi questi servizi
scrivono i log nello stesso
servizio Stackdriver Logging.
Per visualizzare i log di Logger e console, fai clic su
Log esecuzione nella parte superiore dell'editor di script.
Visualizza esecuzioni
Per visualizzare la cronologia di esecuzione dello script, apri il progetto Apps Script e fai clic su Esecuzioni a sinistra .
Il riquadro Esecuzioni non fornisce log con timestamp delle singole chiamate di servizio Apps Script. Utilizza il servizio
console per creare messaggi di log
appropriati. Tutti i log creati con
console vengono visualizzati nel riquadro
Esecuzioni.
Esempi di sintassi V8
Di seguito è riportato un breve elenco di funzionalità sintattiche comuni disponibili per gli script che utilizzano il runtime V8.
let e const
Le parole chiave let
e const
consentono di definire rispettivamente le variabili locali e le costanti
con ambito di blocco.
// V8 runtime let s = "hello"; if (s === "hello") { s = "world"; console.log(s); // Prints "world" } console.log(s); // Prints "hello" const N = 100; N = 5; // Results in TypeError |
Funzioni freccia
Le funzioni freccia offrono un modo compatto per definire le funzioni all'interno delle espressioni.
// Rhino runtime function square(x) { return x * x; } console.log(square(5)); // Outputs 25 |
// V8 runtime const square = x => x * x; console.log(square(5)); // Outputs 25 // Outputs [1, 4, 9] console.log([1, 2, 3].map(x => x * x)); |
Corsi
Le classi forniscono un mezzo per organizzare concettualmente il codice con l'ereditarietà. Le classi in V8 sono principalmente zucchero sintattico rispetto all'ereditarietà basata su prototipi JavaScript.
// V8 runtime class Rectangle { constructor(width, height) { // class constructor this.width = width; this.height = height; } logToConsole() { // class method console.log(`Rectangle(width=${this.width}, height=${this.height})`); } } const r = new Rectangle(10, 20); r.logToConsole(); // Outputs Rectangle(width=10, height=20) |
Assegnazioni di destrutturazione
Le espressioni di assegnazione destrutturante sono un modo rapido per estrarre valori da array e oggetti in variabili distinte.
// Rhino runtime var data = {a: 12, b: false, c: 'blue'}; var a = data.a; var c = data.c; console.log(a, c); // Outputs 12 "blue" var a = [1, 2, 3]; var x = a[0]; var y = a[1]; var z = a[2]; console.log(x, y, z); // Outputs 1 2 3 |
// V8 runtime const data = {a: 12, b: false, c: 'blue'}; const {a, c} = data; console.log(a, c); // Outputs 12 "blue" const array = [1, 2, 3]; const [x, y, z] = array; console.log(x, y, z); // Outputs 1 2 3 |
Template letterali
I template literal sono stringhe letterali che consentono espressioni incorporate. Ti consentono di evitare istruzioni di concatenazione di stringhe più complesse.
// Rhino runtime var name = 'Hi ' + first + ' ' + last + '.'; var url = 'http://localhost:3000/api/messages/' + id; |
// V8 runtime const name = `Hi ${first} ${last}.`; const url = `http://localhost:3000/api/messages/${id}`; |
Parametri predefiniti
I parametri predefiniti consentono di specificare i valori predefiniti per i parametri della funzione nella dichiarazione della funzione. In questo modo, il codice nel corpo della funzione può essere semplificato, in quanto non è più necessario assegnare esplicitamente valori predefiniti ai parametri mancanti.
// Rhino runtime function hello(greeting, name) { greeting = greeting || "hello"; name = name || "world"; console.log( greeting + " " + name + "!"); } hello(); // Outputs "hello world!" |
// V8 runtime const hello = function(greeting="hello", name="world") { console.log( greeting + " " + name + "!"); } hello(); // Outputs "hello world!" |
Stringhe multiriga
Definisci stringhe su più righe utilizzando la stessa sintassi dei template letterali. Come per i letterali modello, questa sintassi ti consente di evitare le concatenazioni di stringhe e semplificare le definizioni di stringhe.
// Rhino runtime var multiline = "This string is sort of\n" + "like a multi-line string,\n" + "but it's not really one."; |
// V8 runtime const multiline = `This on the other hand, actually is a multi-line string, thanks to JavaScript ES6`; |
Limitazioni del runtime V8
Il runtime V8 di Apps Script non è un ambiente Node.js o browser standard. Ciò può causare problemi di compatibilità quando chiami librerie di terze parti o adatti esempi di codice di altri ambienti JavaScript.
API non disponibili
Le seguenti API JavaScript standard NON sono disponibili nel runtime V8 di Apps Script:
- Timer:
setTimeout,setInterval,clearTimeout,clearInterval - Stream:
ReadableStream,WritableStream,TextEncoder,TextDecoder - API web:
fetch,FormData,File,Blob,URL,URLSearchParams,DOMException,atob,btoa - Crypto:
crypto,SubtleCrypto - Oggetti globali:
window,navigator,performance,process(Node.js)
Utilizza le seguenti API Apps Script come alternative:
- Timer: utilizza
Utilities.sleepper le pause sincrone. I timer asincroni non sono supportati. - Recupero: utilizza
UrlFetchApp.fetch(url, params)per effettuare richieste HTTP(S). - atob: utilizza
Utilities.base64Decodeper decodificare le stringhe codificate in Base64. - btoa: utilizza
Utilities.base64Encodeper codificare le stringhe in Base64. - Crypto: utilizza
Utilitiesper le funzioni crittografiche comecomputeDigest,computeHmacSha256SignatureecomputeRsaSha256Signature.
Per le API senza un'alternativa Apps Script, come TextEncoder,
a volte puoi utilizzare un polyfill. Un polyfill è una libreria che replica la funzionalità
dell'API che non è disponibile per impostazione predefinita nell'ambiente di runtime.
Prima di utilizzare un polyfill, verifica che sia compatibile con
il runtime V8 di Apps Script.
Limitazioni asincrone
Il runtime V8 supporta la sintassi async e await e l'oggetto Promise.
Tuttavia, l'ambiente di runtime di Apps Script è fondamentalmente
sincrono.
- Microtask (supportate): il runtime elabora la coda di microtask (in cui si verificano i callback
Promise.thene le risoluzioniawait) dopo che lo stack di chiamate corrente viene cancellato. - Macroattività (non supportata): Apps Script non ha un ciclo di eventi standard per le macroattività. Funzioni come
setTimeoutesetIntervalnon sono disponibili. - Eccezione WebAssembly: l'API WebAssembly è l'unica funzionalità integrata che opera in modo non bloccante all'interno del runtime, consentendo pattern di compilazione asincrona specifici (WebAssembly.instantiate).
Tutte le operazioni di I/O, ad esempio
UrlFetchApp.fetch, sono
bloccanti. Per ottenere richieste di rete parallele, utilizza
UrlFetchApp.fetchAll.
Limitazioni dei corsi
Il runtime V8 presenta limitazioni specifiche relative alle funzionalità delle classi ES6+:
- Campi privati: i campi privati della classe (ad esempio,
#field) non sono supportati e causano errori di analisi. Valuta la possibilità di utilizzare chiusure oWeakMapper una vera incapsulamento. - Campi statici: le dichiarazioni di campi statici diretti all'interno del corpo della classe
(ad esempio,
static count = 0;) non sono supportate. Assegna proprietà statiche alla classe dopo la sua definizione (ad esempio,MyClass.count = 0;).
Limitazioni del modulo
- Moduli ES6: il runtime V8 non supporta i moduli ES6 (
import/export). Per utilizzare le librerie, devi utilizzare il meccanismo delle librerie di Apps Script o raggruppare il codice e le relative dipendenze in un unico file di script. (Issue Tracker) - Ordine di esecuzione dei file: tutti i file di script nel progetto vengono eseguiti in un ambito globale. È meglio evitare il codice di primo livello con effetti collaterali e assicurarsi che funzioni e classi siano definite prima di essere utilizzate nei file. Ordina esplicitamente i file nell'editor se esistono dipendenze tra loro.
Abilita il runtime V8
Se uno script utilizza il runtime Rhino, passa a V8 procedendo come segue:
- Apri il progetto Apps Script.
- A sinistra, fai clic su Impostazioni progetto .
- Seleziona la casella di controllo Abilita il runtime Chrome V8.
In alternativa, specifica il runtime dello script direttamente modificando il file manifest dello script:
- Apri il progetto Apps Script.
- A sinistra, fai clic su Impostazioni progetto .
- Seleziona la casella di controllo Mostra il file manifest "appsscript.json" nell'editor.
- A sinistra, fai clic su Editor >
appsscript.json. - Nel file manifest
appsscript.json, imposta il camporuntimeVersionsul valoreV8. - In alto, fai clic su Salva progetto .
Migrazione degli script a V8 spiega altri passaggi da seguire per garantire il corretto funzionamento dello script utilizzando V8.
Attiva il runtime Rhino
Se il tuo script utilizza V8 e devi passare al runtime Rhino originale, procedi nel seguente modo:
- Apri il progetto Apps Script.
- A sinistra, fai clic su Impostazioni progetto .
- Deseleziona la casella di controllo Abilita il runtime Chrome V8.
In alternativa, modifica il manifest dello script:
- Apri il progetto Apps Script.
- A sinistra, fai clic su Impostazioni progetto .
- Seleziona la casella di controllo Mostra il file manifest "appsscript.json" nell'editor.
- A sinistra, fai clic su Editor >
appsscript.json. - Nel file manifest
appsscript.json, imposta il camporuntimeVersionsul valoreDEPRECATED_ES5. - In alto, fai clic su Salva progetto .
Come faccio a eseguire la migrazione degli script esistenti?
La guida Esegui la migrazione degli script a V8 descrive i passaggi da seguire per eseguire la migrazione di uno script esistente in modo che utilizzi V8. Ciò comporta l'attivazione del runtime V8 e il controllo dello script per verificare la presenza di eventuali incompatibilità note.
Migrazione automatica degli script a V8
A partire dal 18 febbraio 2020, Google esegue gradualmente la migrazione degli script esistenti che superano il nostro test di compatibilità automatizzato a V8. Gli script interessati continuano a funzionare normalmente dopo la migrazione.
Se vuoi disattivare la migrazione automatica di uno script, imposta il campo
runtimeVersion
nel relativo manifest su DEPRECATED_ES5. Scegli di migrare lo script a V8 manualmente in qualsiasi momento successivo.
Come faccio a segnalare i bug?
La Guida all'assistenza spiega come ottenere assistenza per la programmazione su Stack Overflow, cercare report di problemi esistenti, segnalare nuovi bug e inviare nuove richieste di funzionalità.