Migrazione alla modalità IFRAME Sandbox

Apps Script utilizza una sandbox per la sicurezza per fornire isolamento protettivo per Google Workspacele applicazioni in determinate situazioni. Tutte le modalità sandbox sono ora ritirate, ad eccezione di IFRAME. Le app che utilizzano modalità sandbox precedenti ora usano automaticamente la nuova modalità IFRAME.

Le app che in precedenza utilizzavano queste modalità meno recenti con HTML Service potrebbero dover apportare modifiche alla modalità IFRAME per risolvere le seguenti differenze:

  • Ora devi sostituire l'attributo target del link utilizzando target="_top" o target="_blank"
  • I file HTML pubblicati dal servizio HTML devono includere tag <!DOCTYPE html>, <html> e <body>
  • La libreria di caricamento nativo di Google api.js non viene caricata automaticamente in modalità IFRAME
  • Selettore che gli utenti devono chiamare setOrigin() perché i contenuti vengono pubblicati da un nuovo dominio
  • Alcuni browser meno recenti, incluso IE9, non sono supportati
  • Le risorse importate devono ora utilizzare HTTPS
  • L'invio di moduli non è più bloccato per impostazione predefinita

Queste differenze sono descritte in dettaglio nelle sezioni seguenti.

Nella modalità IFRAME devi impostare l'attributo target del link su _top o _blank:

Code.js

function doGet() {
  var template = HtmlService.createTemplateFromFile('top');
  return template.evaluate();
}

top.html

<!DOCTYPE html>
<html>
 <body>
   <div>
     <a href="http://google.com" target="_top">Click Me!</a>
   </div>
 </body>
</html>

Puoi anche sostituire questo attributo utilizzando il tag <base> all'interno della sezione head della pagina web che la include:

<!DOCTYPE html>
<html>
  <head>
    <base target="_top">
  </head>
  <body>
   <div>
     <a href="http://google.com">Click Me!</a>
   </div>
 </body>
</html>

Tag HTML di primo livello

In modalità sandbox NATIVE (e EMULATED), alcuni tag HTML vengono aggiunti automaticamente a un file .html di Apps Script, ma questo non accade quando si utilizza la modalità IFRAME.

Per assicurarti che le pagine del progetto vengano pubblicate correttamente utilizzando IFRAME, aggrega i contenuti della pagina nei seguenti tag di primo livello:

<!DOCTYPE html>
<html>
  <body>
    <!-- Add your HTML content here -->
  </body>
</html>

La libreria del caricatore JavaScript nativo deve essere caricata esplicitamente

Gli script che si basano sul caricamento automatico della libreria di caricamento nativo api.js devono essere modificati per caricare esplicitamente questa libreria, come nell'esempio seguente:

<script src="https://apis.google.com/js/api.js?onload=onApiLoad">
</script>

Modifica all'API Google Picker

Quando utilizzi l'API Google Picker, ora devi chiamare setOrigin() durante la creazione di PickerBuilder e passare nell'origine google.script.host.origin, come mostrato nell'esempio seguente:

function createPicker(oauthToken) {
  var picker = new google.picker.PickerBuilder()
      .addView(google.picker.ViewId.SPREADSHEETS) // Or a different ViewId
      .setOAuthToken(oauthToken)
      .setDeveloperKey(developerKey)
      .setCallback(pickerCallback)
      .setOrigin(google.script.host.origin) // Note the setOrigin
      .build();
  picker.setVisible(true);
}

Per un esempio funzionante completo, consulta Finestre di dialogo apertura file.

Supporto del browser

La modalità sandbox IFRAME si basa sulla funzionalità di sandboxing degli iframe in HTML5. Questa funzionalità non è supportata in alcuni browser meno recenti, come Internet Explorer 9. Questo può essere un problema se il tuo progetto Apps Script:

  • usa HtmlService e
  • sandboxing EMULATED o NATIVE utilizzato in precedenza

La migrazione di queste app alla modalità sandbox IFRAME significa che potrebbero non funzionare più su alcuni browser meno recenti (in particolare IE9 e versioni precedenti) che non supportano la funzionalità di sandboxing iframe di HTML5.

Le app che richiedono già la modalità IFRAME o che non utilizzano HtmlService non sono interessate da questo problema.

HTTPS è ora obbligatorio per le risorse importate

Le applicazioni precedenti che importavano risorse tramite HTTP devono essere modificate in modo da utilizzare HTTPS.

L'invio di moduli non è più bloccato per impostazione predefinita

In NATIVE è stato impedito l'invio e la navigazione della pagina ai moduli HTML tramite sandbox. Detto questo, uno sviluppatore potrebbe semplicemente aggiungere un gestore onclick al pulsante di invio e non deve preoccuparsi di cosa è successo dopo.

Con la modalità IFRAME, tuttavia, i moduli HTML possono essere inviati e se un elemento modulo non ha specificato un attributo action, verrà inviato a una pagina vuota. Peggio ancora, l'iframe interno reindirizza alla pagina vuota prima che il gestore onclick abbia la possibilità di completare la procedura.

La soluzione consiste nell'aggiungere codice JavaScript alla pagina che impedisca l'invio effettivo degli elementi del modulo, in modo che i gestori dei clic abbiano il tempo di funzionare:

<script>
  // Prevent forms from submitting.
  function preventFormSubmit() {
    var forms = document.querySelectorAll('form');
    for (var i = 0; i < forms.length; i++) {
      forms[i].addEventListener('submit', function(event) {
        event.preventDefault();
      });
    }
  }
  window.addEventListener('load', preventFormSubmit);
</script>

Un esempio completo è disponibile nella comunicazione client-server della guida di htmlService.