Zum IFRAME Sandbox Mode migrieren

Apps Script verwendet eine Sicherheits-Sandbox, um Google Workspace-Anwendungen in bestimmten Situationen schützen zu können. Alle Sandbox-Modi mit Ausnahme von IFRAME werden jetzt eingestellt. Anwendungen, die ältere Sandbox-Modi verwenden, nutzen jetzt automatisch den neueren IFRAME-Modus.

Bei Anwendungen, die zuvor diese älteren Modi mit dem HTML-Dienst verwendet haben, müssen möglicherweise Änderungen für den IFRAME-Modus vorgenommen werden, um die folgenden Unterschiede zu beheben:

  • Du musst jetzt das Attribut target des Links mit target="_top" oder target="_blank" überschreiben
  • HTML-Dateien, die vom HTML-Dienst bereitgestellt werden, müssen die Tags <!DOCTYPE html>, <html> und <body> enthalten
  • Die native Google-Ladebibliothek api.js wird im IFRAME-Modus nicht automatisch geladen
  • Picker-Nutzer müssen setOrigin() aufrufen, da Inhalte von einer neuen Domain bereitgestellt werden.
  • Einige ältere Browser, einschließlich IE9, werden nicht unterstützt.
  • Importierte Ressourcen müssen jetzt HTTPS verwenden
  • Das Senden von Formularen wird nicht mehr standardmäßig verhindert

Diese Unterschiede werden in den folgenden Abschnitten näher erläutert.

Im Modus IFRAME müssen Sie das Linkzielattribut auf _top oder _blank festlegen:

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>

Sie können dieses Attribut auch mit dem <base>-Tag im <head>-Abschnitt der einschließenden Webseite überschreiben:

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

HTML-Tags der obersten Ebene

Im Sandbox-Modus NATIVE (und EMULATED) werden bestimmte HTML-Tags automatisch einer Apps Script-HTML-Datei hinzugefügt .Dies geschieht jedoch nicht, wenn der Modus IFRAME verwendet wird.

Damit deine Projektseiten korrekt mit IFRAME bereitgestellt werden, musst du den Seiteninhalt in die folgenden Tags auf oberster Ebene einschließen:

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

Native JavaScript-Ladebibliothek muss explizit geladen werden

Skripts, die auf dem automatischen Laden der nativen Ladebibliothek api.js beruhen, müssen wie im folgenden Beispiel so geändert werden, dass diese Bibliothek explizit geladen wird:

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

Änderung an der Google Picker API

Wenn Sie die Google Picker API verwenden, müssen Sie jetzt beim Erstellen des PickerBuilders setOrigin() aufrufen und den Ursprung google.script.host.origin übergeben, wie im folgenden Beispiel gezeigt:

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);
}

Ein vollständiges Beispiel finden Sie unter Dialogfelder zum Öffnen von Dateien.

Unterstützte Browser

Der Sandbox-Modus IFRAME basiert auf der iFrame-Sandboxing-Funktion in HTML5. Diese Funktion wird von einigen älteren Browsern nicht unterstützt, z. B. Internet Explorer 9. Dies kann zu Problemen führen, wenn für Ihr Apps Script-Projekt Folgendes gilt:

  • verwendet HtmlService und
  • zuvor verwendetes Sandboxing von EMULATED oder NATIVE

Wenn Sie diese Apps in den IFRAME-Sandbox-Modus migrieren, funktionieren sie möglicherweise nicht mehr in einigen älteren Browsern (insbesondere IE9 und älter), die die iFrame-Sandboxing-Funktion von HTML5 nicht unterstützen.

Anwendungen, die bereits den IFRAME-Modus anfordern oder HtmlService überhaupt nicht verwenden, sind von diesem Problem nicht betroffen.

HTTPS ist jetzt für importierte Ressourcen erforderlich

Frühere Anwendungen, die Ressourcen über HTTP importiert haben, müssen auf HTTPS umgestellt werden.

Das Senden von Formularen wird nicht mehr standardmäßig verhindert

Unter NATIVE wurde verhindert, dass HTML-Formulare in einer Sandbox tatsächlich auf der Seite gesendet und aufgerufen werden konnten. Daher kann ein Entwickler der Schaltfläche „Senden“ einfach einen onclick-Handler hinzufügen und muss sich keine Gedanken darüber machen, was danach passiert.

Im IFRAME-Modus können jedoch HTML-Formulare gesendet werden. Wenn für ein Formularelement kein action-Attribut angegeben ist, wird es an eine leere Seite gesendet. Schlimmer noch, der innere iFrame leitet zur leeren Seite weiter, bevor der onclick-Handler die Möglichkeit hat, den Vorgang abzuschließen.

Die Lösung besteht darin, Ihrer Seite JavaScript-Code hinzuzufügen, der verhindert, dass Formularelemente gesendet werden, damit die Klick-Handler Zeit haben, zu funktionieren:

<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>

Ein vollständiges Beispiel finden Sie im HTMLService-Leitfaden für die Client-zu-Server-Kommunikation.