Google Apps Script использует песочницу безопасности для обеспечения защитной изоляции приложений Google Workspace в определенных ситуациях. Все режимы песочницы, кроме IFRAME , теперь отключены. Приложения, использующие старые режимы песочницы, теперь автоматически используют новый режим IFRAME .
Приложениям, которые ранее использовали эти старые режимы с HTML-сервисом, может потребоваться внести изменения в режим IFRAME для устранения следующих различий:
- Теперь необходимо переопределить атрибут
targetссылки, используяtarget="_top"илиtarget="_blank" - HTML-файлы, предоставляемые HTML-сервисом, должны содержать теги <!DOCTYPE html>, <html> и <body>.
- Библиотека
gapiloader (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-теги верхнего уровня
В режиме песочницы NATIVE (и EMULATED ) определенные 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 по взаимодействию клиента с сервером .