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

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

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

  • अब आपको target="_top" का इस्तेमाल करके, लिंक के target एट्रिब्यूट को बदलना होगा या target="_blank"
  • HTML सेवा द्वारा प्रस्तुत की जाने वाली HTML फ़ाइलों में शामिल <!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 पिकर एपीआई का इस्तेमाल करते समय, अब आपको फ़ाइल बनाते समय 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 और इससे पहले के वर्शन) जो HTML5 के iframe के साथ काम नहीं करते सैंडबॉक्स की सुविधा है.

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

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

एचटीटीपी का इस्तेमाल करके संसाधन इंपोर्ट करने वाले पिछले ऐप्लिकेशन को इसके बजाय एचटीटीपीएस का इस्तेमाल करें.

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

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

हालांकि, IFRAME मोड में एचटीएमएल फ़ॉर्म को सबमिट किया जा सकता है. अगर एचटीएमएल फ़ॉर्म का इस्तेमाल किया जा रहा है, तो एलिमेंट में कोई 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 गाइड पर एक पूरा उदाहरण देखा जा सकता है क्लाइंट-टू-सर्वर कम्यूनिकेशन.