Zum IFRAME Sandbox Mode migrieren

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

Apps, in denen diese älteren Modi bisher mit dem HTML-Dienst verwendet wurden, müssen möglicherweise Nehmen Sie Änderungen für den IFRAME-Modus vor, um die folgenden Unterschiede zu beheben:

  • Sie müssen jetzt das Attribut target des Links mit target="_top" überschreiben oder target="_blank"
  • HTML-Dateien, die vom HTML-Dienst bereitgestellt werden, müssen Folgendes enthalten: <!DOCTYPE html>, <html> und <body> Tags
  • Die native Google-Ladebibliothek api.js wird in IFRAME-Modus
  • Picker-Nutzer, die anrufen müssen setOrigin(), weil 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 der Methode <base> -Tag im head-Element der zugehörigen Webseite:

<!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) würden bestimmte HTML-Tags automatisch zu einer Apps Script-HTML-Datei hinzugefügt .Dies geschieht jedoch nicht, im IFRAME-Modus.

Damit Ihre Projektseiten mit IFRAME richtig ausgeliefert werden, sollten Sie in den folgenden Top-Level-Tags:

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

Native JavaScript-Ladebibliothek muss explizit geladen werden

Skripts, für die die native Ladebibliothek api.js automatisch geladen wurde muss geändert werden, damit diese Bibliothek wie im folgenden Beispiel 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 beim Erstellen jetzt setOrigin() aufrufen. den PickerBuilder und übergeben den Ursprung google.script.host.origin, wie hier gezeigt im folgenden Beispiel:

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 IFRAME-Sandbox-Modus basiert auf der iFrame-Sandbox-Funktion in HTML5. Diese Funktion wird von einigen älteren Browsern nicht unterstützt, z. B. Internet Explorer 9. Dieses kann zu Problemen führen, wenn Ihr Apps Script-Projekt

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

Wenn du diese Apps in den Sandbox-Modus „IFRAME“ migrierst, funktionieren sie unter Umständen nicht mehr einige ältere Browser (insbesondere IE9 und älter), die den iFrame von HTML5 nicht unterstützen Sandbox-Funktion.

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

HTTPS ist jetzt für importierte Ressourcen erforderlich

Frühere Anwendungen, die Ressourcen über HTTP importiert haben, müssen geändert werden in verwenden Sie stattdessen HTTPS.

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

Bei NATIVE Sandboxes wurde das Senden von HTML-Formularen verhindert und beim Navigieren auf der Seite. Daher könnte ein Entwickler einfach ein onclick-Element hinzufügen, -Handler hinzu. Sie müssen sich keine Gedanken darüber machen, was später passiert.

Im IFRAME-Modus können jedoch HTML-Formulare gesendet werden. Wenn ein Formular für das Element kein action-Attribut angegeben ist, wird es an eine leere Seite gesendet. Schlimmer noch: Der innere iFrame leitet den Nutzer vor dem onclick zur leeren Seite weiter. Handler abgeschlossen werden kann.

Die Lösung besteht darin, Ihrer Seite JavaScript-Code hinzuzufügen, mit dem verhindert wird, dass das Formular Elemente ab, sodass die Klick-Handler Zeit haben, :

<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. Client-zu-Server-Kommunikation.