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 سطح بالا
در حالت NATIVE
(و EMULATED
)، برچسبهای 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 ارتباط مشتری به سرور پیدا کرد.