在某些情况下,Google Apps 脚本会使用安全沙盒
为 Google Workspace 应用提供保护性隔离。除了 IFRAME 之外,所有沙盒模式现已停用。使用旧版沙盒模式的应用现在会自动使用较新的 IFRAME 模式。
之前使用 HTML 服务时使用这些旧模式的应用可能需要针对 IFRAME 模式进行更改,以解决以下差异:
- 您现在必须使用
target="_top"或target="_blank"替换链接的target属性 - HTML 服务提供的 HTML 文件必须包含 <!DOCTYPE html>、<html> 和 <body> 标记
gapi加载器库 (api.js) 不会在IFRAME模式下自动加载- Picker 用户需要调用
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>
必须明确加载 gapi 加载器库
依赖于自动加载 gapi 加载器库 (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 属性,则会提交到空白页面。更糟糕的是,内部 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 指南 客户端到服务器通信。