Как мы можем читать из Google Sheets в DF в Python? - PullRequest
1 голос
/ 09 марта 2020

Я использую этот код (точно такой же).

import gspread
from oauth2client.service_account import ServiceAccountCredentials


# use creds to create a client to interact with the Google Drive API
scope = ['https://spreadsheets.google.com/feeds']
creds = ServiceAccountCredentials.from_json_keyfile_name('client_secret.json', scope)
client = gspread.authorize(creds)

# Find a workbook by name and open the first sheet
# Make sure you use the right name here.
sheet = client.open("Sheet1").sheet1

# Extract and print all of the values
list_of_hashes = sheet.get_all_records()
print(list_of_hashes)

Я не совсем уверен, верна ли эта строка:

scope = ['https://spreadsheets.google.com/feeds']

В любом случае, я следовал инструкциям эта ссылка.

https://www.twilio.com/blog/2017/02/an-easy-way-to-read-and-write-to-a-google-spreadsheet-in-python.html

Я нажал «Мой проект»> «Сервисная учетная запись»> «Включить». Я скачал файл JSON, назвал его «client_secret. json» и поместил в этот каталог: «C: \ Users \ ryans \ client_secret. json». Наконец, я открываю файл json, получаю «client_email внутри client_secret. json», помещаю его в «Share» и нажимаю кнопку «Сохранить». Теперь, когда я запускаю скрипт выше, я получаю это сообщение об ошибке:

Traceback (most recent call last):

  File "<ipython-input-20-870ca6cceea6>", line 12, in <module>
    sheet = client.open("Sheet1").sheet1

  File "C:\Users\ryans\Anaconda3\lib\site-packages\gspread\client.py", line 123, in open
    self.list_spreadsheet_files()

  File "C:\Users\ryans\Anaconda3\lib\site-packages\gspread\client.py", line 96, in list_spreadsheet_files
    res = self.request('get', url, params=params).json()

  File "C:\Users\ryans\Anaconda3\lib\site-packages\gspread\client.py", line 79, in request
    raise APIError(response)

APIError: {'errors': [{'domain': 'global', 'reason': 'insufficientPermissions', 'message': 'Insufficient Permission: Request had insufficient authentication scopes.'}], 'code': 403, 'message': 'Insufficient Permission: Request had insufficient authentication scopes.'}

Я не уверен, что здесь не так. Может ли это быть проблема с разрешениями?

Обновление

Я добавил эту строку:

scope = ['https://www.googleapis.com/auth/spreadsheets', 'https://www.googleapis.com/auth/drive.readonly']

enter image description here

enter image description here

Мой лист Google выглядит следующим образом:

enter image description here

Теперь я изменяю код на this:

import os
import gspread
from oauth2client.service_account import ServiceAccountCredentials

# make sure the 'client_secret.json' is getting picked up...
os.getcwd()

# use creds to create a client to interact with the Google Drive API
scope = ['https://docs.google.com/spreadsheets/d/1PBB1eJ7zbcLyj7vsdrB8nEyZ9Ri0Nds8M2yFB0zEN1Q/edit#gid=0']
creds = ServiceAccountCredentials.from_json_keyfile_name('client_secret.json', scope)
client = gspread.authorize(creds)

# Find a workbook by name and open the first sheet
# Make sure you use the right name here.
sheet = client.open("Sheet1").sheet1

# Extract and print all of the values
list_of_hashes = sheet.get_all_records()
print(list_of_hashes)

Когда я пытаюсь запустить этот скрипт, я получаю это сообщение об ошибке.

Traceback (most recent call last):

  File "<ipython-input-34-e695bcd89439>", line 10, in <module>
    client = gspread.authorize(creds)

  File "C:\Users\ryans\Anaconda3\lib\site-packages\gspread\__init__.py", line 38, in authorize
    client.login()

  File "C:\Users\ryans\Anaconda3\lib\site-packages\gspread\client.py", line 51, in login
    self.auth.refresh(http)

  File "C:\Users\ryans\Anaconda3\lib\site-packages\oauth2client\client.py", line 545, in refresh
    self._refresh(http)

  File "C:\Users\ryans\Anaconda3\lib\site-packages\oauth2client\client.py", line 749, in _refresh
    self._do_refresh_request(http)

  File "C:\Users\ryans\Anaconda3\lib\site-packages\oauth2client\client.py", line 819, in _do_refresh_request
    raise HttpAccessTokenRefreshError(error_msg, status=resp.status)

HttpAccessTokenRefreshError: invalid_scope: Invalid oauth scope or ID token audience provided.

Включены и мой Google Drive API, и Google Sheets API. Я выполнил 7 шагов, перечисленных в приведенной ниже ссылке.

https://www.twilio.com/blog/2017/02/an-easy-way-to-read-and-write-to-a-google-spreadsheet-in-python.html

Наконец, я нажал «Поделиться» на странице Google Sheets. Тем не менее, я получаю эту странную ошибку, как описано выше.

Примечание: вот изображение моего Google Sheet.

enter image description here

Ответы [ 2 ]

2 голосов
/ 09 марта 2020

Как насчет этого ответа? Пожалуйста, подумайте об этом как об одном из нескольких возможных ответов.

Проблема и решение:

Когда я увидел скрипт gspread, кажется, что когда запускается open("Sheet1"), файл files.list используется метод Drive API. Ref В вашем сценарии только https://spreadsheets.google.com/feeds используется для областей. Я думаю, что при этом возникает ошибка insufficientPermissions. Чтобы избежать этого, как насчет следующей модификации?

Модифицированный скрипт:

С:
scope = ['https://spreadsheets.google.com/feeds']
Кому:
scope = ['https://www.googleapis.com/auth/spreadsheets', 'https://www.googleapis.com/auth/drive.readonly']

Примечание:

Ссылки:

0 голосов
/ 22 апреля 2020

(Выложено решение от имени автора вопроса, чтобы убрать его из поста вопроса) .

Я наконец-то понял, как это работает. В файле с именем «statup_funding. json» необходимо получить сгенерированное электронное письмо, затем нажать кнопку «Поделиться» в электронной таблице и вставить ЭТА АДРЕС ЭЛЕКТРОННОЙ ПОЧТЫ в открывшееся окно. Затем все работает как ожидалось.

Вот окончательная версия моего теперь работающего кода.

import gspread
#Service client credential from oauth2client
from oauth2client.service_account import ServiceAccountCredentials
# Print nicely
import pprint
#Create scope
scope = ['https://spreadsheets.google.com/feeds', 'https://www.googleapis.com/auth/drive']
#create some credential using that scope and content of startup_funding.json
creds = ServiceAccountCredentials.from_json_keyfile_name('startup_funding.json',scope)
#create gspread authorize using that credential
client = gspread.authorize(creds)
#Now will can access our google sheets we call client.open on StartupName
sheet = client.open('Test_Sheet').sheet1
pp = pprint.PrettyPrinter()
results = sheet.get_all_records()
results
...