Migrazione alla modalità IFRAME Sandbox

Apps Script utilizza una sandbox di sicurezza per fornire un isolamento protettivo per le applicazioni in determinate situazioni. Google WorkspaceTutte le modalità sandbox sono ora ritirate, ad eccezione di IFRAME. Le app che utilizzano modalità sandbox meno recenti ora utilizzano automaticamente la modalità IFRAME più recente.

Le app che in precedenza utilizzavano queste modalità precedenti con il servizio HTML potrebbero dover apportare modifiche per la 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 i tag <!DOCTYPE html>, <html> e <body>
  • La libreria del caricatore nativo di Google api.js non si carica automaticamente in modalità IFRAME
  • Gli utenti di Picker 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.

Nella modalità IFRAME devi impostare l'attributo link target 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 contenente:

<!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, racchiudi 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 basavano sul caricamento automatico della libreria del caricatore nativo api.js devono essere modificati in modo da caricare questa libreria in modo esplicito, 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 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, consulta Finestre di dialogo di apertura dei file.

Supporto browser

La modalità sandbox IFRAME si basa sulla funzionalità di sandboxing 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 di Apps Script:

  • utilizza HtmlService e
  • ha utilizzato in precedenza la sandboxing EMULATED o NATIVE

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 degli iframe di HTML5.

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

HTTPS è ora obbligatorio per le risorse importate

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

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

In NATIVE, la sandboxing dei moduli HTML ha impedito l'invio effettivo e la navigazione nella pagina. Di conseguenza, uno sviluppatore potrebbe semplicemente aggiungere un onclick traduttore al pulsante di invio e non preoccuparsi di cosa succede dopo.

Tuttavia, con la modalità IFRAME è consentito l'invio di moduli HTML e, se un elemento del modulo non ha un attributo action specificato, 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 un codice JavaScript 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 guida HtmlService Comunicazione client-to-server.