مهاجرت به حالت سندباکس IFRAME

Google Apps Script uses a security sandbox to provide protective isolation for Google Workspace applications in certain situations. All sandbox modes are now sunset except for IFRAME . Apps using older sandbox modes now use the newer IFRAME mode automatically.

برنامه‌هایی که قبلاً از این حالت‌های قدیمی‌تر با سرویس HTML استفاده می‌کردند، ممکن است نیاز داشته باشند تغییراتی را برای حالت IFRAME ایجاد کنند تا تفاوت‌های زیر را برطرف کنند:

  • اکنون باید ویژگی target لینک را با استفاده از target="_top" یا target="_blank" لغو کنید.
  • فایل‌های HTML که توسط سرویس HTML ارائه می‌شوند باید شامل تگ‌های <!DOCTYPE html>، <html> و <body> باشند.
  • کتابخانه‌ی gapi loader ( api.js ) در حالت IFRAME به طور خودکار بارگذاری نمی‌شود.
  • کاربران Picker باید setOrigin فراخوانی کنند زیرا محتوا از یک دامنه جدید ارائه می‌شود.
  • برخی از مرورگرهای قدیمی، از جمله IE9، پشتیبانی نمی‌شوند.
  • منابع وارد شده اکنون باید از HTTPS استفاده کنند
  • ارسال فرم دیگر به طور پیش‌فرض جلوگیری نمی‌شود

این تفاوت‌ها در بخش‌های بعدی به تفصیل شرح داده شده‌اند.

در حالت IFRAME باید ویژگی هدف لینک را روی _top یا _blank تنظیم کنید:

کد.js

function doGet() {
  var template = HtmlService.createTemplateFromFile('top');
  return template.evaluate();
}

بالا.html

<!DOCTYPE html>
<html>
 <body>
   <div>
     <a href="http://google.com" target="_top">Click Me!</a>
   </div>
 </body>
</html>

همچنین می‌توانید این ویژگی را با استفاده از تگ <base> در بخش head صفحه وب مربوطه، بازنویسی کنید:

<!DOCTYPE html>
<html>
  <head>
    <base target="_top">
  </head>
  <body>
   <div>
     <a href="http://google.com">Click Me!</a>
   </div>
 </body>
</html>

تگ‌های سطح بالای HTML

در حالت سندباکس NATIVEEMULATED )، تگ‌های HTML خاصی به طور خودکار به فایل Apps Script .html اضافه می‌شوند، اما هنگام استفاده از حالت IFRAME این اتفاق نمی‌افتد.

برای اطمینان از اینکه صفحات پروژه شما به درستی با استفاده از IFRAME ارائه می‌شوند، محتوای صفحه خود را در تگ‌های سطح بالای زیر قرار دهید:

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

کتابخانه‌ی gapi loader باید به طور صریح بارگذاری شود.

اسکریپت‌هایی که به بارگذاری خودکار کتابخانه‌ی gapi loader ( api.js ) متکی بودند، باید تغییر کنند تا این کتابخانه را به طور صریح بارگذاری کنند، مانند مثال زیر:

<script src="https://apis.google.com/js/api.js?onload=onApiLoad">
</script>

تغییر در API انتخابگر گوگل

هنگام استفاده از API مربوط به Google Picker ، اکنون باید هنگام ساخت PickerBuilder، تابع setOrigin فراخوانی کرده و origin 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);
}

برای یک مثال کامل، به پنجره‌های محاوره‌ای باز کردن فایل مراجعه کنید.

پشتیبانی مرورگر

The IFRAME sandbox mode is based on the iframe sandboxing feature in HTML5. This is not supported in some older browsers, such as Internet Explorer 9. This can be an issue if your Apps Script project both:

  • HtmlService استفاده می‌کند، و
  • قبلاً از سندباکس EMULATED یا NATIVE استفاده شده بود

انتقال این برنامه‌ها به حالت سندباکس IFRAME به این معنی است که ممکن است دیگر روی برخی مرورگرهای قدیمی (به‌ویژه IE9 و قبل از آن) که از ویژگی سندباکس iframe HTML5 پشتیبانی نمی‌کنند، کار نکنند.

برنامه‌هایی که از قبل حالت IFRAME درخواست می‌کنند یا اصلاً HtmlService استفاده نمی‌کنند، تحت تأثیر این مشکل قرار نمی‌گیرند.

اکنون HTTPS برای منابع وارد شده الزامی است

برنامه‌های قبلی که منابع را با استفاده از HTTP وارد می‌کردند، باید تغییر داده شوند تا به جای آن از HTTPS استفاده کنند.

ارسال فرم دیگر به طور پیش‌فرض جلوگیری نمی‌شود

Under NATIVE sandboxing HTML forms were prevented from actually submitting and navigating the page. Given that, a developer could add an onclick handler to the submit button and not have to worry about what happened after.

With IFRAME mode however HTML forms are allowed to submit, and if a form element has no action attribute specified it will submit to a blank page. Worse, the inner iframe will redirect to the blank page before the onclick handler has a chance to finish.

راه حل این است که کد جاوا اسکریپت را به صفحه خود اضافه کنید که از ارسال عناصر فرم جلوگیری کند، به طوری که کنترل کننده‌های کلیک زمان کافی برای عملکرد داشته باشند:

// 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);

یک مثال کامل را می‌توانید در راهنمای HtmlService با عنوان «ارتباط کلاینت به سرور» بیابید.