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 mittarget="_top"
odertarget="_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 ModusIFRAME
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.
Attribut „Linkziel“ festlegen
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
- oderNATIVE
-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.