迁移到 IFRAME 沙盒模式

Apps 脚本使用安全沙盒 为 Google Workspace提供保护性隔离 特定情况下的应用全部 除 IFRAME 外,沙盒模式现已弃用。使用旧版沙盒的应用 模式现在自动使用较新的 IFRAME 模式。

以前将这些旧模式与 HTML Service 结合使用的应用可能需要 针对 IFRAME 模式进行更改,以解决以下差异:

  • 现在,您必须使用 target="_top"target target="_blank"
  • 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>

您也可以使用 <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 时,您现在必须在构建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 沙盒 功能 部分旧版浏览器(如 Internet Explorer 9)不支持此功能。这个 如果您的 Apps 脚本项目同时满足以下条件,则可能会出现问题:

  • 使用 HtmlService,以及
  • 之前使用过的 EMULATEDNATIVE 沙盒

如果将这些应用迁移到IFRAME沙盒模式,它们可能无法再在 一些不支持 HTML5 的 iframe 的旧版浏览器(特别是 IE9 及更低版本) 沙盒功能

已请求 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 指南中找到完整示例 客户端到服务器的通信