2017-04-11 8 views
11

मैंने नीचे "एंड्रॉइड क्विकस्टार्ट" का पालन किया।एंड्रॉइड में एपीआई 4 का उपयोग कर नाम से Google ड्राइव शीट खोजें

https://developers.google.com/sheets/api/quickstart/android

महान काम करता है।

लेकिन सैंपल हार्ड कोड एक स्प्रेडशीट मौजूदा स्प्रेडशीट में है।

String spreadsheetId = "1BxiMVs0XRA5nFMdKvBdBZjgmUUqptlbs74OgvE2upms"; 

मैं, मौजूदा स्प्रैडशीट को खोजने नाम से, और आईडी (बाद में उपयोग के लिए) स्टोर करने के लिए सक्षम होना चाहिए।

मैं इस तरह कुछ करने के लिए करना चाहते हैं:

private com.google.api.services.sheets.v4.Sheets sheetsService = null; 


HttpTransport transport = AndroidHttp.newCompatibleTransport(); 
JsonFactory jsonFactory = JacksonFactory.getDefaultInstance(); 

sheetsService = new com.google.api.services.sheets.v4.Sheets.Builder(
     transport, jsonFactory, credential) 
     .setApplicationName("My Application Name") 
     .build(); 

String spreadsheetId = null; 
List<Spreadsheet> allSpreadsheets = sheetsService.spreadsheets().getAListOfAllSpreadsheets; 
for (Spreadsheet spreadsheet : allSpreadsheets) { 
    if (spreadsheet.getName().equals("My Sheet")){ 
     // found! 
     spreadsheetId = spreadsheet.getId(); 
    } 
} 

अग्रिम में बहुत धन्यवाद!

+0

