Migracja do trybu piaskownicy IFRAME

Apps Script korzysta z bezpiecznej piaskownicy, aby zapewnić izolację aplikacji Google Workspacew określonych sytuacjach. Wycofano teraz wszystkie tryby piaskownicy z wyjątkiem IFRAME. Aplikacje korzystające ze starszych trybów piaskownicy teraz automatycznie korzystają z nowszego trybu IFRAME.

Aplikacje, które wcześniej używały tych starszych trybów w usłudze HTML, mogą musieć wprowadzić zmiany w trybie IFRAME, aby rozwiązać te różnice:

  • Teraz musisz zastąpić atrybut target linku za pomocą target="_top" lub target="_blank"
  • Pliki HTML udostępniane przez usługę HTML muszą zawierać tagi <!DOCTYPE html>, <html> i <body>.
  • Biblioteka natywnych modułów wczytywania Google api.js nie wczytuje się automatycznie w trybie IFRAME
  • Użytkownicy z rolą Picket muszą dzwonić do usługi setOrigin(), ponieważ treści są wyświetlane z nowej domeny
  • Niektóre starsze przeglądarki, w tym IE9, nie są obsługiwane.
  • Zaimportowane zasoby muszą teraz używać protokołu HTTPS
  • Przesyłanie formularzy nie jest już domyślnie zablokowane

Różnice te zostały szczegółowo opisane w kolejnych sekcjach.

W trybie IFRAME ustaw atrybut celu linku 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 nagłówka 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) niektóre tagi HTML są automatycznie dodawane do pliku .html Apps Script, ale nie ma to miejsca w trybie IFRAME.

Aby mieć pewność, że strony projektu będą prawidłowo wyświetlane za pomocą obiektu IFRAME, umieść ich zawartość w tych tagach najwyższego poziomu:

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

Biblioteka natywnego programu ładującego JavaScript musi być jawnie wczytana

Skrypty, które korzystały z automatycznego ładowania biblioteki natywnego wczytywania api.js, trzeba zmienić, aby wczytywały ją bezpośrednio, jak w tym przykładzie:

<script src="https://apis.google.com/js/api.js?onload=onApiLoad">
</script>

Zmiana interfejsu Google Picker API

Korzystając z interfejsu Google Picker API, musisz teraz wywołać setOrigin() podczas tworzenia obiektu PickerBuilder i przekazać w źródle google.script.host.origin, jak to widać w poniższym 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);
}

Praktyczny przykład działania znajdziesz w artykule o oknach otwierania pliku.

Obsługiwane przeglądarki

Tryb piaskownicy IFRAME działa na podstawie funkcji piaskownicy iframe w HTML5. Nie jest to obsługiwane w niektórych starszych przeglądarkach, takich jak Internet Explorer 9. Problem może występować, jeśli projekt Apps Script zawiera oba te elementy:

  • używa HtmlService, a
  • poprzednio używano piaskownicy EMULATED lub NATIVE

Przeniesienie tych aplikacji do trybu piaskownicy IFRAME spowoduje, że mogą one przestać działać w niektórych starszych przeglądarkach (zwłaszcza IE9 i starszych), które nie obsługują funkcji piaskownicy w elemencie iframe HTML5.

Ten problem nie dotyczy aplikacji, które już żądają trybu IFRAME lub w ogóle nie używają interfejsu HtmlService.

Protokół HTTPS jest teraz wymagany w przypadku importowanych zasobów

Poprzednie aplikacje, które importowały zasoby przez protokół HTTP, muszą zostać zmienione tak, aby korzystały z protokołu HTTPS.

Przesyłanie formularzy nie jest już domyślnie zablokowane

W ramach NATIVE stosowane w piaskownicy formularze HTML uniemożliwiające przesyłanie i poruszanie się po stronie. Dzięki temu deweloper może po prostu dodać moduł obsługi onclick do przycisku przesyłania i nie musi się martwić o tym, co dzieje się później.

W trybie IFRAME można jednak przesyłać formularze HTML, a jeśli element formularza nie ma określonego atrybutu action, prześle go na pustą stronę. Co gorsza, wewnętrzny element iframe przekieruje na pustą stronę, zanim moduł obsługi onclick zakończy działanie.

Rozwiązaniem jest dodanie do strony kodu JavaScript, który uniemożliwia prawidłowe przesyłanie elementów formularza, by moduły obsługi kliknięć miały 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 htmlService Komunikacja między klientami.