पायथन में Google पत्रक के साथ आरंभ करना। रजिस्टर करने से लेकर रीडिंग डेटा तक

कुछ समय के लिए मैं एक्सेल में डेटा अपलोड करने में कामयाब रहा, लेकिन मॉड बदल रहा है, उपयोगकर्ता इसे बादलों में चाहते हैं।

पायथन में कई परियोजनाओं का अनुवाद शुरू करने के बाद, मैंने फैसला किया कि यह एक्सेल को कुछ और आधुनिक के साथ बदलने (या जोड़ने) का समय था।

जब मुझे पहली बार पायथन से Google स्प्रैडशीट्स के साथ काम करने की आवश्यकता का सामना करना पड़ा, तो मैं इस भ्रम में था कि यह सब कुछ क्लिकों में किया जा सकता है। वास्तविकता कम बदली गई, लेकिन हमारे पास कोई अन्य ग्लोब नहीं है।

लेख ने मुझे बहुत मदद की:


हमेशा की तरह - जब आप पहली बार कुछ लेते हैं, तो आप एक ऐसे सवाल का सामना करते हैं, जो बाद में केवल दुस्साहस का कारण बनता है - कोई भी इस बारे में कैसे सोच सकता है। प्राथमिक एक ही!

शायद मैं सिर्फ एक लंबा रास्ता तय किया - मुझे खुशी होगी अगर आपने मुझे सही किया।

सभी कार्रवाइयाँ Windows + Python 3.6.6 चलाने वाले कंप्यूटर पर की गईं, और एक Jupyter नोटबुक का भी उपयोग किया गया।

प्रारंभिक सेटिंग्स के चरण में मुझे मुख्य कठिनाइयाँ हुईं। एक व्यावहारिक कोड ढूंढना मुश्किल नहीं है।

लेख में प्रयुक्त कोड रिपॉजिटरी में उपलब्ध है।

Google सेवाओं के लिए साइन अप करें और लाइब्रेरी स्थापित करें


तालिकाओं के साथ काम करने के लिए, आपको Google के साथ पंजीकरण करने, परियोजना स्थापित करने और आवश्यक लाइब्रेरी स्थापित करने की आवश्यकता है।

अंग्रेजी में आधिकारिक प्रलेखन यहाँ है

सबसे पहले आपको gmail.com पर पंजीकरण करना होगा (आप इसे स्वयं कर सकते हैं)। फिर आपको एक परियोजना बनाने की आवश्यकता है (जैसा कि Google अपनी सेवाओं तक पहुंच प्रदान करता है)।

यह एक लंबी और थकाऊ प्रक्रिया है जो आपको यह समझने की अनुमति देती है कि Google के इंटरफेस को सबसे सुविधाजनक और सहज क्यों नहीं कहा जाता है (कुछ लोगों को लगता है कि सामाजिक नेटवर्क Google+ ने इस कारण से इसे बंद नहीं किया है)।

ऐसा करने के लिए, कंसोल.डेवलपर्स .google.com/cloud - resource - manager पर जाएं और "प्रोजेक्ट बनाएं" पर क्लिक करें



परियोजना का नाम दर्ज करें और "बनाएँ" पर क्लिक करें



परियोजनाओं की अद्यतन सूची में मेनू पर जाएं "अनुमतियाँ"


खुलने वाली विंडो में, "जोड़ें" पर क्लिक करें, gmail.com डोमेन से अपना ईमेल पता दर्ज करें और "प्रोजेक्ट" - "बैनर" समूह चुनें



परिवर्तन सहेजें।

यह अजीब लग सकता है कि आपने एक परियोजना बनाई है, लेकिन अपने आप को अधिकार जारी करने के लिए मजबूर हैं। और यह वास्तव में अजीब है, लेकिन यह ऐसा रास्ता था जिसे इस पाठ्यक्रम को लिखने के समय लिया जाना था, ताकि सब कुछ उसी तरह से काम करना शुरू हो जाए जैसा कि इसे करना चाहिए।

कंसोल पर जाएँ

अपने प्रोजेक्ट पर सेटिंग्स मेनू चुनें



खुलने वाली विंडो में, "सेवा खाते" और फिर "सेवा खाता बनाएँ" चुनें