आप इस [अतः धागा] में प्रदान की समाधान (करने की कोशिश की है http://stackoverflow.com/questions/38123383/how-to-get-sheet- नाम-ऑफ-द-अलग-अलग शीट में गूगल-स्प्रेडशीट-google-शीट)? उन्होंने सेवा का उपयोग किया। स्प्रेडशीट्स()। (स्प्रेडशीटआईडी) प्राप्त करें .setIncludeGridData (false) .execute(); और उसके बाद getSheets() फ़ंक्शन का उपयोग करके प्रतिक्रिया को पार्स किया। – noogui

+0

@noogui मेरे पास पास करने के लिए एक स्प्रेडशीट नहीं है। मैं शीट खोजने के लिए सिर्फ एक शीट बनाने से नफरत करता हूं। धन्यवाद था। – LimaNightHawk

+0

आप जो भी कर रहे हैं वह दस्तावेज़ों में भी उल्लेख नहीं किया गया है – noogui

उत्तर

3

ऐसा लगता है कि यह शीट्स एपीआई v4 के साथ नहीं किया जा सकता है।

हालांकि ... ऐसा लगता है कि यह संगत Google ड्राइव API v3 के साथ किया जा सकता है।

नोट: इस समाधान के बारे में सबसे अच्छा हिस्सा यह था कि मैं दोनों एपीआई के लिए प्रमाणीकरण और क्रेडेंशियल एकत्रण की एक ही विधि का उपयोग कर सकता था। उदाहरण के लिए, एक बार मेरे पास प्रमाण-पत्र प्राप्त करने के लिए कोड था, तो मैं इसे एपीआई के एक दूसरे के लिए और लगातार दोनों के लिए उपयोग कर सकता था।

यहाँ मैं क्या किया है:

जोड़ा गया यह करने के लिए मेरे build.gradle (मेरी शीट्स एपीआई घोषणा नीचे दिखाया गया है)

compile('com.google.apis:google-api-services-sheets:v4-rev468-1.22.0') { 
    exclude group: 'org.apache.httpcomponents' 
} 
compile('com.google.apis:google-api-services-drive:v3-rev69-1.22.0') { 
    exclude group: 'org.apache.httpcomponents' 
} 

मैं पहले से ही खाता और साख प्राप्त करने के लिए EasyPermissions विधि का उपयोग किया गया था। Great example here

फिर

...

import com.google.api.services.drive.Drive; 
import com.google.api.services.sheets.v4.Sheets; 

...

private static final String[] SCOPES = { SheetsScopes.SPREADSHEETS, DriveScopes.DRIVE_METADATA_READONLY }; 

...

credentials = GoogleAccountCredential.usingOAuth2(getApplicationContext(), Arrays.asList(SCOPES)); 

...

protected Drive driveService = new Drive.Builder(transport, jsonFactory, credential) 
      .setApplicationName("My Application Name") 
      .build(); 

protected Sheets sheetsService = new Sheets.Builder(transport, jsonFactory, credential) 
      .setApplicationName("My Application Name") 
      .build(); 

...async:

Drive.Files.List request = driveService.files().list() 
      .setPageSize(10) 
      // Available Query parameters here: 
      //https://developers.google.com/drive/v3/web/search-parameters 
      .setQ("mimeType = 'application/vnd.google-apps.spreadsheet' and name contains 'smith' and trashed = false") 
      .setFields("nextPageToken, files(id, name)"); 

    FileList result = request.execute(); 

    List<File> files = result.getFiles(); 
    String spreadsheetId = null; 
    if (files != null) { 
     for (File file : files) { 

      // More code here to discriminate best result, if you want 
      spreadsheetId = file.getId(); 
     } 
    } 

तो फिर तुम सीधे आईडी शीट्स एपीआई के लिए उपयोग कर सकते हैं:

ValueRange response = sheetsService.spreadsheets().values().get(spreadsheetId, "A1:B2").execute(); 
    List<List<Object>> values = response.getValues(); 
+1

मैंने आपके कोड उदाहरण का पालन किया, लेकिन मुझे 403, अपर्याप्त अनुमति त्रुटि संदेश मिलता है। मैंने GoogleSheets API लागू किया है, जो इस कोड में बदलाव से पहले काम करता है। – Manikandan

+0

आह, हाँ! मैं शर्त लगाता हूं कि आपकी सही स्कॉप्स की कमी है। आपको शायद 'DRIVE_METADATA_READONLY' दायरे की आवश्यकता है। मैं इसे शामिल करने के लिए उत्तर अद्यतन कर दूंगा।(मैं भूल गया था कि जब मैं इसे काम पर ला रहा था तो यह एक कदम था।) – LimaNightHawk

+1

ड्राइवस्कोप का उपयोग करके दायरे को बदलना काम करता है। – Manikandan

2

यह मेरे लिए लग रहा है आप Spreadsheet और Sheet वस्तुओं भ्रमित कर रहे हैं की तरह:

  • एक Spreadsheet एक आईडी के साथ एक फ़ाइल है, जो यूआरएल द्वारा https://docs.google.com/spreadsheets/d/आपकी स्प्रैडशीटआईडी; यह एक Google ड्राइव फ़ोल्डर (जैसे Excel कार्यपुस्तिका) में संग्रहीत एक दस्तावेज़ है।

  • SheetSpreadsheet में एक टैब है, जिसमें आपकी कार्यपुस्तिका में एक पृष्ठ की तरह कोशिकाएं हैं। इसमें कोई आईडी नहीं है और कोई प्रत्यक्ष यूआरएल नहीं है। वैसे वास्तव में API v4 reference इंगित करता है कि शीट्स में आईडी भी हैं, लेकिन भ्रमित रूप से पर्याप्त ये केवल संदर्भ संख्या हैं जिन्हें आप Google Apps स्क्रिप्ट में भी एक्सेस नहीं कर सकते हैं, और आपकी समस्या में आपकी सहायता नहीं करेंगे।

तो आप सीधे स्प्रेडशीट में किसी श्रेणी तक नहीं पहुंच सकते हैं, न ही आपको आईडी द्वारा शीट मिल सकती है।

इसी तरह काफी अपने प्रश्न का उत्तर

, यहाँ मैं क्या सुझाव है कि है:

_ अपनी शीट्स अपनी डिस्क फ़ाइलों के माध्यम से ब्राउज़ करें (mimeType == "application/vnd.google-apps.spreadsheet" द्वारा फिल्टर)

प्रत्येक स्प्रेडशीट फ़ाइल __For, ब्राउज़ (spreadsheet.sheets[])

___ वर्तमान स्प्रेडशीट में प्रत्येक शीट के लिए, जांचें कि क्या यह उसका नाम देखकर है (sheet.title)

एक बार आपको सही शीट मिल गई, तो आप ca n इसमें स्प्रेडशीट आईडी (spreadsheet.spreadsheetId) शामिल है।

एक और बात: अपने जवाब के तल पर, आप ने लिखा ValueRange response = sheetsService.spreadsheets().values().get(spreadsheetId, "A1:B2").execute(); आप पहली बार सीमा युक्त शीट निर्दिष्ट किए बिना किसी स्प्रेडशीट से एक कक्ष श्रेणी का उपयोग करने के लिए सक्षम नहीं होगा: "A1:B2" के बजाय, क्या तुम करोगी "mySheetTitle!A1:B2" की आवश्यकता है।

मुझे आशा है कि इस भ्रम :) ऊपर समाशोधन है

+1

अद्यतन पत्र "शीट" बनाम "स्प्रेडशीट" के बारे में अधिक स्पष्ट होने के लिए। माइम टाइप के बारे में महान युक्ति (एक खोज मानदंड के रूप में शामिल करने के लिए अद्यतन उत्तर)। अंत में, आपको सीमा में शीट क्वालीफायर की आवश्यकता नहीं है। रेंज सेटिंग परीक्षण कोड और काम से है। – LimaNightHawk

+0

यदि स्प्रेडशीट में केवल एक शीट है तो मुझे विश्वास है कि यह सीमा में शीट निर्दिष्ट किए बिना काम करता है; हालांकि यदि स्प्रेडशीट में एकाधिक चादरें हैं (जो शायद सबसे अधिक मामला है), तो यह नहीं पता कि कौन सी शीट चुननी है। – flo5783

संबंधित मुद्दे