Загрузка...

How to pull out a subcategory into Google a table?

Thread in Python created by детектив Mar 1, 2025. 94 views

  1. детектив
    детектив Topic starter Mar 1, 2025 elvis has left the building 277 Nov 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.")
     
  2. Y4sperMaglot
    Дак а ты посмотри что тебе из таблицы то приходит
    The post was merged to previous Mar 1, 2025
    В функции show_faq_subcategories попробуй вывести faq_cache
     
    1. детектив Topic starter
      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
Loading...