Best practice

Questo documento elenca le best practice per migliorare il rendimento degli script.

Riduci al minimo le chiamate ad altri servizi

L'utilizzo di operazioni JavaScript all'interno dello script è più veloce della chiamata ad altri servizi. Qualsiasi operazione che esegui all'interno di Google Apps Script è più veloce del recupero dei dati dai server di Google o da un server esterno, ad esempio le richieste a Fogli, Documenti, Sites, Sites, Traduttore e UrlFetch. Gli script verranno eseguiti più velocemente se riduci al minimo le chiamate ai servizi.

Collabora con i Drive condivisi

Se lavori a un progetto di script con altri sviluppatori, collabora utilizzando i Drive condivisi. I file che si trovano su un Drive condiviso sono di proprietà del gruppo anziché delle singole persone, il che semplifica lo sviluppo e la manutenzione del progetto.

Utilizza le operazioni batch

In genere, gli script leggono i dati da un foglio di lavoro, eseguono calcoli e riscrivono i risultati. Apps Script utilizza l'ottimizzazione integrata, come la cache di lettura anticipata e di scrittura.

Ottimizza la memorizzazione nella cache integrata riducendo al minimo le operazioni di lettura e scrittura. L'alternanza dei comandi di lettura e scrittura è lenta. Per velocizzare uno script, leggi tutti i dati in un array con un solo comando, esegui le operazioni sui dati dell'array e scrivi i dati con un solo comando.

Evita di alternare le operazioni di lettura e scrittura come mostrato in questo esempio inefficiente:

// DO NOT USE THIS CODE. It is an example of SLOW, INEFFICIENT code.
// FOR DEMONSTRATION ONLY
var cell = sheet.getRange('a1');
for (var y = 0; y < 100; y++) {
  xcoord = xmin;
  for (var x = 0; x < 100; x++) {
    var c = getColorFromCoordinates(xcoord, ycoord);
    cell.offset(y, x).setBackgroundColor(c);
    xcoord += xincrement;
  }
  ycoord -= yincrement;
  SpreadsheetApp.flush();
}

Lo script è inefficiente perché esegue un loop su 10.000 celle con scritture consecutive. Sebbene la cache di riscrittura sia utile, il raggruppamento delle chiamate è molto più efficiente:

// OKAY TO USE THIS EXAMPLE or code based on it.
var cell = sheet.getRange('a1');
var colors = new Array(100);
for (var y = 0; y < 100; y++) {
  xcoord = xmin;
  colors[y] = new Array(100);
  for (var x = 0; x < 100; x++) {
    colors[y][x] = getColorFromCoordinates(xcoord, ycoord);
    xcoord += xincrement;
  }
  ycoord -= yincrement;
}
sheet.getRange(1, 1, 100, 100).setBackgrounds(colors);

L'esecuzione del codice inefficiente richiede circa 70 secondi, mentre quella del codice efficiente solo 1 secondo.

Evita le librerie negli script con molte UI

Le librerie sono utili per riutilizzare il codice, ma aumentano il tempo di avvio degli script. Questo ritardo è evidente nelle interfacce utente di HTML Service lato client che effettuano chiamate di breve durata google.script.run ripetute. Utilizza le librerie con parsimonia nei componenti aggiuntivi ed evita di utilizzarle negli script che effettuano molte google.script.run chiamate.

Utilizza il servizio Cache

Utilizza il servizio Cache per memorizzare nella cache le risorse tra le esecuzioni degli script. La memorizzazione nella cache riduce la frequenza di recupero dei dati. L'esempio seguente mostra come utilizzare il servizio Cache per velocizzare l'accesso a un feed RSS lento.

function getRssFeed() {
  var cache = CacheService.getScriptCache();
  var cached = cache.get("rss-feed-contents");
  if (cached != null) {
    return cached;
  }
  // This fetch takes 20 seconds:
  var result = UrlFetchApp.fetch("http://example.com/my-slow-rss-feed.xml");
  var contents = result.getContentText();
  cache.put("rss-feed-contents", contents, 1500); // cache for 25 minutes
  return contents;
}

Anche se devi attendere 20 secondi se l'elemento non è nella cache, gli accessi successivi sono veloci fino alla scadenza dell'elemento.

Set di dati di grandi dimensioni e calcoli complessi

Fogli Google è uno strumento potente, ma man mano che i set di dati aumentano e i calcoli diventano più complessi, potresti riscontrare problemi di rendimento come il ritardo del foglio di lavoro, errori IMPORTRANGE e timeout degli script.

Quando utilizzare un database

Se il foglio di lavoro si avvicina al limite di 10 milioni di celle o se hai molti moduli collegati (ad es. 10 o più) e formule complesse tra i fogli, valuta la possibilità di utilizzare una soluzione di database dedicata.

  • Google Cloud SQL: un servizio di database relazionale completamente gestito per MySQL, PostgreSQL e SQL Server. Utilizza il servizio JDBC per connetterti a Cloud SQL o ad altri database esterni come Oracle o MongoDB (tramite i bridge appropriati).
  • BigQuery: un data warehouse serverless e altamente scalabile. Puoi utilizzare Fogli connessi per analizzare set di dati di grandi dimensioni di BigQuery direttamente in Fogli o utilizzare il servizio BigQuery per interagire con i dati da Apps Script.

Ottimizzazione del rendimento delle formule

L'utilizzo intensivo di alcune formule può rallentare il foglio di lavoro:

  • ARRAYFORMULA: sebbene sia utile, i calcoli ARRAYFORMULA su larga scala possono essere costosi.
  • VLOOKUP e OFFSET: queste funzioni possono essere lente su set di dati di grandi dimensioni. Valuta la possibilità di utilizzare INDEX e MATCH o Apps Script per eseguire le ricerche in modo più efficiente in memoria.
  • IMPORTRANGE: l'utilizzo frequente di IMPORTRANGE in molti fogli può causare "Errori interni" se i fogli di origine sono di grandi dimensioni o sono sottoposti a un carico elevato. Il consolidamento dei dati in un'origine centralizzata può essere utile.

Gestione del timeout degli script

Apps Script ha limiti di tempo di esecuzione (in genere 6 minuti per esecuzione o 30 minuti per alcuni account Google Workspace). Se lo script si arresta di frequente perché supera il limite di esecuzione:

  1. Utilizza le operazioni batch: come indicato nella sezione Utilizza le operazioni batch, riduci al minimo le chiamate ai fogli di lavoro e ad altri servizi.
  2. Dividi le attività: dividi le attività di grandi dimensioni in blocchi più piccoli che possono essere completati entro il limite di tempo.
  3. Utilizza i trigger per le continuazioni: configura un trigger installabile basato sul tempo per riprendere un processo di lunga durata. Lo script può memorizzare il suo stato attuale (ad es. l'indice dell'ultima riga elaborata) utilizzando il servizio Proprietà e continuare da quel punto nell'esecuzione successiva.