在某些情況下,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
,而 - 先前使用
EMULATED
或NATIVE
沙箱機制
將這些應用程式遷移至 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 指南的用戶端對伺服器通訊頁面查看完整範例。