انتقال به حالت جعبه ایمنی IFRAME

Apps Script از یک جعبه ایمنی امنیتی برای ارائه ایزوله محافظ برای برنامه های Google Workspaceدر شرایط خاص استفاده می کند. همه حالت‌های جعبه ایمنی به جز IFRAME اکنون غروب هستند. برنامه‌هایی که از حالت‌های جعبه ایمنی قدیمی‌تر استفاده می‌کنند، اکنون از حالت جدیدتر IFRAME به‌طور خودکار استفاده می‌کنند.

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

  • اکنون باید ویژگی target پیوند را با استفاده از target="_top" یا target="_blank" لغو کنید.
  • فایل های HTML ارائه شده توسط سرویس HTML باید دارای تگ های <!DOCTYPE html>، <html> و <body> باشند.
  • کتابخانه بارگذار بومی Google api.js به طور خودکار در حالت IFRAME بارگیری نمی شود
  • کاربران 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>

همچنین می‌توانید این ویژگی را با استفاده از تگ <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 خاصی به‌طور خودکار به فایل html. Apps Script اضافه می‌شوند، اما در هنگام استفاده از حالت IFRAME این اتفاق نمی‌افتد.

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

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

کتابخانه بارگذار جاوا اسکریپت بومی باید به صراحت بارگیری شود

اسکریپت هایی که به بارگیری خودکار کتابخانه بارکننده بومی api.js متکی هستند، باید تغییر کنند تا این کتابخانه به طور صریح بارگیری شود، مانند مثال زیر:

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

تغییر API Google Picker

هنگام استفاده از Google Picker API ، اکنون باید setOrigin() هنگام ساختن PickerBuilder فراخوانی کنید و 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 بر اساس ویژگی sandboxing iframe در HTML5 است. این در برخی از مرورگرهای قدیمی‌تر مانند اینترنت اکسپلورر 9 پشتیبانی نمی‌شود. اگر Apps Script شما هر دو را پروژه می‌کند، ممکن است مشکل ایجاد شود:

  • از HtmlService و
  • قبلاً از sandboxing EMULATED یا NATIVE استفاده شده است

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

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

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

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

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

تحت سندباکس NATIVE ، فرم‌های HTML از ارسال و پیمایش واقعی صفحه جلوگیری می‌شدند. با توجه به آن، یک توسعه‌دهنده می‌تواند به سادگی یک کنترل کننده onclick را به دکمه ارسال اضافه کند و نگران اتفاقات بعدی نباشد.

با این حال، با حالت IFRAME ، فرم‌های HTML مجاز به ارسال هستند، و اگر عنصر فرم هیچ ویژگی action مشخصی نداشته باشد، به یک صفحه خالی ارسال می‌شود. بدتر از آن، iframe داخلی قبل از اینکه کنترل کننده onclick فرصتی برای اتمام داشته باشد به صفحه خالی هدایت می شود.

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

<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 ارتباط مشتری به سرور پیدا کرد.