Нужна помощь с импортом данных из гугл таблицы для тг бота при помощи Python
Потихоньку изучаю Python, навыков разработки не имел ранее. Сейчас написан код тг бота, работает через aiogram, этот бот записывает клиентов на определённые дату и время с помощью кнопок меню, вносит данные клиента после записи в гугл таблицу(дату, время, имя которое пользователь ввёл, телефон), в таблице есть ещё стольцы для username и user id, но в них бот почему-то не сохраняет данные. Метод у меня такой(username или user_id), разницы нет, в таблицу он не записывает эти данные
Вот в общем суть. Не могу понять как мне правильно сохранять имя пользователя или user id и не получается импортировать данные из гугл таблицы, бот записывает людей дважды на одну и ту же дату, хотя должен выдавать пользователю только свободные даты исходя из записей в таблице, но этого он не делает почему-то. Прошу помощи, чтобы понять как это осуществить Вот код работы с таблицей
import gspread
from google.auth.transport.requests import Request
from google.oauth2.service_account import Credentials
from datetime import datetime, timedelta
# Настройки Google API
GOOGLE_SCOPES = [
'https://www.googleapis.com/auth/spreadsheets',
'https://www.googleapis.com/auth/drive'
]
SPREADSHEET_ID = 'ID'
# Авторизация
credentials =
Credentials.from_service_account_file('credentials.json',
scopes=GOOGLE_SCOPES)
gc = gspread.authorize(credentials)
worksheet = gc.open_by_key(SPREADSHEET_ID).sheet1
def add_to_google_sheets(name: str, contact: str, date: str, time:
str, user_id: int):
occupied_times = get_occupied_times(date)
if time in occupied_times:
return False
# Проверка на повторную запись
records = worksheet.get_all_records()
for record in records:
if record.get("Contact") == contact and record.get("Date") ==
date and record.get("Time") == time:
return False
worksheet.append_row([date, time, name, contact, user_id, 0])
return True
def get_user_booking(user_id: int):
records = worksheet.get_all_records()
for i, record in enumerate(records):
if str(record.get("User ID", "")) == str(user_id):
record["row"] = i + 2
return record
return None
def check_cancellation_limit(user_id: int):
booking = get_user_booking(user_id)
if booking:
cancellations = booking.get('Cancellations', 0)
return cancellations >= 2 # Лимит отмен
return False
def increment_cancellation_count(user_id: int):
booking = get_user_booking(user_id)
if booking:
row = booking['row']
cancellations = int(booking.get('Cancellations', 0)) + 1
worksheet.update(f"E{row}", [[cancellations]])
# Отмена записи пользователя
def cancel_booking(user_id: int):
booking = get_user_booking(user_id)
if booking:
worksheet.delete_rows(booking['row'])
return True
return False
def update_user_booking(user_id: int, booking):
row = booking['row']
worksheet.update(f"A{row}:F{row}", [[
booking.get('Date', ''),
booking.get('Time', ''),
booking.get('Name', ''),
booking.get('Contact', ''),
booking.get('User ID', ''),
booking.get('Cancellations', 0)
]])
def get_occupied_times(date: str):
occupied_times = []
records = worksheet.get_all_records()
for record in records:
if record.get('Date') == date:
occupied_times.append(record.get('Time'))
return occupied_times
def get_free_times(date):
all_times = [f"{hour:02}:00" for hour in range(9, 20)] + [f"
{hour:02}:30" for hour in range(9, 20)]
all_times.sort()
occupied = get_occupied_times(date)
return [time for time in all_times if time not in occupied]
def setup_google_sheets():
pass
Ответы (1 шт):
Все решил сам, если кому вдруг будет нужно
#Получение имени пользователя
def get_username(user):
return user.username if user.username else f"{user.first_name}
{user.last_name}"
# Сохраняем user_id в хранилище состояния
await state.update_data(user_id=message.from_user.id)
await state.update_data(contact=contact)
user_data = await state.get_data()
date = user_data['date']
time = user_data['time']
name = user_data['name']
user_id = user_data['user_id'] # Получаем user_id из хранилища
# Добавляем запись в Google Sheets с user_id
add_to_google_sheets(name, contact, date, time, user_id,
message.from_user.username)
# Поиск записи по всем листам таблицы
def find_user_booking(user_id):
# Получаем все листы из Google Sheets
worksheets = spreadsheet.worksheets() # Получаем все листы в документе
# Каждый лист отдельно
for worksheet in worksheets:
records = worksheet.get_all_records() # Получаем все записи в листе
# Поиск записи с нужным user_id
for record in records:
if str(record.get("user_id")) == str(user_id):
return record # Первая найденная запись
Важно наличие в таблице соответствующих заголовков. На данный момент все записи производятся правльно, в нужный лист таблицы, под каждый пункт под своим заголовком. Требовалось лишь пара дней после работы посидеть до полуночи и потупить над кодом.