يستخدم 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>
يجب تحميل مكتبة أداة تحميل JavaScript الأصلية بشكل صريح.
يجب تغيير النصوص البرمجية التي تعتمد على التحميل التلقائي لمكتبة أداة التحميل الأصلية api.js
لتحميل هذه المكتبة بشكل صريح، كما هو موضّح في المثال التالي:
<script src="https://apis.google.com/js/api.js?onload=onApiLoad">
</script>
تغيير في Google Picker API
عند استخدام 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
وضع الحماية إلى ميزة
وضع الحماية في إطار iframe
في HTML5.
لا تتوفّر هذه الميزة في بعض المتصفّحات القديمة، مثل Internet Explorer 9. يمكن أن يشكّل ذلك
مشكلة إذا كان مشروعك على Apps Script يستوفي الشرطَين التاليَين:
- يستخدم
HtmlService
- استخدام ميزة "وضع الحماية" في
EMULATED
أوNATIVE
في السابق
عند نقل هذه التطبيقات إلى وضع "وضع الحماية في IFRAME
"، قد لا تعمل على
بعض المتصفحات القديمة (مثل IE9 والإصدارات الأقدم) التي لا تتيح ميزة وضع الحماية في IFRAME
لإطار iframe في HTML5.
إنّ التطبيقات التي تطلب حاليًا وضع IFRAME
أو لا تستخدم HtmlService
على الإطلاق لن تتأثر بهذه المشكلة.
يجب الآن استخدام بروتوكول HTTPS للموارد المستورَدة
يجب تغيير التطبيقات السابقة التي استوردت الموارد باستخدام HTTP لتتحوّل إلى استخدام HTTPS بدلاً من ذلك.
لم يعُد يتم منع إرسال النماذج تلقائيًا
في إطار NATIVE
، تم منع نماذج HTML من إرسال بياناتها
والتنقّل في الصفحة. وبناءً على ذلك، يمكن للمطوّر ببساطة إضافة onclick
معالج إلى زر الإرسال بدون القلق بشأن ما يحدث بعد ذلك.
في وضع IFRAME
، يُسمح بإرسال نماذج HTML، وإذا لم يكن عنصر النموذج يحتوي على سمة action
محدّدة، سيتم إرساله إلى صفحة فارغة.
والأسوأ من ذلك، أنّ إطار iframe الداخلي سيعيد التوجيه إلى الصفحة الفارغة قبل أن تنتهي مهلة onclick
المعالج.
يكمن الحل في إضافة رمز JavaScript إلى صفحتك يمنع عناصر النموذج من الإرسال الفعلي، حتى يتوفر لمعالجات النقرات وقت للعمل:
<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 التواصل بين العميل والخادم.