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