Google Sheet и Sheets API - классный (простой, бесплатный и универсальный) способ организовать хранение и анализ данных получаемых от своего сервиса. При условии что этих данных не то чтобы очень много и поступают они не то чтобы очень часто.  У меня таких задач хватает и решаю я их либо на Python, либо на PHP. Сегодня возьму в руки Python. Чтобы писать из кода в 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. Просто беру емейл сервисного аккаунта и расшариваю доступ к электронной таблице Google Sheets, как если бы это был емейл гуглоаккаунта любого другого живого человека. И этому доступу нужно выдать права Редактора, чтобы с Сервисным аккаунтом писать в этот Google Sheet. На стороне Google Cloud ничего дополнительно делать не надо.  Уведомлять Сервисный Аккаунт тоже не обязательно - он же робот, вы чего ;) Google почти ко всем своим API доступ выдает БЕСПЛАТНО и без премодерации (в тестовом режиме). Однако ограничивает. К некоторым апи ограничения сильные, а к Sheets API вполне приемлемые. Read requests per minute    300Read requests per minute per user     60Read requests per day    Unlimited  Write requests per minute    300Write requests per minute per user     60Write requests per day    Unlimited    Каждый execute() тратит эти лимиты, даже если запрос не успешный. Остатки лимитов нельзя узнать программно, из кода. Только посмотреть в браузере в https://console.cloud.google.com/apis/api/sheets.googleapis.com/quotas?project=<id проекта>. Мой req.txt выглядит вот так: Для Python есть пакеты специально для работы с Google Sheets API. Говорят они даже удобные и это, наверняка, так. Но я работаю не только с Sheets API, поэтому предпочитаю использовать большой и не очень удобный google-api-python-client В google-api-python-client есть универсальный метод googleapiclient.discovery.build , который создает ресурс для работы с любым API Google и с Sheets API в частности. Но сначала нужно куда то в проекте сложить json файл токена доступа сервисного аккаунта.  build у меня в проекте выглядит вот так: scopes - это уровень доступа, который хочет наше приложение от Google API. Для задач чтения/записи/форматирования в Google Sheet с Сервисным Аккаунтом https://www.googleapis.com/auth/spreadsheets достаточно. Такое приложение (с Сервисным Аккаунтом) не будет ничего просить от пользователя через браузер, как было бы с OAuth авторизацией. Удобно. Чтобы писать в электронную таблицу, нужно знать её идентификатор. Также нам может понадобиться (при форматировании уж точно) идентификатор листа в электронной таблице. В браузере это все выглядит просто: Для чтения у нас есть два метода spreadsheets().values().get() и spreadsheets().values().batchGet() . В аргументы им передается идентификатор электронной таблицы Google Sheet и диапазон для чтения. Диапазон для чтения - это строка вида "Лист!A1:Z999". Диапазоны, как видно, могут быть на разных листах электронной таблицы. batchGet в отличии от get может запросить сразу, за один execute(), несколько диапазонов данных, что экономит квоты. Рекомендую сразу и везде использовать только батчевые методы. Запрос отправляется (и расходуются квоты) только по методу execute(). В ответ мы получаем json (dict), где все очевидно. В поле values двумерный массив с нужными данными. Для записи есть 3 метода: append - пытается писать в заданный диапазон, если ячейки в заданном диапазоне заняты данными (не пусты), то пишет в ближайшую пустую ячейку ниже, update - пишет в заданный диапазон, если ячейки заняты данными - он эти данные перезапишет новыми, batchUpdate - действует как update, но может за один запрос записать несколько пачек данных в разные диапазоны и сэкономить квоты. Данные для всех этих методов передаются в аргументе body. Для append / update структура одинакова: Т.е. values - это простой двумерный массив. А запись выглядит вот так: range - диапазон для записи, а valueInputOption : 'RAW' - значит данные буду писать в ячейку "как есть", не пытаясь, например, в строке разглядеть дату. Со структурой body для batchUpdate посложнее, но не сильно: Нужно ли тут что-то объяснять? Напишите в комментарий, если все таки надо... Ну а метод даже проще чем у update / append : Конечно есть, особенно при записи, некоторые тонкости. Особенно когда речь заходит про форматирование - все эти строки которые вдруг становятся датами, когда не надо. Числа которые стали строками... Но что-то и так много текста вышло, поэтому пока закругляюсь.  Документация Google Sheets API. Доки, кстати, очень хорошие. Не все API Google так хорошо задокументированы. На Хабре есть хорошая статья, жаль мне поздно попалась. Все что в статье - есть в оформленном виде на GitHub ( темы разбросаны по веткам репозитория, просто переключайтесь ). центральный климатизатор