मेरे पास एक Google क्लाउड प्लेटफ़ॉर्म प्रोजेक्ट (जीसीपी) है जो लगभग सभी स्क्रिप्ट/फ़ंक्शंस को सीधे चलाता है, लेकिन एक जोड़े को एपीआई के माध्यम से चलाता है। सब कुछ केवल G Suite डोमेन के लिए आंतरिक रूप से पहुंच योग्य है, और OAuth सहमति स्क्रीन एप्लिकेशन प्रकार "आंतरिक" है।

enter image description here

मेरे पास एक स्क्रिप्ट है, जिसे एपीआई के माध्यम से नहीं कहा जाता है, लेकिन सीधे हर एक्स मिनट में टाइमर पर। यह एक प्रदर्शन करता है

DriveApp.getFileByID(pictureID)

यह बहुत अच्छा काम करता है! कोई समस्या नहीं।

मेरे पास एक ही जीसीपी प्रोजेक्ट में एक अलग स्क्रिप्ट भी है, जो टाइमर द्वारा ट्रिगर होने के बजाय, एपीआई के माध्यम से कॉल करके चलती है। यहां कोड की पंक्ति है जो इसे कॉल करती है (वास्तव में महत्वपूर्ण नहीं):

var result = UrlFetchApp.fetch(url, options);

एपीआई स्क्रिप्ट बहुत अच्छी चलती है! जब तक यह निम्न पंक्तियों तक नहीं पहुंच जाता:

      try { var file = DriveApp.getFileById(pictureID); }
      catch (e) {
        Logger.log('e = ' + JSON.stringify(e));
        return;
      }

लॉग का परिणाम है

e = {"name":"Exception"}

मैंने सत्यापित किया कि चित्र आईडी वही है जो गैर-एपीआई स्क्रिप्ट में काम करती है। मैं इस एपीआई-रन स्क्रिप्ट में "कोशिश" कर रहा हूं ताकि यह सुनिश्चित हो सके कि सॉफ़्टवेयर की फ़ाइल तक पहुंच है, वास्तव में इसे एक्सेस करने के लिए नहीं।

मुझे पूरा यकीन है कि यह एक प्राधिकरण मुद्दा है। मैं अभी कुछ समय के लिए जीसीपी का उपयोग कर रहा हूं, प्राधिकरण के साथ कुछ अनुभव है, लेकिन बहुत कुछ नहीं।

यहां प्राधिकरणों के बारे में कुछ विवरण दिए गए हैं...

प्रोजेक्ट की स्क्रिप्ट प्रोजेक्ट प्रॉपर्टीज (फाइल/प्रोजेक्ट प्रॉपर्टीज) से पता चलता है कि इसे निम्नलिखित OAuth स्कोप की जरूरत है: यहां छवि विवरण दर्ज करें

https://developers.google.com पर Google के दस्तावेज़ के अनुसार /apps-script/reference/drive/drive-app#getfilebyidid,

Scripts that use this method require authorization with one or more of the following scopes: 

https://www.googleapis.com/auth/drive.readonly
https://www.googleapis.com/auth/drive

यहां वे क्षेत्र दिए गए हैं जिन्हें मैंने अभी GCP Oauth सहमति स्क्रीन पर परिभाषित किया है: यहां छवि विवरण दर्ज करें

जैसा कि आप देख सकते हैं, मैंने ड्राइव, ड्राइव.रीडओनली, और ड्राइव.फाइल (जिसकी वास्तव में आवश्यकता नहीं है) को जोड़ा है।

इन सबसे ऊपर, यह विशेष छवि फ़ाइल GCP प्रोजेक्ट के स्वामी, स्क्रिप्ट और G Suite डोमेन के शीर्ष-स्तरीय व्यवस्थापक के Google डिस्क में संग्रहीत है। ऐसा हमेशा नहीं होगा, क्योंकि उपयोगकर्ता अपने स्वयं के Google डिस्क से इस सॉफ़्टवेयर/GCP स्वामी के साथ चित्र साझा करेंगे। हालांकि, मुझे लगता है कि अब भी टाइमर द्वारा ट्रिगर की गई स्क्रिप्ट उन उपयोगकर्ता द्वारा साझा की गई फ़ाइलों के साथ काम करेगी, लेकिन एपीआई के माध्यम से बुलाई गई स्क्रिप्ट नहीं।

