迁移到 IFRAME 沙盒模式

Apps 脚本使用安全沙盒在某些情况下为 Google Workspace应用提供保护性隔离。除 IFRAME 之外,所有沙盒模式现已停用。使用旧版沙盒模式的应用现在会自动使用新版 IFRAME 模式。

之前使用 HTML 服务的这些旧模式的应用可能需要针对 IFRAME 模式进行更改,以解决以下差异:

  • 现在,您必须使用 target="_top"target="_blank" 替换链接的 target 属性
  • 由 HTML 服务提供的 HTML 文件必须包含 <!DOCTYPE html>、<html> 和 <body> 标记
  • Google 原生加载器库 api.jsIFRAME 模式下不会自动加载
  • 选择器用户需要调用 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,并且
  • 之前使用过的 EMULATEDNATIVE 沙盒

将这些应用迁移到 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 指南中的客户端到服务器通信