Iफ़्रेम सैंडबॉक्स मोड पर माइग्रेट करना

Apps Script में सिक्योरिटी सैंडबॉक्स का इस्तेमाल करके, कुछ खास स्थितियों में ऐप्लिकेशन को सुरक्षित रखा जाता है. Google WorkspaceIFRAME को छोड़कर, सभी सैंडबॉक्स मोड अब बंद कर दिए गए हैं. पुराने सैंडबॉक्स मोड का इस्तेमाल करने वाले ऐप्लिकेशन, अब अपने-आप नए IFRAME मोड का इस्तेमाल करते हैं.

जिन ऐप्लिकेशन ने पहले एचटीएमएल सेवा के साथ इन पुराने मोड का इस्तेमाल किया है उन्हें नीचे दिए गए अंतरों को ठीक करने के लिए, IFRAME मोड में बदलाव करने पड़ सकते हैं:

  • अब आपको target="_top" या target="_blank" का इस्तेमाल करके लिंक के target एट्रिब्यूट को बदलना होगा
  • एचटीएमएल सेवा से मिलने वाली एचटीएमएल फ़ाइलों में <!DOCTYPE html>, <html>, और <body> टैग शामिल होने चाहिए
  • Google की नेटिव लोडर लाइब्रेरी api.js, IFRAME मोड में अपने-आप लोड नहीं होती
  • पिकर के उपयोगकर्ताओं को setOrigin() को कॉल करना होगा, क्योंकि कॉन्टेंट नए डोमेन से उपलब्ध कराया गया है
  • IE9 सहित कुछ पुराने ब्राउज़र इसके साथ काम नहीं करते
  • इंपोर्ट किए गए संसाधनों में अब एचटीटीपीएस का इस्तेमाल होना चाहिए
  • फ़ॉर्म सबमिट करने पर, डिफ़ॉल्ट रूप से रोक नहीं लगी है

इन अंतरों के बारे में नीचे दिए गए सेक्शन में बताया गया है.

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> टैग का इस्तेमाल भी किया जा सकता है:

<!DOCTYPE html>
<html>
  <head>
    <base target="_top">
  </head>
  <body>
   <div>
     <a href="http://google.com">Click Me!</a>
   </div>
 </body>
</html>

टॉप-लेवल के एचटीएमएल टैग

NATIVE (और EMULATED) सैंडबॉक्स मोड में, कुछ एचटीएमएल टैग Apps Script .html फ़ाइल में अपने-आप जुड़ जाएंगे. हालांकि, 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 का इस्तेमाल करते समय, अब आपको PickerBuilder बनाते समय setOrigin() को कॉल करना होगा. साथ ही, ऑरिजिन 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 सैंडबॉक्सिंग की सुविधा पर आधारित है. यह Internet Explorer 9 जैसे कुछ पुराने ब्राउज़र में समर्थित नहीं है. अगर आपका Apps Script प्रोजेक्ट, दोनों में से एक है, तो यह समस्या हो सकती है:

  • HtmlService का इस्तेमाल करता है, और
  • पहले EMULATED या NATIVE सैंडबॉक्सिंग का इस्तेमाल किया गया

इन ऐप्लिकेशन को IFRAME सैंडबॉक्स मोड में माइग्रेट करने का मतलब है कि ये ऐसे पुराने ब्राउज़र (खास तौर पर IE9 और इससे पहले के वर्शन) पर काम नहीं करेंगे जो HTML5 के iframe सैंडबॉक्सिंग की सुविधा के साथ काम नहीं करते.

उन ऐप्लिकेशन पर इस समस्या का कोई असर नहीं पड़ा है जो पहले से ही IFRAME मोड का अनुरोध करते हैं या जो HtmlService का बिलकुल भी इस्तेमाल नहीं करते.

इंपोर्ट किए गए संसाधनों के लिए, अब एचटीटीपीएस ज़रूरी है

एचटीटीपी का इस्तेमाल करके रिसॉर्स इंपोर्ट करने वाले पिछले ऐप्लिकेशन को, एचटीटीपीएस का इस्तेमाल करने के लिए बदलना होगा.

फ़ॉर्म सबमिट करने पर, डिफ़ॉल्ट रूप से रोक नहीं लगी है

NATIVE के तहत, सैंडबॉक्सिंग एचटीएमएल फ़ॉर्म को असल में पेज सबमिट और नेविगेट करने से रोका गया. हालांकि, डेवलपर 'सबमिट करें' बटन में सिर्फ़ onclick हैंडलर जोड़ सकता है और उसे इस बात की चिंता नहीं करनी होती कि बाद में क्या हुआ.

हालांकि, IFRAME मोड में एचटीएमएल फ़ॉर्म को सबमिट किया जा सकता है. अगर फ़ॉर्म के किसी एलिमेंट में action एट्रिब्यूट नहीं है, तो उसे खाली पेज पर सबमिट किया जाएगा. इससे पहले कि onclick हैंडलर को पूरा किया जा सके, अंदरूनी iframe खाली पेज पर रीडायरेक्ट कर देगा.

इसका समाधान यह है कि आप अपने पेज पर 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 गाइड क्लाइंट-टू-सर्वर कम्यूनिकेशन पर मिल सकता है.