Zum IFRAME Sandbox Mode migrieren

Apps Script nutzt eine Sicherheits-Sandbox, um Anwendungen in bestimmten Situationen schützend Google Workspacezu isolieren. Alle Sandbox-Modi mit Ausnahme von IFRAME wurden eingestellt. Anwendungen, die ältere Sandbox-Modi nutzen, nutzen jetzt automatisch den neueren IFRAME-Modus.

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

  • Du musst jetzt das target-Attribut des Links mit target="_top" oder target="_blank" überschreiben
  • Vom HTML-Dienst bereitgestellte HTML-Dateien müssen die Tags <!DOCTYPE html>, <html> und <body> enthalten.
  • Die native Ladebibliothek von Google (api.js) wird im Modus IFRAME 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 beschrieben.

Im IFRAME-Modus 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 .Im IFRAME-Modus ist dies jedoch nicht der Fall.

Damit Ihre Projektseiten mit IFRAME richtig bereitgestellt werden, schließen Sie den Seiteninhalt in die folgenden Tags auf oberster Ebene ein:

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

Native JavaScript-Ladebibliothek muss explizit geladen werden

Skripts, die auf das automatische Laden der nativen Ladebibliothek api.js angewiesen waren, müssen geändert werden, um diese Bibliothek wie im folgenden Beispiel explizit zu laden:

<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 beim Erstellen des PickerBuilders jetzt 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 voll funktionsfähiges Beispiel finden Sie unter Dialogfelder zum Öffnen von Dateien.

Unterstützte Browser

Der Sandbox-Modus IFRAME basiert auf der iFrame-Sandbox-Funktion in HTML5. Diese Funktion wird von einigen älteren Browsern, wie zum Beispiel Internet Explorer 9, nicht unterstützt. Dies kann zu einem Problem werden, wenn Ihr Apps Script-Projekt:

  • verwendet HtmlService und
  • Bisher wurden EMULATED- oder NATIVE-Sandboxing verwendet

Wenn Sie diese Anwendungen in den Sandbox-Modus IFRAME migrieren, funktionieren sie möglicherweise nicht mehr in einigen älteren Browsern (insbesondere IE9 und niedriger), die die iFrame-Sandbox-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 so geändert werden, dass sie stattdessen HTTPS verwenden.

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

Unter NATIVE wurden HTML-Formulare für das Sandboxing nicht gesendet und konnten nicht auf der Seite navigieren. Aus diesem Grund könnte ein Entwickler der Schaltfläche „Senden“ einfach einen onclick-Handler hinzufügen und muss sich keine Gedanken darüber machen, was danach passiert ist.

Im IFRAME-Modus können HTML-Formulare gesendet werden. Wenn für ein Formularelement kein action-Attribut angegeben ist, wird es auf eine leere Seite gesendet. Schlimmer noch, der innere iFrame leitet den Nutzer auf die leere Seite weiter, bevor der onclick-Handler den Vorgang abschließen kann.

Die Lösung besteht darin, Ihrer Seite JavaScript-Code hinzuzufügen, der verhindert, dass die Formularelemente tatsächlich gesendet werden. So haben die Klick-Handler Zeit, 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 zur Client-zu-Server-Kommunikation.