TGViewer
Паша душнит Паша душнит @beginner_fintech · 594 subscribers
Post #8 636
Как подружить Google sheets и Питон
p.s. код дублируется в комменты

Зачем
?
Люблю велосипеды
По работе возник кейс: Есть 20 человек, им надо редактировать ексель файл. Вариантов 3
* У каждого свой ексель. Питоном скачиваем каждый и объедениям. Из минусов сложно вносить какие-то изменения. Нужно быть уверенным, все применят изменения, иначе будет несколько версий таблиц, и не факт что их станкуть получится корректно
* Делать фронт, но понятно это долго и сложно (тут хочу попробовать эту шутку, но пока нет времени)
* Гугл таблица. Минусы: требует согласование с безопасниками. Но плюсы: история, если ктото чтото сломает (а это точно произойдет) можно вернуть работающую версию. И самое крутое личные фильтры

Про pygsheets
Теперь про то, как сделать велосипед обрабатывать гугл таблички питоном. Мы будем работать с pygsheets (есть еще gspred у него больше звезд на гитхабе, но мне кажется возможностей поменьше). Конечно вы можете использовать чистый гугловский апи, но я тупой бизнес-аналитик и там надо разбираться с гугловской документацией (но если вам это интересно то смотри это или это)

Авторизация
Можно использовать сервисный аккаунт (с ютубовской апи такое уже не прокатит). Про то как использовать сервисный акк смотри тут. Там немного старая версия google console, но более менее ничего не помаялось. А вот вместо gc = pygsheets.authorize(client_secret='path'), надо gc = pygsheets.authorize(service_account_file=file_path)

Про неочевидные вещи
1. Пропуски
В целом мы тут ради одной функции
df = wks.get_as_df()
которая считывает лист и делает нам пандасовсикй датафрейм. Дальше вы хотите убрать строки с пропусками. И... Ничего не проходит. Это связано с тем, что по умолчанию пустые значения есть пустые строки. Чтобы это избежать пишем так:
wks.get_as_df(empty_value=np.NaN, value_render="UNFORMATTED_VALUE")

2. Работа с датой.
Как вы могли обратить внимание выше value_render="UNFORMATTED_VALUE". Более подробно см тут. К сожалению по умолчанию стоит FORMATTED_VALUE. И я не очень помню почему, но с ним не получается работать с датой. Дальше вы считываете даты. И.... Ничего не работает вы просто получаете набор цифр. Тут нам поможет библиотка xlrd (которая как раз в привычном нам
pd.read_xlsx()
делает это. Ниже код который превратить столбец с непонятными цифрами в привычный нам даты.
data_google_sheets["work_date"] = data_google_sheets["work_date"].loc[data_google_sheets["work_date"].notnull()].apply(xlrd.xldate_as_datetime, args=(0,))

3. Добавление данных на гугл таблицу.
В моем кейсе требуется только перезаписать таблицу для этого делаем так:
wks = sh.worksheet_by_title("final")
wks.clear()
wks.set_dataframe(df,(1,1))

Тут первое необходимо убедиться, что
* в
clear()
ничего не стоит, если вы там поставите координаты функция будет чувствительная к скрытым строкам
* И нужно проверить, что вам хватить размеров листа, иначе
wks.set_dataframe(df,(1,1))
выдаст ошибку выхода за границу.
* данный код не меняет форматирование (может есть такие параметры я не смотрел), поэтому если есть объеденные ячейки или нарисованные границы и тд, они останутся.

ps Будут вопросы, пишите)

#python #аналитика
More from @beginner_fintech
  1. Oct 19, 2025## Пост 2 Видимость и репутация (образ) ### Общее Видимость и репутация/образ супер важные…
  2. Oct 14, 2025## Пост 1 Думать куда идём — Скажите, пожалуйста, куда мне отсюда идти? — А куда ты хочешь…
  3. Oct 14, 2025Я немного нагулялся по Алматинским горами напился кофе, а значит время начинать серию пост…
  4. Oct 5, 2025Вакансии и Новости) Сегодня последняя пятница в Т-Банке (не буду загадывать, поэтому скажу…
  5. Aug 27, 2025Вечерний душный пост не о работе) Я очень люблю гулять на ВДНХ где он переходит в бот. сад…
  6. Aug 27, 2025Паша душнит pinned a video
Threads Profile ViewerView any public Threads profile without an account.Open ThreadLook →Writing with AI? Make it sound human.Metric37 rewrites AI drafts so they read naturally. Free AI detector, 1,500 words free.Try Metric37 →