Google Apps Script API DriveApp.getFileById के लिए प्राधिकरण

Oct 07 2020

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

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

DriveApp.getFileByID(pictureID)

यह महान काम करता है! कोई समस्या नहीं।

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

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 स्कोप्स की आवश्यकता है:

Google के दस्तावेज़ के अनुसार https://developers.google.com/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 सहमति स्क्रीन पर परिभाषित किया है:

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

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

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

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

अपडेट करें:

यहां स्क्रिप्ट से कोड है जो एपीआई स्क्रिप्ट को कॉल करता है (गोपनीयता के लिए कुछ बदला), जैसा कि मैं सोच रहा हूं कि शायद समस्या क्लाइंट / कॉलिंग साइड पर नहीं हो सकती है। शायद मुझे 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);

जवाब

Chris Oct 07 2020 at 22:27

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

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

स्क्रिप्ट एडिटर के अंदर, व्यू / शो मेनिफ़ेस्ट फ़ाइल पर जाएँ।

यह वही है जो पहले जैसा दिखता था:

{
  "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 को बचाया। मैं फिर अपने रनऑनएडिट ट्रिगर (कॉलिंग स्क्रिप्ट) पर गया, हटा दिया और इसे फिर से जोड़ा। हालांकि, यह एक बुरा दिखने वाली त्रुटि थी:

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