Я пишу скрипт на Python 3.7, который должен считывать данные из электронной таблицы Google.
Данная электронная таблица принадлежит организации, частью которой является моя учетная запись Google: давайте просто назовем ее «Организация»,Разрешения электронной таблицы установлены как «Любой в Организации со ссылкой может просматривать».Из-за этой детали мое приложение не работало.
Я прошел на панель учетных данных по адресу https://console.cloud.google.com/apis/credentials, проходя аутентификацию с моей учетной записью в организации, и создал ключ учетной записи службы.Разрешено широкое делегирование в домене, согласно При использовании нового проекта Google API Console, получившего unauthorized_client, Клиент не авторизован для получения токенов доступа с помощью этого метода .Я скачал ключевой файл JSON в /path/to/service_account_key.json
.
Ниже я документирую свою попытку с клиентской библиотекой gspread
- https://github.com/burnash/gspread - однако у меня была точно такая же проблема при использовании google-api-python-client
1.7.4:
import gspread
from oauth2client.service_account import ServiceAccountCredentials
scopes = ['https://www.googleapis.com/auth/spreadsheets.readonly']
credentials = ServiceAccountCredentials.from_json_keyfile_name('/path/to/service_account_key.json', scopes)
gc = gspread.authorize(credentials)
# spreadhseet ID below obfuscated, it's actually the one you get from its URL
sheet = gc.open_by_key('12345-abcdef')
В ответе gspread используется тот же HTTP-код и сообщение, что и в обычном API Google v4:
gspread.exceptions.APIError: {
"error": {
"code": 403,
"message": "The caller does not have permission",
"status": "PERMISSION_DENIED"
}
}
Однако , если я изменяю разрешения в электронной таблице(что мне не разрешено делать на фактическом): «Любой, у кого есть ссылка, может просматривать», удаляя «Организацию», все работает!
<Spreadsheet 'Your spreadsheet' id:12345-abcdef>
Я предположил, что учетная запись службыЯ создал, не унаследовал от меня членство в организации. Однако я не нашел возможности для этого. Я даже попросил администратора домена создать служебную учетную запись для меня из его учетных записей администратора (также с делегированием по всему домену): ничего.
На Учетной записи службы Google и разрешениях для листов было сказано , что я должен явным образом предоставить этот лист электронному адресу службы поддержки.ЕНТ.Когда я это сделал, это сработало, но я также получил предупреждение о том, что учетная запись не находится в домене организации G Suite (опять же, как это не может быть?).
Большое спасибо