遷移至 IFRAME 沙箱模式

Apps Script 會使用安全沙箱,在特定情況下為 Google Workspace 應用程式提供保護隔離措施。除了 IFRAME 以外,所有沙箱模式都已停止服務。使用舊版沙箱模式的應用程式現在會自動使用較新的 IFRAME 模式。

如果應用程式先前使用 HTML 服務的舊版模式,可能需要變更為 IFRAME 模式,以因應下列差異:

  • 您現在必須使用 target="_top"target="_blank" 覆寫連結的 target 屬性
  • HTML 服務放送的 HTML 檔案必須包含 <!DOCTYPE html>、<html> 和 <body> 標記
  • IFRAME 模式下,Google 原生載入器程式庫 api.js 不會自動載入
  • 挑選器使用者需要呼叫 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沙箱模式後,應用程式可能無法在某些舊版瀏覽器 (特別是 IE9 和更早版本) 上運作,因為這些瀏覽器不支援 HTML5 的 iframe 沙箱功能。

如果應用程式已要求 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 指南的「用戶端與伺服器通訊」一節。