Google Apps Script verwendet in bestimmten Situationen eine Sicherheitssandbox
, um Google Workspace-Anwendungen zu isolieren und zu schützen. Alle Sandbox-Modi außer IFRAME werden eingestellt. Anwendungen, die ältere Sandbox-Modi verwenden, nutzen jetzt automatisch den neueren IFRAME-Modus.
Bei Anwendungen, die diese älteren Modi zuvor mit dem HTML-Dienst verwendet haben, müssen möglicherweise Änderungen für den IFRAME-Modus vorgenommen werden, um die folgenden Unterschiede zu berücksichtigen:
- Sie müssen jetzt das
targetAttribut 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
gapi-Loader-Bibliothek (api.js) wird imIFRAME-Modus nicht automatisch geladen. - Picker-Nutzer müssen
setOriginaufrufen, da Inhalte von einer neuen Domain bereitgestellt werden. - Einige ältere Browser, darunter IE9, werden nicht unterstützt.
- Für importierte Ressourcen muss jetzt HTTPS verwendet werden.
- Die Formularübermittlung wird nicht mehr standardmäßig verhindert.
Diese Unterschiede werden in den folgenden Abschnitten ausführlich beschrieben.
Das Zielattribut für den Link festlegen
Im IFRAME-Modus müssen Sie das Link-Zielattribut 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 Tag <base> 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 zu einer Apps Script-HTML-Datei hinzugefügt .Im IFRAME-Modus ist das nicht der Fall.
Damit Ihre Projektseiten mit IFRAME korrekt bereitgestellt werden, müssen Sie den Seiteninhalt in die folgenden Tags der obersten Ebene einschließen:
<!DOCTYPE html>
<html>
<body>
<!-- Add your HTML content here -->
</body>
</html>
Die gapi-Loader-Bibliothek muss explizit geladen werden
Skripts, die auf das automatische Laden der gapi-Loader-Bibliothek (api.js) angewiesen sind, 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,
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
iframe-Sandboxing Funktion in HTML5.
Diese Funktion wird in einigen älteren Browsern wie Internet Explorer 9 nicht unterstützt. Das kann ein Problem sein, wenn Ihr Apps Script-Projekt Folgendes erfüllt:
- Es verwendet
HtmlService. - Es hat zuvor
EMULATEDoderNATIVESandboxing verwendet.
Wenn Sie diese Anwendungen zum 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
Vorherige Anwendungen, die Ressourcen mit HTTP importiert haben, müssen so geändert werden, dass stattdessen HTTPS verwendet wird.
Die Formularübermittlung wird nicht mehr standardmäßig verhindert
Im NATIVE-Sandbox-Modus wurde verhindert, dass HTML-Formulare tatsächlich gesendet und die Seite aufgerufen werden. Daher konnte ein Entwickler dem Senden-Button einen onclick-Handler hinzufügen, ohne sich Gedanken darüber machen zu müssen, was danach geschah.
Im IFRAME-Modus können 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 beendet werden kann.
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:
// 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);
Ein vollständiges Beispiel finden Sie in der Anleitung zu HtmlService unter Client-Server-Kommunikation.