खाते का नाम दर्ज करें और "बनाएँ" पर क्लिक करें



स्वामी की भूमिका का चयन करें और जारी रखें पर क्लिक करें।



दिखाई देने वाली विंडो में, Create Key पर क्लिक करें



Json कुंजी प्रकार का चयन करें और बनाएँ पर क्लिक करें



कुंजियों के साथ एक फ़ाइल बनाई जाएगी और तुरंत डाउनलोड की जाएगी। इसे सहेजें, इसकी बदौलत हम Google सेवाओं तक पहुँच बना पाएंगे।

तीन क्षैतिज स्ट्रोक वाले बटन पर क्लिक करें, शिलालेख "Google API" के बाईं ओर, "API और सेवाएँ" चुनें, और इसमें उप-आइटम "नियंत्रण कक्ष"।



खुलने वाली विंडो में, "API और सेवाएँ सक्षम करें" पर क्लिक करें



सर्च बार में "गूगल ड्राइव" टाइप करें और "गूगल ड्राइव एपीआई" सेवा पर क्लिक करें



सक्षम करें पर क्लिक करें



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



कंट्रोल पैनल पर वापस जाएं



खुलने वाली विंडो में, "API और सेवाएँ सक्षम करें" पर क्लिक करें



खोज पट्टी में "शीट" दर्ज करें और "Google शीट एपीआई" सेवा पर क्लिक करें



सुनिश्चित करें कि यह एपीआई जुड़ा हुआ है। जब आप Google डिस्क API कनेक्ट करते हैं तो यह अपने आप चालू हो जाना चाहिए। यदि यह जुड़ा हुआ है, तो आप "प्रबंधित एपीआई" बटन देखेंगे, यदि नहीं, तो "सक्षम करें" बटन। यदि आवश्यक हो तो इसे चालू करें।

पिछली बार, कंसोल .developers.google.com/cloud-resource-manager पर जाएं

अपने प्रोजेक्ट पर सेटिंग्स मेनू चुनें


खुलने वाली विंडो में, "सेवा खाते" का चयन करें, और फिर सेवा खाते के ईमेल पते की प्रतिलिपि बनाएं और सहेजें। यह आपके लिए तालिकाओं तक पहुंच देने के लिए काम आएगा।



अब हम पुस्तकालयों की स्थापना के लिए आगे बढ़ते हैं। कंसोल में कमांड चलाएँ

pip3 install --upgrade google-api-python-client 

और फिर

 pip3 install oauth2client 

यह संभव है कि जब आप दूसरी कमांड चलाते हैं, तो आपको एक संदेश प्राप्त होगा कि oauth2client लाइब्रेरी पहले से स्थापित है।

Raw.githubusercontent.com/gsuitedevs/python-samples/master/sheets/quickstart/quickstart.py पर जाएं

सही माउस बटन दबाएँ और "इस रूप में सहेजें" चुनें



फ़ाइल को quickstart.py के रूप में सहेजें

और इसे कमांड के साथ चलाएं

 python quickstart.py 

ब्राउज़र में एक नया पृष्ठ खुल जाएगा (शायद यह कहेगा कि पृष्ठ असुरक्षित है, लेकिन साहसपूर्वक आगे बढ़ें) और आपको शर्तों को स्वीकार करना होगा।

इस पर हमारा मार्ग पूरा हुआ।

तालिका भरना और प्रारूपण करना


पहली तालिका बनाएं

 #   import httplib2 import apiclient.discovery from oauth2client.service_account import ServiceAccountCredentials CREDENTIALS_FILE = 'seraphic-effect-248407-7ac2c44ec709.json' #     ,     #     credentials = ServiceAccountCredentials.from_json_keyfile_name(CREDENTIALS_FILE, ['https://www.googleapis.com/auth/spreadsheets', 'https://www.googleapis.com/auth/drive']) httpAuth = credentials.authorize(httplib2.Http()) #    service = apiclient.discovery.build('sheets', 'v4', http = httpAuth) #      4  API spreadsheet = service.spreadsheets().create(body = { 'properties': {'title': '  ', 'locale': 'ru_RU'}, 'sheets': [{'properties': {'sheetType': 'GRID', 'sheetId': 0, 'title': '  ', 'gridProperties': {'rowCount': 100, 'columnCount': 15}}}] }).execute() spreadsheetId = spreadsheet['spreadsheetId'] #    print('https://docs.google.com/spreadsheets/d/' + spreadsheetId) 

