Apps Script korzysta z piaskownicy zabezpieczeń, aby w określonych sytuacjach zapewnić ochronną izolację aplikacji Google Workspace. Wszystkie tryby piaskownicy zostały wycofane z wyjątkiem IFRAME
. Aplikacje korzystające ze starszych trybów piaskownicy
będą teraz automatycznie używać nowszego trybu IFRAME
.
Aplikacje, które wcześniej korzystały z tych starszych trybów w usłudze HTML, mogą wymagać wprowadzenia zmian w trybie IFRAME
, aby uwzględnić te różnice:
- Musisz teraz zastąpić atrybut
target
linku za pomocą atrybututarget="_top"
lubtarget="_blank"
- Pliki HTML obsługiwane przez usługę HTML muszą zawierać tagi <!DOCTYPE html>, <html> i <body>.
- Biblioteka natywnego modułu wczytującego Google
api.js
nie wczytuje się automatycznie w trybieIFRAME
- Użytkownicy selektora muszą wywołać funkcję
setOrigin()
, ponieważ treści są udostępniane z nowej domeny. - Niektóre starsze przeglądarki, w tym IE9, nie są obsługiwane.
- Importowane zasoby muszą teraz używać protokołu HTTPS
- Przesyłanie formularzy nie jest już domyślnie blokowane
Różnice te zostały opisane w kolejnych sekcjach.
Ustawianie atrybutu elementu docelowego linku
W trybie IFRAME
musisz ustawić atrybut link docelowy na _top
lub _blank
:
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>
Możesz też zastąpić ten atrybut za pomocą tagu <base> w sekcji head zamykającej strony internetowej:
<!DOCTYPE html>
<html>
<head>
<base target="_top">
</head>
<body>
<div>
<a href="http://google.com">Click Me!</a>
</div>
</body>
</html>
Tagi HTML najwyższego poziomu
W trybie piaskownicy NATIVE
(i EMULATED
) do pliku .html w Apps Script automatycznie dodawane są niektóre tagi HTML, ale nie dzieje się tak w przypadku trybu IFRAME
.
Aby mieć pewność, że strony projektu są prawidłowo wyświetlane za pomocą IFRAME
, umieść treść strony w tych tagach najwyższego poziomu:
<!DOCTYPE html>
<html>
<body>
<!-- Add your HTML content here -->
</body>
</html>
Biblioteka wczytywania natywnego JavaScriptu musi być wczytywana jawnie
Skrypty, które polegały na automatycznym wczytywaniu biblioteki natywnego modułu wczytującego, api.js
muszą zostać zmienione tak, aby wczytywać tę bibliotekę w sposób jawny, jak w tym przykładzie:
<script src="https://apis.google.com/js/api.js?onload=onApiLoad">
</script>
Zmiana w Google Picker API
Podczas korzystania z interfejsu Google Picker API musisz teraz wywoływać setOrigin()
podczas tworzenia obiektu PickerBuilder i przekazywać źródło google.script.host.origin
, jak w tym przykładzie:
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);
}
Pełny przykład znajdziesz w sekcji Okna otwierania plików.
Obsługa przeglądarek
Tryb piaskownicy IFRAME
jest oparty na funkcji piaskownicy iframe w HTML5.
Nie jest to obsługiwane w niektórych starszych przeglądarkach, np. Internet Explorer 9. Może to stanowić problem, jeśli Twój projekt Apps Script:
- używa funkcji
HtmlService
, - wcześniej używane piaskownice
EMULATED
lubNATIVE
,
Przeniesienie tych aplikacji do IFRAME
trybu piaskownicy oznacza, że mogą one przestać działać w niektórych starszych przeglądarkach (zwłaszcza IE9 i starszych), które nie obsługują funkcji piaskownicy iframe w HTML5.
Ten problem nie dotyczy aplikacji, które już wysyłają żądania w trybie IFRAME
lub w ogóle nie używają HtmlService
.
Protokół HTTPS jest teraz wymagany w przypadku importowanych zasobów
W przypadku poprzednich aplikacji, które importowały zasoby za pomocą protokołu HTTP, należy zmienić protokół na HTTPS.
Przesyłanie formularzy nie jest już domyślnie blokowane
W sekcji NATIVE
sandboxing HTML forms were prevented from actually submitting
and navigating the page. Dlatego deweloper może po prostu dodać onclick
procedurę obsługi do przycisku przesyłania i nie musi się martwić o to, co się stanie później.
W IFRAME
jednak formularze HTML mogą być przesyłane, a jeśli element formularza nie ma określonego atrybutu action
, zostanie przesłany na pustą stronę.
Co gorsza, wewnętrzny element iframe przekieruje użytkownika na pustą stronę, zanim moduł obsługi onclick
zakończy działanie.
Rozwiązaniem jest dodanie do strony kodu JavaScript, który uniemożliwia faktyczne przesłanie elementów formularza, dzięki czemu moduły obsługi kliknięć mają czas na działanie:
<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>
Pełny przykład znajdziesz w przewodniku po HtmlService w sekcji Komunikacja między klientem a serwerem.