Migrazione alla modalità IFRAME Sandbox

Apps Script utilizza una sandbox per la sicurezza per fornire l'isolamento protettivo per Google Workspace le applicazioni in determinate situazioni. Tutte le modalità sandbox sono state ritirate ad eccezione di IFRAME. Le app che usano modalità sandbox precedenti ora usano automaticamente la modalità IFRAME più recente.

Le app che utilizzavano in precedenza queste modalità meno recenti con il servizio HTML 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 <!DOCTYPE html>, <html> e <body>
  • La libreria di caricamento nativo di Google api.js non si carica automaticamente in modalità IFRAME
  • Gli utenti del selettore devono chiamare setOrigin() perché i contenuti vengono pubblicati da un nuovo dominio
  • Alcuni browser meno recenti, tra cui IE9, non sono supportati
  • Le risorse importate ora devono utilizzare HTTPS
  • L'invio dei moduli non è più impedito per impostazione predefinita

Queste differenze sono descritte in dettaglio nelle sezioni seguenti.

In modalità IFRAME, devi impostare l'attributo di destinazione 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> nella sezione head della pagina web che lo contiene:

<!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 succede 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 di caricamento JavaScript nativa deve essere caricata in modo esplicito

Gli script basati sul caricamento automatico della libreria di caricamento nativa api.js devono essere modificati in modo da caricare esplicitamente questa libreria, come nell'esempio seguente:

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

Modifica API Google Selecter

Quando utilizzi l'API Google Selecter, ora devi chiamare setOrigin() durante la creazione del PickerBuilder e passare l'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 completo funzionante, vedi Finestre di dialogo di apertura file.

Supporto del browser

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

  • usa HtmlService e
  • sandbox EMULATED o NATIVE utilizzata in precedenza

La migrazione di queste app alla modalità sandbox di IFRAME potrebbe 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 non utilizzano affatto HtmlService non sono interessate da questo problema.

Ora è richiesto HTTPS per le risorse importate

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

L'invio dei moduli non è più impedito per impostazione predefinita

In NATIVE, è stato impedito l'invio e la navigazione della pagina tramite la sandbox dei moduli HTML. Detto questo, uno sviluppatore potrebbe semplicemente aggiungere un gestore onclick al pulsante di invio senza doversi preoccupare di quello che è successo dopo.

Con la modalità IFRAME, invece, è possibile inviare moduli HTML e, se per un elemento del modulo non è specificato un attributo action, verrà inviato a una pagina vuota. Peggio ancora, l'iframe interno reindirizzerà alla pagina vuota prima che il gestore onclick abbia la possibilità di terminare.

La soluzione consiste nell'aggiungere alla pagina codice JavaScript che impedisca l'effettivo invio degli elementi 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>

Puoi trovare un esempio completo nella guida di HTMLService per la comunicazione client-server.