Переход в режим песочницы IFRAME

Apps Script использует изолированную программную среду безопасности для обеспечения защитной изоляции приложений Google Workspaceв определенных ситуациях. Все режимы песочницы больше не поддерживаются, за исключением IFRAME . Приложения, использующие старые режимы песочницы, теперь автоматически используют новый режим IFRAME .

Приложениям, которые ранее использовали эти старые режимы со службой HTML, возможно, потребуется внести изменения в режим IFRAME , чтобы устранить следующие различия:

  • Теперь вам необходимо переопределить target атрибут ссылки, используя target="_top" или target="_blank"
  • Файлы HTML, обслуживаемые службой HTML, должны включать теги <!DOCTYPE html>, <html> и <body>.
  • Собственная библиотека загрузчика Google api.js не загружается автоматически в режиме IFRAME .
  • Пользователям средства выбора необходимо вызвать setOrigin() , поскольку контент подается из нового домена.
  • Некоторые старые браузеры, включая IE9, не поддерживаются.
  • Импортированные ресурсы теперь должны использовать HTTPS.
  • Отправка формы больше не блокируется по умолчанию.

Эти различия подробно описаны в следующих разделах.

В режиме IFRAME вам необходимо установить атрибут цели ссылки на _top или _blank :

Код.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>

Вы также можете переопределить этот атрибут, используя тег <base> в заголовке прилагаемой веб-страницы:

<!DOCTYPE html>
<html>
  <head>
    <base target="_top">
  </head>
  <body>
   <div>
     <a href="http://google.com">Click Me!</a>
   </div>
 </body>
</html>

HTML-теги верхнего уровня

В режиме песочницы NATIVEEMULATED ) определенные теги HTML автоматически добавляются в файл Apps Script .html, но этого не происходит при использовании режима IFRAME .

Чтобы убедиться, что страницы вашего проекта корректно обслуживаются с помощью IFRAME , оберните содержимое страницы в следующие теги верхнего уровня:

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

Собственная библиотека загрузчика Javascript должна быть явно загружена.

Скрипты, которые полагались на автоматическую загрузку собственной библиотеки загрузчика api.js необходимо изменить для явной загрузки этой библиотеки, как в следующем примере:

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

Изменение API Google Picker

При использовании API Google Picker теперь необходимо вызвать setOrigin() при создании PickerBuilder и передать источник google.script.host.origin , как показано в следующем примере:

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);
}

Полный рабочий пример см. в разделе Диалоговые окна открытия файла .

Поддержка браузера

Режим песочницы IFRAME основан на функции изолированной программной среды iframe в HTML5. Это не поддерживается в некоторых старых браузерах, таких как Internet Explorer 9. Это может быть проблемой, если ваш проект Apps Script одновременно:

  • использует HtmlService и
  • ранее использовавшаяся EMULATED или NATIVE песочница

Перенос этих приложений в режим песочницы IFRAME означает, что они больше не смогут работать в некоторых старых браузерах (особенно IE9 и более ранних версиях), которые не поддерживают функцию песочницы HTML5 iframe.

Эта проблема не затрагивает приложения, которые уже запрашивают режим IFRAME или вообще не используют HtmlService .

HTTPS теперь требуется для импортируемых ресурсов.

Предыдущие приложения, которые импортировали ресурсы с использованием HTTP, необходимо изменить на использование HTTPS.

Отправка формы больше не блокируется по умолчанию.

В NATIVE песочнице HTML-формы не могли фактически отправлять и перемещаться по странице. Учитывая это, разработчик может просто добавить обработчик onclick к кнопке отправки и не беспокоиться о том, что произойдет потом.

Однако в режиме IFRAME разрешена отправка HTML-форм, и если для элемента формы не указан атрибут action , он будет отправлен на пустую страницу. Хуже того, внутренний iframe перенаправит на пустую страницу до того, как обработчик onclick сможет завершить работу.

Решение состоит в том, чтобы добавить на вашу страницу код JavaScript, который предотвращает фактическую отправку элементов формы, чтобы обработчики кликов имели время для работы:

<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>

Полный пример можно найти в руководстве HtmlService Client-to-Server Communication .