Migrazione alla modalità IFRAME Sandbox

Apps Script utilizza una sandbox per la sicurezza per fornire un isolamento protettivo per Google Workspace applicazioni in determinate situazioni. Tutti Le modalità sandbox sono state ritirate ad eccezione di IFRAME. App che utilizzano sandbox precedenti ora usano automaticamente la nuova modalità IFRAME.

Le app che in precedenza utilizzavano queste modalità meno recenti con il servizio HTML potrebbero dover Apporta 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> tag
  • 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 eseguire l'override di questo attributo utilizzando <base> un tag all'interno dell'intestazione della pagina web che le 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 verranno vengono aggiunti automaticamente a un file .html di Apps Script, ma questo non si verifica quando utilizzando la modalità IFRAME.

Per assicurarti che le pagine del progetto vengano pubblicate correttamente con IFRAME, racchiudi il codice 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

Script basati sul caricamento automatico della libreria di caricamento nativa api.js deve essere modificato per caricare la libreria in modo esplicito, 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 il PickerBuilder e passa l'origine google.script.host.origin, come mostrato nel seguente esempio:

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 per l'apertura di file.

Supporto browser

La modalità sandbox IFRAME si basa su Sandboxing iframe in HTML5. Questa operazione 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
  • sandbox EMULATED o NATIVE utilizzata in precedenza

Se esegui la migrazione di queste app alla modalità sandbox di IFRAME, potrebbero non funzionare più alcuni browser meno recenti (soprattutto IE9 e versioni precedenti) che non supportano iframe HTML5 funzionalità di sandboxing.

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

Ora è richiesto HTTPS per le risorse importate

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

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

In NATIVE, è stato impedito l'invio effettivo dei moduli HTML con sandbox e la navigazione nella pagina. Detto questo, uno sviluppatore potrebbe semplicemente aggiungere un onclick per l'invio del pulsante di invio, senza doverti preoccupare di quello che è successo dopo.

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

La soluzione consiste nell'aggiungere alla pagina codice JavaScript che impedisca la visualizzazione di inviare elementi effettivamente, in modo che i gestori dei clic abbiano il tempo :

<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 Comunicazione client-server.