Di chuyển sang chế độ Hộp cát IFRAME

Apps Script sử dụng hộp cát bảo mật để cung cấp tính năng tách biệt bảo vệ cho Google Workspaceứng dụng trong một số trường hợp. 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 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 đã từng 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 các thay đổi cho chế độ IFRAME để giải quyết các khác biệt sau:

  • Giờ đây, bạn phải ghi đè thuộc tính target của đường liên kết bằng cách sử dụng target="_top" hoặc target="_blank"
  • 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 api.js của Google không tự động tải ở chế độ IFRAME
  • Người dùng bộ chọn 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ũ hơn, bao gồm IE9, không được hỗ trợ
  • Tài nguyên đã nhập giờ đây phải sử dụng HTTPS
  • Việc gửi biểu mẫu không còn bị chặn theo mặc định nữa

Những khác biệt này được trình bày chi tiết trong các phần sau.

Ở 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 đính kè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ẽ tự động được 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 trong các thẻ cấp cao nhất sau đây:

<!DOCTYPE html>
<html>
  <body>
    <!-- Add your HTML content here -->
  </body>
</html>

Bạn phải tải rõ ràng thư viện trình tải JavaScript gốc

Bạn phải thay đổi các tập lệnh dựa vào tính năng tải tự động của 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 API Google Picker

Khi sử dụng Google Picker API, giờ đây, bạn phải gọi setOrigin() khi tạo PickerBuilder và truyền google.script.host.origin vào nguồn gốc, 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 thức 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. Tính năng này không được hỗ trợ trong một số trình duyệt cũ hơn, chẳng hạn như Internet Explorer 9. Đây có thể là vấn đề nếu dự án Apps Script của bạn:

  • sử dụng HtmlService
  • đã sử dụng trước đó trong hộp cát EMULATED hoặc NATIVE

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ũ hơn (đặ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 hoàn toàn không sử dụng HtmlService sẽ không bị ảnh hưởng bởi sự cố này.

HTTPS hiện bắt buộc đối với các tài nguyên đã nhập

Trước đây, khi nhập tài nguyên bằng HTTP, bạn phải thay đổi các ứng dụng đó để dùng HTTPS.

Việc gửi biểu mẫu không còn bị chặn theo mặc định nữa

Trong biểu mẫu HTML hộp cát NATIVE đã bị ngăn gửi và chuyển hướng trên trang. Do đó, nhà phát triển có thể chỉ cần thêm trình xử lý onclick vào nút gửi mà không phải lo lắng về điều gì xảy ra sau đó.

Tuy nhiên, khi ở chế độ IFRAME, các biểu mẫu HTML được phép gửi và nếu một phần tử biểu mẫu không có thuộc tính action nào được chỉ định, thì biểu mẫu đó sẽ gửi đến một trang trống. Tệ hơn nữa, 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 cho bạn là thêm mã JavaScript vào trang để ngăn các phần tử biểu mẫu thực sự gửi đi, để các 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ể tìm thấy ví dụ đầy đủ trong hướng dẫn htmlService Giao tiếp giữa máy khách với máy chủ.