Apps 脚本使用安全沙盒在某些情况下为 Google Workspace应用提供保护性隔离。除 IFRAME
之外,所有沙盒模式现已停用。使用旧版沙盒模式的应用现在会自动使用新版 IFRAME
模式。
之前使用 HTML 服务的这些旧模式的应用可能需要针对 IFRAME
模式进行更改,以解决以下差异:
- 现在,您必须使用
target="_top"
或target="_blank"
替换链接的target
属性 - 由 HTML 服务提供的 HTML 文件必须包含 <!DOCTYPE html>、<html> 和 <body> 标记
- Google 原生加载器库
api.js
在IFRAME
模式下不会自动加载 - 选择器用户需要调用
setOrigin()
,因为内容是从新网域提供的 - 某些旧版浏览器(包括 IE9)不受支持
- 导入的资源现在必须使用 HTTPS
- 不再默认阻止表单提交
以下各部分详细介绍了这些差异。
设置链接目标属性
在 IFRAME
模式下,您需要将链接目标属性设置为 _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>
您还可以使用封闭网页的 head 部分中的 <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 脚本 .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>
Google Picker API 变更
使用 Google Picker API 时,您现在必须在构建 PickerBuilder 时调用 setOrigin()
并传入来源 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
沙盒模式基于 HTML5 中的 iframe 沙盒化功能。某些旧版浏览器(例如 Internet Explorer 9)不支持此功能。如果您的 Apps 脚本项目同时满足以下两个条件,则可能会出现问题:
- 使用
HtmlService
,并且 - 之前使用过的
EMULATED
或NATIVE
沙盒
将这些应用迁移到 IFRAME
沙盒模式意味着,它们可能无法在某些不支持 HTML5 的 iframe 沙盒功能的旧版浏览器(尤其是 IE9 及更早版本)上正常运行。
已请求 IFRAME
模式或根本不使用 HtmlService
的应用不受此问题的影响。
现在,导入的资源必须采用 HTTPS 协议
之前使用 HTTP 导入资源的应用必须改为使用 HTTPS。
不再默认阻止表单提交
在 NATIVE
下,HTML 表单无法实际提交和浏览网页。鉴于此,开发者只需向提交按钮添加 onclick
处理程序,而无需担心之后会发生什么。
不过,在 IFRAME
模式下,HTML 表单可以提交,如果表单元素未指定 action
属性,则会提交到空白网页。更糟糕的是,在 onclick
处理程序有机会完成之前,内部 iframe 会重定向到空白网页。
解决方案是向网页添加 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 指南中的客户端到服务器通信。