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
,以及 - 先前使用過的
EMULATED
或NATIVE
沙箱
將這些應用程式遷移至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 指南的「用戶端與伺服器通訊」一節。