為避免向使用者提供惡意 HTML 或 JavaScript,Apps Script 會使用 iframe,將 HTML 服務網頁應用程式或 Google 文件、試算表和表單的自訂使用者介面放入沙箱。(在其他情況下,例如產生電子郵件內文時,HTML 服務不會使用沙箱)。沙箱會對用戶端程式碼設下限制。
沙箱模式
除了 IFRAME
以外,所有沙箱模式都已淘汰。使用舊版沙箱模式的應用程式現在會自動使用較新的 IFRAME
模式。如果您有使用舊版模式 (NATIVE
和 EMULATED
) 開發的指令碼,請按照遷移說明操作,確保指令碼在 IFRAME
模式下正常運作。
呼叫 setSandboxMode
方法現在不會產生任何影響。
IFRAME 模式的限制
IFRAME
沙箱模式是以 HTML5 的 iframe 沙箱功能為基礎,並使用下列關鍵字:
allow-same-origin
allow-forms
allow-scripts
allow-popups
allow-downloads
allow-modals
allow-popups-to-escape-sandbox
allow-top-navigation-by-user-activation
- 這個屬性只會為獨立指令碼專案設定。
allow-top-navigation
關鍵字可讓內容導覽至頂層瀏覽環境,但受到限制,且不會在沙箱中設為屬性。如需重新導向指令碼,請改為加入連結或按鈕,讓使用者採取行動。
設定連結目標屬性
在 IFRAME
模式中,您需要將連結目標屬性設為 _top
或 _blank
:
Code.js
function doGet() {
var template = HtmlService.createTemplateFromFile('top');
return template.evaluate().setSandboxMode(HtmlService.SandboxMode.IFRAME);
}
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>
動態內容必須使用 HTTPS
「有效」內容 (例如指令碼、外部樣式表和 XmlHttpRequest) 必須透過 HTTPS 載入,而非 HTTP。