Build ресурса для доступа к google sheets api на python
В google-api-python-client есть универсальный метод googleapiclient.discovery.build , который создает ресурс для работы с любым API Google и с Sheets API в частности. Но сначала нужно куда то в проекте сложить json файл токена доступа сервисного аккаунта.
build у меня в проекте выглядит вот так:
Доступ к google api
Чтобы писать из кода в Google Sheet нам нужен доступ к Google Sheets API, которое входит в библиотеку API Google Cloud Platform. Для этого нужно:
нужно создать проект в Google Cloud Platform
подключить к проекту в Google Cloud Platform Sheets API
заполнить OAuth consent screen ( пользовательское соглашение )
создать либо OAuth Client ID, либо Service Account
я использую Сервисный Аккаунт, следовательно мне нужно дать сервисному аккаунту доступ к Google Sheet (электронной таблице) с уровнем Редактор, тогда я смогу писать из кода в эту таблицу
получить JSON файл с токеном доступа к сервисному аккаунту и положить его куда-то откуда код сможет его читать
В тексте это выглядит просто, однако в первый раз интерфейс Google Cloud Console выглядит как рубка звездолета. Куда жать не понятно, иные операции нельзя отменить, а некоторые важные данные можно получить только сразу после нажатия на кнопку и никак после (например json файл токена доступа сервисного доступа). Поэтому страаашно!!!
Но разобраться можно, попробуйте. А если не получится, то вот Пост только про токены Google Cloud.
Зависимости для доступа к sheets api из python
Мой req.txt выглядит вот так:
Инициация базового объекта authomatic
Происходит очень просто, с указаним конфигурационных данных и секретной строки:
from authomatic import Authomatic
from config import OAUTH_CONFIG
authomatic = Authomatic(OAUTH_CONFIG, ‘very secret string', report_errors=False)
Как дать доступ к таблице сервисному аккаунту
Просто беру емейл сервисного аккаунта и расшариваю доступ к электронной таблице Google Sheets, как если бы это был емейл гуглоаккаунта любого другого живого человека. И этому доступу нужно выдать права Редактора, чтобы с Сервисным аккаунтом писать в этот Google Sheet. На стороне Google Cloud ничего дополнительно делать не надо.
Уведомлять Сервисный Аккаунт тоже не обязательно – он же робот, вы чего 😉
Как писать в google sheet с api на python?
Для записи есть 3 метода:
Данные для всех этих методов передаются в аргументе body. Для append / update структура одинакова:
Как узнать spreadsheet_id google sheet
Чтобы писать в электронную таблицу, нужно знать её идентификатор. Также нам может понадобиться (при форматировании уж точно) идентификатор листа в электронной таблице. В браузере это все выглядит просто:
Как читать из google sheet с api на python?
Для чтения у нас есть два метода spreadsheets().values().get() и spreadsheets().values().batchGet() . В аргументы им передается идентификатор электронной таблицы Google Sheet и диапазон для чтения.
Диапазон для чтения – это строка вида “Лист!A1:Z999”. Диапазоны, как видно, могут быть на разных листах электронной таблицы.
batchGet в отличии от get может запросить сразу, за один execute(), несколько диапазонов данных, что экономит квоты. Рекомендую сразу и везде использовать только батчевые методы.
resp = get_service_sacc().spreadsheets().values().get(spreadsheetId=sheet_id, range="Популярное!A1:A999").execute()
# resp = get_service_sacc().spreadsheets().values().batchGet(spreadsheetId=sheet_id, ranges=["Популярное", "Лист3"]).execute()
Запрос отправляется (и расходуются квоты) только по методу execute().
В ответ мы получаем json (dict), где все очевидно. В поле values двумерный массив с нужными данными.
Лимиты google sheets api
Google почти ко всем своим API доступ выдает БЕСПЛАТНО и без премодерации (в тестовом режиме). Однако ограничивает. К некоторым апи ограничения сильные, а к Sheets API вполне приемлемые.
Определение конфигурации oauth провайдеров
В стандартный конфигурационный файл flask-приложения нужно добавить словарь содержащий параметры всех провайдеров:
Регистрация приложения
У каждого провайдера свои особенности регистрации. Адреса регистрации приложения
Создание представления
Осталось создать представление, которое: