遷移至 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 屬性,則會提交至空白頁面。更糟的是,內部 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 指南的用戶端對伺服器通訊頁面查看完整範例。