Загрузка...

Как вытащить подкатегорию в гугл таблице?

Тема в разделе Python создана пользователем детектив 1 мар 2025. 95 просмотров

  1. детектив
    детектив Автор темы 1 мар 2025 elvis has left the building 277 19 ноя 2019
    всем ку, пж помогите, уже 5 часов трахаюсь
    [IMG]
    короче. заказчик захотел чтобы тг-бот динамически грузил данные из гугл таблицы
    [IMG]

    и отображал их в виде многоуровневого меню с использованием инлайн кнопок, сами данные таблицы состоят из трёх столбцов:
    ТИП (CATEGORY, SUB, ANSWER), НАЗВАНИЕ (название категории или подкатегории) и ТЕКСТ (ответ или ссылка)

    основные категории (CATEGORY) бот видит и отображает, но когда пользователь выбирает категорию, подкатегории (SUB) не появляются — вместо них выводится только кнопка "Назад", **** показывают, что кеш данных для подкатегорий остаётся пустым (dict_keys([])), как будто бот вообще их не видит..я уже перепробовал разные способы чтения данных, но ни один из них не дал результата

    мб гугл отдаёт строки, где ячейка ТЕКСТ пустая?

    [IMG]

    [IMG]

    Python
    @dp.message_handler(lambda message: message.text == "FAQ", state="*")
    async def show_faq_main_menu(message: types.Message):
    keyboard = InlineKeyboardMarkup()
    for category in faq_cache:
    keyboard.add(InlineKeyboardButton(text=category, callback_data=f"faq:{faq_category_hashes[category]}"))
    keyboard.add(InlineKeyboardButton(text="⬅ Назад", callback_data="back_to_main"))
    await message.answer("Выберите категорию FAQ:", reply_markup=keyboard)

    @dp.callback_query_handler(lambda c: c.data.startswith("faq:"))
    async def show_faq_subcategories(call: CallbackQuery):
    category_hash = call.data.split(":")[1]
    category = next((cat for cat, hash_ in faq_category_hashes.items() if hash_ == category_hash), None)
    if not category or category not in faq_cache:
    await call.answer("Категория не найдена.", show_alert=True)
    return

    keyboard = InlineKeyboardMarkup()
    logger.info(f"Подкатегории для {category}: {faq_cache[category].keys()}")
    for subcategory in faq_cache[category]: # итератор ключ суькатегорий
    if subcategory != "Ответ":
    keyboard.add(InlineKeyboardButton(text=subcategory, callback_data=f"faq_sub:{category_hash}:{subcategory}"))
    keyboard.add(InlineKeyboardButton(text="⬅ Назад", callback_data="faq_main_menu"))
    await call.message.edit_text(f"Категория: {category}\n\nВыберите подкатегорию:", reply_markup=keyboard)

    @dp.callback_query_handler(lambda c: c.data.startswith("faq_sub:"))
    async def show_faq_answer(call: CallbackQuery):
    _, category_hash, subcategory = call.data.split(":")
    category = next((cat for cat, hash_ in faq_category_hashes.items() if hash_ == category_hash), None)
    if not category or subcategory not in faq_cache[category]:
    await call.answer("Ответ не найден.", show_alert=True)
    return

    answer = faq_cache[category][subcategory]
    keyboard = InlineKeyboardMarkup().add(InlineKeyboardButton("⬅ Назад", callback_data=f"faq:{category_hash}"))
    await call.message.edit_text(f"{subcategory}:\n\n{answer}", reply_markup=keyboard)
    закинул код в нейронки, они хуйню какую-то делают с моим кодом. как в этой функции сделать так чтобы суб-категория подгружалась после нажатия на категорию?

    сама функция подгрузки
    Python
    async def fetch_faq():
    global faq_cache, faq_category_hashes
    logger.info("Обновление FAQ из Google Sheets...")
    data = google_sheets.get_google_sheet_data(GOOGLE_SHEET_URL)
    if data:
    faq_cache = {} # чищу словарь перед некст запуском
    current_category = None
    current_subcategory = None

    logger.info(f"Данные из Google Sheets: {data}") # лог всего

    for row in data:
    category_name = row.get("название") or row.get("НАЗВАНИЕ")
    text = row.get("текст") or row.get("ТЕКСТ")
    row_type = row.get("тип") or row.get("ТИП")

    logger.info(f"Обрабатываю строку FAQ: ТИП={row_type}, НАЗВАНИЕ={category_name}, ТЕКСТ={text}")

    if row_type == "CATEGORY":
    faq_cache[category_name] = {}
    faq_category_hashes[category_name] = hashlib.md5(category_name.encode()).hexdigest()[:10]
    current_category = category_name
    current_subcategory = None
    logger.info(f" [CATEGORY] Добавлена категория: {category_name}")

    elif row_type == "SUB" and current_category:
    faq_cache[current_category][category_name] = {}
    current_subcategory = category_name
    logger.info(f" [SUB] Добавлен подраздел: {category_name} в категории {current_category}")

    elif row_type == "ANSWER" and current_category:
    if current_subcategory:
    faq_cache[current_category][current_subcategory]["Ответ"] = text # сейвлю текстовый ответ
    logger.info(f" [ANSWER] Добавлен ответ к подразделу: {current_subcategory} - {text}")
    else:
    faq_cache[current_category]["Ответ"] = text # сейв ответа в категории
    logger.info(f" [ANSWER] Добавлен ответ к категории: {current_category} - {text}")
    logger.info("FAQ успешно обновлен")
    logger.info(f"Структура faq_cache после обновления: {faq_cache}")
    logger.info(f"Ключи faq_cache (категории): {faq_cache.keys()}") # логирую кей faq_cache для проверки кетагории
    else:
    logger.warning("Не удалось обновить данные FAQ из Google Sheets.")
     
    1 мар 2025 Изменено
  2. Y4sperMaglot
    Дак а ты посмотри что тебе из таблицы то приходит
    --- Сообщение объединено с предыдущим 1 мар 2025
    В функции show_faq_subcategories попробуй вывести faq_cache
     
    1. детектив Автор темы
      Y4sperMaglot, сделал лог, faq_cache пустой, потому что бот не добавляет в него подкатегории (SUB). Какие-то траблы в логике обработки SUB и ANSWER.
      2025-03-01 23:18:04,000 - INFO - --- show_faq_subcategories ---
      2025-03-01 23:18:04,000 - INFO - Запрошена категория: Адаптация новых менеджеров по показам, hash: 5faddecc7d
      2025-03-01 23:18:04,000 - INFO - Содержимое faq_cache для категории 'Адаптация новых менеджеров по показам': {}
      2025-03-01 23:18:04,000 - INFO - Полный faq_cache: {'Адаптация новых менеджеров по показам': {}, 'Адаптация новых менеджеров БО': {}}
      2025-03-01 23:18:04,000 - INFO - Подкатегории для Адаптация новых менеджеров по показам: dict_keys(dict_keys([])) если категория есть в cache
    2. Y4sperMaglot
Top
Загрузка...