改用 IFRAME 沙箱模式

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

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

  • 您現在必須使用 target="_top" 或 target="_blank" 覆寫連結的 target 屬性
  • HTML 服務放送的 HTML 檔案必須包含 <!DOCTYPE html>、<html> 和 <body> 標記
  • 在 IFRAME 模式中,gapi 載入器程式庫 (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>

必須明確載入 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 Script 專案同時符合下列條件,就可能發生問題:

  • 使用 HtmlService,以及
  • 先前使用過的 EMULATED 或 NATIVE 沙箱

將這些應用程式遷移至IFRAME沙箱模式後,應用程式可能無法在某些舊版瀏覽器 (特別是 IE9 和更早版本) 上運作,因為這些瀏覽器不支援 HTML5 的 iframe 沙箱功能。

如果應用程式已要求 IFRAME 模式,或完全未使用 HtmlService,就不會受到這個問題影響。

匯入的資源現在必須使用 HTTPS

先前使用 HTTP 匯入資源的應用程式必須改用 HTTPS。

系統預設不再禁止提交表單

在 NATIVE 下,系統會禁止 HTML 表單實際提交及瀏覽網頁。因此,開發人員可以為提交按鈕新增 onclick 處理常式,不必擔心後續作業。

不過,在 IFRAME 模式下,HTML 表單可以提交,如果表單元素未指定 action 屬性,就會提交至空白頁面。更糟的是,在 onclick 處理常式完成前,內部 iframe 會重新導向至空白頁面。

解決方法是在網頁中加入 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 指南的「用戶端與伺服器之間的通訊」一節。