Apps Script использует изолированную программную среду безопасности для обеспечения защитной изоляции приложения в определенных ситуациях. Все режимы песочницы больше не поддерживаются, за исключением 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-теги верхнего уровня
В режиме песочницы NATIVE
(и EMULATED
) определенные теги 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 .