यदि सब कुछ त्रुटियों के बिना चला गया, तो तालिका का एक लिंक प्रदर्शित किया जाएगा।

इस लिंक में फ़ाइल पहचानकर्ता का उपयोग किया जाता है, हम इसे चर स्प्रेडशीट में सहेजते हैं और भविष्य में इसका उपयोग करेंगे।

इसका पालन करें। Google आपको सूचित करेगा कि आपके पास पहुंच नहीं है



अनुमति का अनुरोध न करें! आपको एक सूचना प्राप्त होगी कि यह पता उस पते पर एक अनुरोध पत्र देने के लिए संभव नहीं है जो Google ने स्वयं सिस्टम खाते को सौंपा है। लेकिन आप इस पते को नहीं बदल सकते। शायद यह केवल फ्री मोड में काम नहीं करता है।

लेकिन हम खुद को Google डिस्क के माध्यम से एक्सेस दे सकते हैं। आपको my_test_address@gmail.com को अपने साथ बदलना होगा।

 driveService = apiclient.discovery.build('drive', 'v3', http = httpAuth) #    Google Drive  3  API access = driveService.permissions().create( fileId = spreadsheetId, body = {'type': 'user', 'role': 'writer', 'emailAddress': 'my_test_address@gmail.com'}, #     fields = 'id' ).execute() 

अब आपके पास पहुंच है, तालिका को बंद न करें, हम इसे प्रबंधित करेंगे और तुरंत परिवर्तनों को देखेंगे।

प्रत्येक दस्तावेज़ का अपना कोड होता है - स्प्रेडशीट -d - वह वही होता है जो पता पट्टी में तब प्रदर्शित होता है जब हम ब्राउज़र में तालिका खोलते हैं (खुली तालिका वाले पृष्ठ के URL में, यह "https://docs.google.com/spreadsheets/d" के बीच है) और "# संपादित करें # gid = 0")।

हमने इसे चर स्प्रेडशीट में सहेजा है और मैं इसके साथ काम करना जारी रखूंगा।

पहला, थोड़ा सिद्धांत।

प्रत्येक फ़ाइल (स्प्रेडशीट) में शीट-टैब (शीट) होते हैं।

प्रत्येक शीट का अपना संख्यात्मक कोड (शीटआईड) होता है। दस्तावेज़ में बनाई गई पहली शीट में यह आईडी 0. के बराबर है। शेष शीट में बहुत अलग गैर-शून्य आईडी है (अर्थात, वे लगातार क्रमांकित नहीं हैं)।

यह सुनिश्चित करें

 #   results = service.spreadsheets().batchUpdate( spreadsheetId = spreadsheetId, body = { "requests": [ { "addSheet": { "properties": { "title": "  ", "gridProperties": { "rowCount": 20, "columnCount": 12 } } } } ] }).execute() #   ,  Id   spreadsheet = service.spreadsheets().get(spreadsheetId = spreadsheetId).execute() sheetList = spreadsheet.get('sheets') for sheet in sheetList: print(sheet['properties']['sheetId'], sheet['properties']['title']) sheetId = sheetList[0]['properties']['sheetId'] print('     Id = ', sheetId) 

स्क्रीन पर कुछ इस तरह दिखाई देगा:

0 शीट नंबर एक
415832263 एक और पत्ती
हम Id = 0 के साथ एक शीट का उपयोग करेंगे


वास्तव में, पहली शीट में शून्य की आईडी होती है, और दूसरी को अलग-अलग क्रमांकित किया जाता है।

एक और सवाल: कोशिकाओं की श्रेणियों को कैसे निर्दिष्ट किया जाए। जाहिर है, Google स्प्रेडशीट विभिन्न टीमों द्वारा, विभिन्न प्रबंधकों के मार्गदर्शन में और विभिन्न आर्किटेक्ट्स की मदद से विकसित किए गए थे। क्योंकि कोशिकाओं के निर्देशांक दो अलग-अलग तरीकों से सेट होते हैं।