मुझे पूरा यकीन है कि यह एक प्रामाणिक मुद्दा है, लेकिन मुझे कहीं कुछ याद आ रहा है।

आपके सहयोग के लिए धन्यवाद!

अद्यतन:

यहां स्क्रिप्ट से कोड है जो एपीआई स्क्रिप्ट को कॉल करता है (गोपनीयता के लिए कुछ बदल गया है), क्योंकि मैं सोच रहा हूं कि शायद समस्या क्लाइंट/कॉलिंग पक्ष पर नहीं हो सकती है। शायद मुझे OAuthToken ठीक से नहीं मिल रहा है? या टोकन के पास सही अनुमति नहीं है?

  var token = ScriptApp.getOAuthToken();
  
  var header = {
    "Content-Type": "application/json",
    "Authorization": "Bearer " + token,
  };
  
  var parms = [id];
  
  var data = {
    "function": "updateSettings",
    "parameters": parms,
    "devMode": true,
  }
  
  var options = {
    "method":"POST",
    "headers": header,
    "muteHttpExceptions": true,
    "payload": JSON.stringify(data)
  };
  
  // Call the API
  var result = UrlFetchApp.fetch(url, options);
0
Chris 7 अक्टूबर 2020, 19:06

1 उत्तर

सबसे बढ़िया उत्तर

मैंने Google से संपर्क करने के बाद इसका पता लगाया, और दुर्भाग्य से मुझे बहुत मदद नहीं मिली, और कुछ और घंटों की कोशिश और शोध ...

जो मैं याद कर रहा था वह मैनिफेस्ट/ऐप्सस्क्रिप्ट.जेसन फ़ाइल में "शपथ" जोड़ रहा था। मैंने आवश्यक दायरे के साथ खेला और नीचे दिखाए गए निम्नलिखित दो के साथ समाप्त हुआ। मैंने इस उत्तर को देखकर समाधान निकाला: GAS में वेब ऐप्स को कॉल करने के लिए ScriptApp.getAuthToken() के माध्यम से प्राप्त AuthToken का उपयोग करना

स्क्रिप्ट संपादक के अंदर, मैनिफ़ेस्ट फ़ाइल देखें/दिखाएँ पर जाएँ।

यहाँ यह पहले जैसा दिखता था:

{
  "timeZone": "America/New_York",
  "dependencies": {
  },
  "webapp": {
    "access": "MYSELF",
    "executeAs": "USER_DEPLOYING"
  },
  "exceptionLogging": "STACKDRIVER",
  "runtimeVersion": "V8"
}

और यहाँ वही है जो अब दिखता है ...

{
  "timeZone": "America/New_York",
  "dependencies": {
  },
  "webapp": {
    "access": "MYSELF",
    "executeAs": "USER_DEPLOYING"
  },
  "exceptionLogging": "STACKDRIVER",
  "runtimeVersion": "V8",
  "oauthScopes": [
    "https://www.googleapis.com/auth/drive",
    "https://www.googleapis.com/auth/script.external_request"
    ]
}

जोड़ने के बाद, मैंने appsscript.json को सहेजा। मैं फिर अपने रनऑनएडिट ट्रिगर (कॉलिंग स्क्रिप्ट) पर गया, इसे हटा दिया और इसे फिर से जोड़ा। हालांकि, इससे एक खराब दिखने वाली त्रुटि हुई: यहां छवि विवरण दर्ज करें

मैंने इसे देखा, और यह पोस्ट पाया: ऐप्स स्क्रिप्ट पर नया ट्रिगर बनाते समय त्रुटि प्राप्त करना। तो, मैंने स्क्रिप्ट संपादक में कोड चलाया, और वास्तव में यह ऑथ स्क्रीन लाया। मैंने मंजूरी दे दी, ट्रिगर को फिर से जोड़ा, और अब एपीआई को कॉल करने में सब कुछ बढ़िया काम करता है!

0
Chris 8 अक्टूबर 2020, 01:27