Apps Script verwendet eine Sicherheits-Sandbox, um Google Workspace-Anwendungen in bestimmten Situationen zu schützen. Alle Sandbox-Modi mit Ausnahme von IFRAME
werden jetzt eingestellt. Apps, die ältere Sandbox-Modi verwenden, nutzen jetzt automatisch den neueren Modus IFRAME
.
Bei Apps, die diese älteren Modi zuvor mit dem HTML-Dienst verwendet haben, sind möglicherweise Änderungen für den IFRAME
-Modus erforderlich, um die folgenden Unterschiede zu berücksichtigen:
- Sie müssen jetzt das Attribut
target
des Links mittarget="_top"
odertarget="_blank"
überschreiben. - HTML-Dateien, die vom HTML-Dienst bereitgestellt werden, müssen die Tags <!DOCTYPE html>, <html> und <body> enthalten.
- Die Google-eigene Loader-Bibliothek
api.js
wird im ModusIFRAME
nicht automatisch geladen. - Picker-Nutzer müssen
setOrigin()
aufrufen, da Inhalte über eine neue Domain bereitgestellt werden. - Einige ältere Browser, darunter IE9, werden nicht unterstützt.
- Importierte Ressourcen müssen jetzt HTTPS verwenden
- Formularübermittlungen werden nicht mehr standardmäßig verhindert
Diese Unterschiede werden in den folgenden Abschnitten beschrieben.
Attribut für Link-Ziel festlegen
Im IFRAME
-Modus müssen Sie das Attribut für das Linkziel 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-Bereich der umschließ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
) wurden bestimmte HTML-Tags automatisch einer Apps Script-Datei mit der Endung .html hinzugefügt. Das ist im Modus IFRAME
nicht der Fall.
Damit Ihre Projektseiten mit IFRAME
richtig ausgeliefert werden, müssen Sie den Seiteninhalt in die folgenden Tags der obersten Ebene einfügen:
<!DOCTYPE html>
<html>
<body>
<!-- Add your HTML content here -->
</body>
</html>
Die native JavaScript-Loader-Bibliothek muss explizit geladen werden.
Skripts, die auf dem automatischen Laden der nativen Loader-Bibliothek api.js
basierten, müssen so geändert werden, dass diese Bibliothek explizit geladen wird, wie im folgenden Beispiel:
<script src="https://apis.google.com/js/api.js?onload=onApiLoad">
</script>
Änderung der Google Picker API
Wenn Sie die Google Picker API verwenden, müssen Sie jetzt setOrigin()
aufrufen, wenn Sie den PickerBuilder erstellen, 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ändig funktionierendes Beispiel finden Sie unter Dialogfelder zum Öffnen von Dateien.
Unterstützte Browser
Der IFRAME
-Sandbox-Modus basiert auf der HTML5-Funktion iFrame-Sandboxing.
In einigen älteren Browsern wie Internet Explorer 9 wird dies nicht unterstützt. Das kann ein Problem sein, wenn Ihr Apps Script-Projekt folgende Bedingungen erfüllt:
HtmlService
verwendet und- zuvor verwendete
EMULATED
- oderNATIVE
-Sandbox
Wenn diese Apps in den IFRAME
-Sandbox-Modus migriert werden, funktionieren sie möglicherweise nicht mehr in einigen älteren Browsern (insbesondere IE9 und früher), die die iframe-Sandbox-Funktion von HTML5 nicht unterstützen.
Apps, 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
Bei früheren Anwendungen, in denen Ressourcen über HTTP importiert wurden, muss HTTPS verwendet werden.
Formularübermittlungen werden nicht mehr standardmäßig verhindert
Im NATIVE
-Sandbox-Modus wurde verhindert, dass HTML-Formulare tatsächlich gesendet und die Seite aufgerufen werden konnte. Ein Entwickler könnte also einfach einen onclick
-Handler für die Schaltfläche „Senden“ hinzufügen und sich keine Gedanken darüber machen müssen, was danach passiert.
Im IFRAME
-Modus dürfen HTML-Formulare jedoch gesendet werden. Wenn für ein Formularelement kein action
-Attribut angegeben ist, wird es an eine leere Seite gesendet.
Schlimmer noch: Das innere iFrame wird zur leeren Seite weitergeleitet, bevor der onclick
-Handler abgeschlossen ist.
Die Lösung besteht darin, Ihrer Seite JavaScript-Code hinzuzufügen, der verhindert, dass die Formularelemente tatsächlich gesendet werden, damit die Click-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 Leitfaden zu HtmlService unter Client-to-Server Communication (Client-Server-Kommunikation).