विकल्प 1: पाठ प्रारूप में "शीट नंबर एक! बी 2: डी 5", यानी। शीट का नाम, एक विस्मयादिबोधक चिह्न के बाद, प्रारूप में ऊपरी बाएं सेल "अक्षर (कॉलम) + नंबर (स्ट्रिंग)" + एक ही प्रारूप में निचले दाएं सेल।

 {"range": "  !B2:D5"} 

विकल्प 2: जसन प्रारूप में, शीट आईडी और संख्यात्मक रूप में ऊपरी बाएं और निचले दाएं कोशिकाओं के निर्देशांक (पंक्ति संख्या और स्तंभ संख्या) को दर्शाता है

 {"range": { "sheetId": sheetId, # ID  "startRowIndex": 1, #    startRowIndex "endRowIndex": 5,#  endRowIndex - 1 (endRowIndex  !) "startColumnIndex": 0, #    startColumnIndex "endColumnIndex": 1 #  endColumnIndex - 1 }} 

अलग-अलग फ़ंक्शंस विभिन्न स्वरूपों का उपयोग करते हैं।

अब हम डेटा के साथ कोशिकाओं को भरने, एक फ्रेम खींचने और हेडर को उजागर करने के लिए पर्याप्त जानते हैं।

 results = service.spreadsheets().values().batchUpdate(spreadsheetId = spreadsheetId, body = { "valueInputOption": "USER_ENTERED", #  ,    (  ) "data": [ {"range": "  !B2:D5", "majorDimension": "ROWS", #   ,   "values": [ [" B2", " C2", " D2"], #    ['25', "=6*6", "=sin(3,14/2)"] #    ]} ] }).execute() 

डेटा के साथ कई सेल भरें। क्योंकि USER_ENTERED पैरामीटर निर्दिष्ट किया गया है, तालिका इस डेटा को मानती है क्योंकि यह उपयोगकर्ता इनपुट का अनुभव करेगा - संख्याओं के संख्यात्मक मानों को रूपांतरित करता है, और मानों को सूत्रों में समान संकेत के साथ शुरू होता है।

अपनी तालिका देखें, यह डेटा से भरा है



कॉलम की चौड़ाई सेट करें। बैचअपडेट फ़ंक्शन एक साथ कई कमांड स्वीकार कर सकता है, इसलिए हम एक अनुरोध के साथ कॉलम के तीन समूहों की चौड़ाई निर्धारित करेंगे। पहले और तीसरे समूह में एक कॉलम और दूसरे में दो कॉलम हैं।

 results = service.spreadsheets().batchUpdate(spreadsheetId = spreadsheetId, body = { "requests": [ #    A: 20  { "updateDimensionProperties": { "range": { "sheetId": sheetId, "dimension": "COLUMNS", #    "startIndex": 0, #     "endIndex": 1 #    startIndex  endIndex - 1 (endIndex  !) }, "properties": { "pixelSize": 20 #    }, "fields": "pixelSize" # ,     pixelSize } }, #    B  C: 150  { "updateDimensionProperties": { "range": { "sheetId": sheetId, "dimension": "COLUMNS", "startIndex": 1, "endIndex": 3 }, "properties": { "pixelSize": 150 }, "fields": "pixelSize" } }, #    D: 200  { "updateDimensionProperties": { "range": { "sheetId": sheetId, "dimension": "COLUMNS", "startIndex": 3, "endIndex": 4 }, "properties": { "pixelSize": 200 }, "fields": "pixelSize" } } ] }).execute() 

तालिका देखें, कॉलम की चौड़ाई बदल गई है।



तालिका के चारों ओर एक फ्रेम बनाएं

 #   results = service.spreadsheets().batchUpdate( spreadsheetId = spreadsheetId, body = { "requests": [ {'updateBorders': {'range': {'sheetId': sheetId, 'startRowIndex': 1, 'endRowIndex': 3, 'startColumnIndex': 1, 'endColumnIndex': 4}, 'bottom': { #      'style': 'SOLID', #   'width': 1, #  1  'color': {'red': 0, 'green': 0, 'blue': 0, 'alpha': 1}}, #   'top': { #      'style': 'SOLID', 'width': 1, 'color': {'red': 0, 'green': 0, 'blue': 0, 'alpha': 1}}, 'left': { #      'style': 'SOLID', 'width': 1, 'color': {'red': 0, 'green': 0, 'blue': 0, 'alpha': 1}}, 'right': { #      'style': 'SOLID', 'width': 1, 'color': {'red': 0, 'green': 0, 'blue': 0, 'alpha': 1}}, 'innerHorizontal': { #       'style': 'SOLID', 'width': 1, 'color': {'red': 0, 'green': 0, 'blue': 0, 'alpha': 1}}, 'innerVertical': { #       'style': 'SOLID', 'width': 1, 'color': {'red': 0, 'green': 0, 'blue': 0, 'alpha': 1}} }} ] }).execute() 



तालिका के ऊपर की कोशिकाओं को मिलाएं और उनमें शीर्षक दर्ज करें।

 #   A2:D1 results = service.spreadsheets().batchUpdate( spreadsheetId = spreadsheetId, body = { "requests": [ {'mergeCells': {'range': {'sheetId': sheetId, 'startRowIndex': 0, 'endRowIndex': 1, 'startColumnIndex': 1, 'endColumnIndex': 4}, 'mergeType': 'MERGE_ALL'}} ] }).execute() #    results = service.spreadsheets().values().batchUpdate(spreadsheetId = spreadsheetId, body = { "valueInputOption": "USER_ENTERED", #  ,    (  ) "data": [ {"range": "  !B1", "majorDimension": "ROWS", #   ,   "values": [[" " ] ]} ] }).execute() 



तालिका शीर्ष लेख कक्षों के लिए प्रारूप सेट करें

 #    results = service.spreadsheets().batchUpdate( spreadsheetId = spreadsheetId, body = { "requests": [ { "repeatCell": { "cell": { "userEnteredFormat": { "horizontalAlignment": 'CENTER', "backgroundColor": { "red": 0.8, "green": 0.8, "blue": 0.8, "alpha": 1 }, "textFormat": { "bold": True, "fontSize": 14 } } }, "range": { "sheetId": sheetId, "startRowIndex": 1, "endRowIndex": 2, "startColumnIndex": 1, "endColumnIndex": 4 }, "fields": "userEnteredFormat" } } ] }).execute() 



यह पता लगाने का एक आसान तरीका है कि सेल के लिए आपको किस चौड़ाई या रंग की आवश्यकता है। ऐसा करने के लिए, यह मैन्युअल रूप से कोशिकाओं में से एक को प्रारूपित करने और इसके गुणों को पढ़ने के लिए पर्याप्त है।

 ranges = ["  !C2:C2"] # results = service.spreadsheets().get(spreadsheetId = spreadsheetId, ranges = ranges, includeGridData = True).execute() print(' ') print(results['properties']) print('\n  ') print(results['sheets'][0]['data'][0]['rowData'] ) print('\n ') print(results['sheets'][0]['data'][0]['rowMetadata']) print('\n ') print(results['sheets'][0]['data'][0]['columnMetadata']) 

हमें जवाब में मिलता है
मास्टर डेटा
{'शीर्षक': 'पहला परीक्षण दस्तावेज़', 'लोकेल': R आरयू_आरयू ’, R ऑटोकरेकल’: c ON_CHANGE ’, Z टाइमजोन’: c आदि / GMT ’, F defaultFormat: {’ backgroundColor ’: {red red’ : 1, 'ग्रीन': 1, 'ब्लू': 1}, 'पेडिंग': {'टॉप': 2, 'राइट': 3, 'बॉटम': 2, 'लेफ्ट': 3}, 'वर्टिकल एलाइमेंट': 'BOTTOM', 'wraStrategy': 'OVERFLOW_CELL', 'textFormat': {'frontgroundColor': {}, 'fontFamily': 'arial, sans, sans-serif', 'fontSize': 10, 'bold': False, 'इटैलिक': गलत, 'स्ट्राइकथ्रू': गलत, 'अंडरलाइन': गलत}}}

मान और रंग
[{'मान': [{E userEnteredValue ’: {al stringValue’:} Cell C2 ’}, 'effectiveValue’: {V stringValue ’: C Cell C2’}, form formattedValue ’: Cell Cell C2’, user userEnteredFormat ’ : {'बैकग्राउंडरेलर': {'रेड': 1, 'ग्रीन': 0.6}, 'हॉरिजॉन्टल एलाइमेंट': 'सेंटर', 'टेक्स्टफॉर्म': {'फॉंटसाइज़': 14, 'बोल्ड': ट्रू, 'इटैलिक': ट्रू }}, 'प्रभावीफोरमैट': {'बैकग्राउंडकॉलर': {'रेड': १, 'ग्रीन': ०.ding}, 'पेडिंग': {'टॉप ’: २,' राइट’: 3, 'बॉटम ’: 2,’ बायां ': 3},' क्षैतिजअभिज्ञान ':' केंद्र ',' ऊर्ध्वनिक्षेप ':' बॉटम ',' रैपस्ट्रेगेटी ':' ऑवरफ्लोव_सेल ',' टेक्स्टफ्लैट ': {' अग्रभूमिसंबंधी ': {},' फॉन्टफैमिली ':' एरियल ' 'fontSize': 14, 'bold': True, 'italic': True, 'strikethrough': False, 'underline': False}, 'hyperlinkDisplayType': 'PLAIN_TEXT' "}}]]]]

सेल ऊंचाई
[{'पिक्सेलसाइज़': 21}]

सेल की चौड़ाई
[{'पिक्सेलसाइज़': 150}]
यह कोड सेल C2 के गुणों को प्रदर्शित करेगा। आप फ़ॉन्ट का चयन कर सकते हैं और मैन्युअल रूप से (तालिका में) रंग भर सकते हैं, फिर देख सकते हैं कि वे कैसे जस में प्रतिबिंबित होते हैं।

तालिका से डेटा पढ़ना


डेटा रीडिंग की सुविधाओं को पूरी तरह से प्रकट करने के लिए, मैंने मैन्युअल रूप से कोशिकाओं B4, C7 और D5 को भरा जैसा कि आंकड़े में दिखाया गया है।



डेटा पढ़ने के लिए कोड

 ranges = ["  !A2:F8"] # results = service.spreadsheets().values().batchGet(spreadsheetId = spreadsheetId, ranges = ranges, valueRenderOption = 'FORMATTED_VALUE', dateTimeRenderOption = 'FORMATTED_STRING').execute() sheet_values = results['valueRanges'][0]['values'] print(sheet_values) 

परिणाम
[[’’, B2 सेल बी 2 ’, 'सेल सी 2’, 2 सेल डी 2 ’], [’ ’’, ’’ 25 ’’, ’’ 36 ’,, 0,9999996829’]]

फ़ंक्शन के कुछ पैरामीटर: valueRenderOption - संख्यात्मक डेटा पढ़ने के लिए प्रारूप।

  • FORMATTED_VALUE - प्रदर्शन प्रारूप के आधार पर पढ़ना। यानी तालिका में जो दिखाई दे रहा था वह पढ़ा जाएगा। उदाहरण के लिए, सेल डी 3 में, संख्या 0.9999999 है, लेकिन प्रारूप "दो दशमलव स्थान" है, इसलिए "1.00" प्रदर्शित होता है, यह इस प्रारूप में है कि इसे पढ़ा जाएगा।
  • UNFORMATTED_VALUE - सेल की सामग्री को पढ़ा जाता है, स्वरूपण को ध्यान में नहीं रखा जाता है (अर्थात, 0.9999999 पढ़ा जाएगा)
  • फार्मूला - सूत्र प्रदर्शित होता है (इस मामले में "= पाप (3,14 / 2)।" यदि कोई संख्या सेल में दर्ज की जाती है, तो इस मोड में इसे पढ़ा जाएगा।

यह कोड डेटा को पढ़ता है और लाइन से लाइन प्रदर्शित करता है। पठनीय रेंज A2: F8।
स्क्रीन पर देखा गया:

  • यदि पढ़ी जा रही लाइन में कोई सेल नहीं भरी जाती है, तो लाइन पर डेटा प्रदर्शित नहीं होता है।
  • अंतिम भरे हुए सेल के बाद डेटा प्रदर्शित नहीं किया जाता है।

Source: https://habr.com/ru/post/hi483302/


All Articles