Apps Script از یک سندباکس امنیتی برای ایجاد ایزولهسازی محافظتی برای برنامههای Google Workspace در موقعیتهای خاص استفاده میکند. همه حالتهای سندباکس اکنون به جز IFRAME غیرفعال شدهاند. برنامههایی که از حالتهای قدیمیتر سندباکس استفاده میکنند، اکنون به طور خودکار از حالت جدیدتر IFRAME استفاده میکنند.
برنامههایی که قبلاً از این حالتهای قدیمیتر با سرویس HTML استفاده میکردند، ممکن است نیاز به ایجاد تغییراتی برای حالت IFRAME داشته باشند تا تفاوتهای زیر را برطرف کنند:
- اکنون باید ویژگی
targetلینک را با استفاده ازtarget="_top"یاtarget="_blank"لغو کنید. - فایلهای HTML که توسط سرویس HTML ارائه میشوند باید شامل تگهای <!DOCTYPE html>، <html> و <body> باشند.
- کتابخانه بارگذاری بومی گوگل،
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
در حالت سندباکس NATIVE (و EMULATED )، تگهای HTML خاصی به طور خودکار به فایل Apps Script .html اضافه میشوند، اما هنگام استفاده از حالت 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 انتخابگر گوگل
هنگام استفاده از API انتخابگر گوگل ، اکنون باید هنگام ساخت 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);
}
برای یک مثال کامل، به پنجرههای محاورهای باز کردن فایل مراجعه کنید.
پشتیبانی مرورگر
حالت سندباکس IFRAME بر اساس ویژگی سندباکس iframe در HTML5 است. این حالت در برخی از مرورگرهای قدیمی مانند Internet Explorer 9 پشتیبانی نمیشود. اگر پروژه Apps Script شما هر دو مورد زیر را داشته باشد، این میتواند مشکلساز باشد:
-
HtmlServiceاستفاده میکند، و - قبلاً از سندباکس
EMULATEDیاNATIVEاستفاده شده بود
انتقال این برنامهها به حالت سندباکس IFRAME به این معنی است که ممکن است دیگر روی برخی مرورگرهای قدیمی (بهویژه IE9 و قبل از آن) که از ویژگی سندباکس 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 با عنوان «ارتباط کلاینت به سرور» بیابید.