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

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

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

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

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

В режиме IFRAME необходимо установить атрибут `target` ссылки либо в _top , либо в _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>

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

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

Библиотеку загрузчика gapi необходимо загрузить явным образом.

Скрипты, которые полагались на автоматическую загрузку библиотеки gapi loader ( 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 и более ранних версиях), которые не поддерживают функцию песочницы iframe в HTML5.

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

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

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

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

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

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

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

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

Полный пример можно найти в руководстве HtmlService по взаимодействию клиента с сервером .