Apps Script sử dụng một hộp cát bảo mật để cung cấp tính năng tách biệt bảo vệ cho các ứng dụng Google Workspacetrong một số trường hợp nhất định. Tất cả các chế độ hộp cát hiện đã ngừng hoạt động, ngoại trừ IFRAME
. Các ứng dụng sử dụng chế độ hộp cát cũ hiện sẽ tự động sử dụng chế độ IFRAME
mới hơn.
Các ứng dụng trước đây sử dụng các chế độ cũ này với Dịch vụ HTML có thể cần phải thực hiện thay đổi đối với chế độ IFRAME
để giải quyết những điểm khác biệt sau:
- Bây giờ, bạn phải ghi đè thuộc tính
target
của đường liên kết bằngtarget="_top"
hoặctarget="_blank"
- Các tệp HTML do Dịch vụ HTML phân phát phải bao gồm các thẻ <!DOCTYPE html>, <html> và <body>
- Thư viện trình tải gốc của Google
api.js
không tự động tải ở chế độIFRAME
- Người dùng Picker cần gọi
setOrigin()
vì nội dung được phân phát từ một miền mới - Một số trình duyệt cũ, bao gồm cả IE9, không được hỗ trợ
- Giờ đây, các tài nguyên đã nhập phải sử dụng HTTPS
- Theo mặc định, việc gửi biểu mẫu không còn bị ngăn chặn
Những điểm khác biệt này được trình bày chi tiết trong các phần sau.
Thiết lập thuộc tính mục tiêu liên kết
Ở chế độ IFRAME
, bạn cần đặt thuộc tính đích của đường liên kết thành _top
hoặc _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>
Bạn cũng có thể ghi đè thuộc tính này bằng cách sử dụng thẻ <base> trong phần đầu của trang web bao gồm:
<!DOCTYPE html>
<html>
<head>
<base target="_top">
</head>
<body>
<div>
<a href="http://google.com">Click Me!</a>
</div>
</body>
</html>
Thẻ HTML cấp cao nhất
Trong chế độ hộp cát NATIVE
(và EMULATED
), một số thẻ HTML nhất định sẽ được tự động thêm vào tệp .html của Apps Script, nhưng điều này không xảy ra khi sử dụng chế độ IFRAME
.
Để đảm bảo các trang dự án của bạn được phân phát chính xác bằng IFRAME
, hãy gói nội dung trang của bạn trong các thẻ cấp cao nhất sau:
<!DOCTYPE html>
<html>
<body>
<!-- Add your HTML content here -->
</body>
</html>
Thư viện trình tải JavaScript gốc phải được tải rõ ràng
Bạn phải thay đổi các tập lệnh dựa vào tính năng tự động tải thư viện trình tải gốc api.js
để tải thư viện này một cách rõ ràng, như trong ví dụ sau:
<script src="https://apis.google.com/js/api.js?onload=onApiLoad">
</script>
Thay đổi về API Bộ chọn của Google
Khi sử dụng API bộ chọn của Google, giờ đây, bạn phải gọi setOrigin()
khi tạo PickerBuilder và truyền vào nguồn gốc google.script.host.origin
, như trong ví dụ sau:
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);
}
Để xem ví dụ đầy đủ về cách hoạt động, hãy xem phần Hộp thoại mở tệp.
Hỗ trợ trình duyệt
Chế độ hộp cát IFRAME
dựa trên tính năng hộp cát iframe trong HTML5.
Một số trình duyệt cũ không hỗ trợ tính năng này, chẳng hạn như Internet Explorer 9. Điều này có thể là vấn đề nếu dự án Apps Script của bạn vừa:
- sử dụng
HtmlService
và - đã sử dụng hộp cát
EMULATED
hoặcNATIVE
trước đây
Việc di chuyển các ứng dụng này sang chế độ hộp cát IFRAME
có nghĩa là các ứng dụng đó có thể không còn hoạt động trên một số trình duyệt cũ (đặc biệt là IE9 trở xuống) không hỗ trợ tính năng hộp cát iframe của HTML5.
Các ứng dụng đã yêu cầu chế độ IFRAME
hoặc không sử dụng HtmlService
sẽ không bị vấn đề này ảnh hưởng.
Giờ đây, bạn bắt buộc phải dùng HTTPS cho các tài nguyên được nhập
Các ứng dụng trước đây đã nhập tài nguyên bằng HTTP phải được thay đổi để sử dụng HTTPS.
Theo mặc định, việc gửi biểu mẫu không còn bị ngăn chặn
Trong NATIVE
, các biểu mẫu HTML trong hộp cát không được gửi và điều hướng trang. Do đó, nhà phát triển chỉ cần thêm trình xử lý onclick
vào nút gửi và không phải lo lắng về những gì xảy ra sau đó.
Tuy nhiên, với chế độ IFRAME
, bạn được phép gửi biểu mẫu HTML và nếu một phần tử biểu mẫu không có thuộc tính action
được chỉ định, thì phần tử đó sẽ gửi đến một trang trống.
Tệ hơn, iframe bên trong sẽ chuyển hướng đến trang trống trước khi trình xử lý onclick
có cơ hội hoàn tất.
Giải pháp là thêm mã JavaScript vào trang của bạn để ngăn các phần tử biểu mẫu thực sự gửi, nhờ đó, trình xử lý lượt nhấp có thời gian hoạt động:
<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>
Bạn có thể xem ví dụ đầy đủ trong hướng dẫn về HtmlService Giao tiếp giữa máy khách và máy chủ.