অ্যাপস স্ক্রিপ্ট নির্দিষ্ট পরিস্থিতিতে গুগল ওয়ার্কস্পেস অ্যাপ্লিকেশনগুলির জন্য সুরক্ষামূলক বিচ্ছিন্নতা প্রদানের জন্য একটি সুরক্ষা স্যান্ডবক্স ব্যবহার করে। IFRAME ছাড়া সমস্ত স্যান্ডবক্স মোড এখন বন্ধ। পুরানো স্যান্ডবক্স মোড ব্যবহারকারী অ্যাপগুলি এখন স্বয়ংক্রিয়ভাবে নতুন IFRAME মোড ব্যবহার করে।
যেসব অ্যাপ পূর্বে HTML পরিষেবার সাথে এই পুরানো মোডগুলি ব্যবহার করেছে, তাদের নিম্নলিখিত পার্থক্যগুলি সমাধান করার জন্য IFRAME মোডে পরিবর্তন করতে হতে পারে:
- এখন আপনাকে
target="_top"অথবাtarget="_blank"ব্যবহার করে লিঙ্কেরtargetঅ্যাট্রিবিউটটি ওভাররাইড করতে হবে। - HTML পরিষেবা দ্বারা পরিবেশিত HTML ফাইলগুলিতে অবশ্যই <!DOCTYPE html>, <html>, এবং <body> ট্যাগ অন্তর্ভুক্ত থাকতে হবে
- গুগল নেটিভ লোডার লাইব্রেরি
api.jsIFRAMEমোডে স্বয়ংক্রিয়ভাবে লোড হয় না। - পিকার ব্যবহারকারীদের
setOrigin()কল করতে হবে কারণ কন্টেন্ট একটি নতুন ডোমেন থেকে পরিবেশিত হচ্ছে - IE9 সহ কিছু পুরোনো ব্রাউজার সমর্থিত নয়।
- আমদানি করা রিসোর্সগুলিকে এখন HTTPS ব্যবহার করতে হবে
- ফর্ম জমা দেওয়ার সময় আর ডিফল্টভাবে বাধা দেওয়া হয় না
এই পার্থক্যগুলি নিম্নলিখিত বিভাগগুলিতে বিস্তারিতভাবে বর্ণনা করা হয়েছে।
লিঙ্ক টার্গেট অ্যাট্রিবিউট সেট করা হচ্ছে
IFRAME মোডে আপনাকে link target অ্যাট্রিবিউটটি _top অথবা _blank এ সেট করতে হবে:
কোড.জেএস
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> ট্যাগ ব্যবহার করেও এই অ্যাট্রিবিউটটিকে ওভাররাইড করতে পারেন:
<!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>
গুগল পিকার এপিআই পরিবর্তন
Google Picker 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 স্যান্ডবক্স মোডটি HTML5-এর iframe স্যান্ডবক্সিং বৈশিষ্ট্যের উপর ভিত্তি করে তৈরি। এটি কিছু পুরানো ব্রাউজারে সমর্থিত নয়, যেমন ইন্টারনেট এক্সপ্লোরার 9। যদি আপনার অ্যাপস স্ক্রিপ্ট দুটি প্রজেক্ট করে তবে এটি একটি সমস্যা হতে পারে:
-
HtmlServiceকরে, এবং - পূর্বে ব্যবহৃত
EMULATEDবাNATIVEস্যান্ডবক্সিং
এই অ্যাপগুলিকে IFRAME স্যান্ডবক্স মোডে স্থানান্তরিত করার অর্থ হল এগুলি আর কিছু পুরোনো ব্রাউজারে (বিশেষ করে IE9 এবং তার আগের) কাজ নাও করতে পারে যা HTML5 এর iframe স্যান্ডবক্সিং বৈশিষ্ট্য সমর্থন করে না।
যেসব অ্যাপ ইতিমধ্যেই IFRAME মোডের অনুরোধ করে অথবা HtmlService ব্যবহার করে না, তারা এই সমস্যা থেকে মুক্ত।
আমদানি করা রিসোর্সের জন্য এখন HTTPS প্রয়োজন
পূর্ববর্তী যেসব অ্যাপ্লিকেশন HTTP ব্যবহার করে রিসোর্স আমদানি করত, সেগুলোকে HTTPS ব্যবহার করে পরিবর্তন করতে হবে।
ফর্ম জমা দেওয়ার সময় আর ডিফল্টভাবে বাধা দেওয়া হয় না
NATIVE স্যান্ডবক্সিংয়ের অধীনে HTML ফর্মগুলিকে আসলে জমা দেওয়া এবং পৃষ্ঠাটি নেভিগেট করা থেকে বিরত রাখা হয়েছিল। এর ফলে, একজন ডেভেলপার কেবল সাবমিট বোতামে একটি onclick হ্যান্ডলার যোগ করতে পারতেন এবং পরে কী ঘটেছিল তা নিয়ে চিন্তা করতে হত না।
তবে IFRAME মোডে HTML ফর্ম জমা দেওয়ার অনুমতি রয়েছে, এবং যদি কোনও ফর্ম উপাদানের কোনও action অ্যাট্রিবিউট নির্দিষ্ট না থাকে তবে এটি একটি ফাঁকা পৃষ্ঠায় জমা হবে। আরও খারাপ, 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 গাইড Client-to-Server Communication -এ পাওয়া যাবে।