遷移至 IFRAME 沙箱模式

Apps Script 在某些情況下,會使用安全沙箱為 Google Workspace應用程式提供防護隔離功能。目前所有沙箱模式均全面停用,除了 IFRAME 以外。使用舊版沙箱模式的應用程式現在會自動使用新版 IFRAME 模式。

先前搭配 HTML 服務使用這些舊版模式的應用程式,可能需要對 IFRAME 模式進行變更,才能解決下列差異:

  • 您現在必須使用 target="_top"target="_blank" 覆寫連結的 target 屬性
  • HTML 服務提供的 HTML 檔案必須包含 <!DOCTYPE html>、<html> 和 <body> 標記
  • IFRAME 模式下不會自動載入 Google 原生載入器程式庫 api.js
  • 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 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>

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 Script 專案同時有下列兩項情況,則可能會發生問題:

  • 使用 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 指南的「用戶端對伺服器通訊」一文。