Нужно сделать ТГ Бота, который будет записывать ответы пользователя в Google Sheets. Новый ответ - новый столбец
Помогите, пожалуйста, разобраться со следующей проблемой: Помогли исправить код, но я совсем не понимаю, как задать команды append_row, чтобы бот не в 1 столб построчно записывал ответы пользователя, а например, ответ 1 - а1, ответ 2- б1. Чтобы каждый новый ответ фиксировался в определенном ему столбце. Также не могу понять, почему в первый вопрос бот фиксирует значение из функции main, а не из функции vopros 1, соответственно ответ на vopros 2 фиксируется в функции vopros 1.
import telebot
import gspread
bot = telebot.TeleBot('7222712472:AAEAN1jlnaV7-8jpCnBYhJveVmdCvMi3F0E')
gc = gspread.service_account(filename='creds.json')
wks = gc.open('Srochnie').sheet1
@bot.message_handler(commands=['start'])
def main(message):
bot.send_message(message.chat.id, f'Добрый день, {message.from_user.first_name}, ТЕКСТ ')
bot.register_next_step_handler(message, vopros1)
def vopros1(message):
try:
bot.send_message(message.chat.id, 'Вопрос 1')
otvet1 = message.text.strip()
wks.append_row([otvet1], )
bot.register_next_step_handler(message, vopros2)
except:
bot.send_message(message.chat.id, 'Вопрос 2')
def vopros2(message):
try:
bot.send_message(message.chat.id, 'Вопрос 2')
otvet2 = message.text.strip()
wks.append_row([otvet2], )
bot.register_next_step_handler(message, end)
except:
bot.send_message(message.chat.id, 'Завершение опроса')
@bot.message_handler()
def end(message):
bot.send_message(message.chat.id, 'Завершение опроса')
bot.polling(none_stop=True)
Буду рад, если сможете помочь мне победить это безобразие. Спасибо!
Ответы (1 шт):
Не знаю чем обусловлен ваш выбор в пользу библиотеки telebot
, но если выбор не принципиален и готовы рассмотреть вариант использования библиотеки aiogram
, которая, на мой взгляд, дает больший функционал, то бот под вашу задачу будет таким:
import asyncio
import logging
import gspread
from aiogram import Router, F, Dispatcher, Bot
from aiogram.client.default import DefaultBotProperties
from aiogram.enums import ParseMode
from aiogram.filters import Command
from aiogram.fsm.context import FSMContext
from aiogram.fsm.state import StatesGroup, State
from aiogram.fsm.storage.memory import MemoryStorage
from aiogram.types import Message, CallbackQuery
from aiogram.utils.keyboard import InlineKeyboardBuilder
service_account = gspread.service_account(filename='creds.json')
wks = service_account.open('Srochnie').sheet1
router = Router()
class Answers(StatesGroup):
q1 = State()
q2 = State()
q3 = State()
def keyboard():
kb = InlineKeyboardBuilder()
kb.button(text='Начать опрос', callback_data='req')
return kb.as_markup()
@router.message(Command('start'))
async def cmd_start(message: Message):
await message.answer(f'Привет, {message.from_user.first_name}, для начала опроса нажми на кнопку ?', reply_markup=keyboard())
@router.callback_query(F.data == 'req')
async def q1(call: CallbackQuery, state: FSMContext):
await call.message.edit_text('Вопрос 1')
await state.set_state(Answers.q1)
@router.message(Answers.q1)
async def q2(message: Message, state: FSMContext):
await state.set_data({'answer1': message.text})
await message.answer('Вопрос 2')
await state.set_state(Answers.q2)
@router.message(Answers.q2)
async def q3(message: Message, state: FSMContext):
await state.update_data({'answer2': message.text})
await message.answer('Вопрос 3')
await state.set_state(Answers.q3)
@router.message(Answers.q3)
async def end(message: Message, state: FSMContext):
answers = await state.get_data()
wks.append_row([answers['answer1'], answers['answer2'], message.text])
await state.clear()
await message.answer('Опрос завершен', reply_markup=keyboard())
async def main() -> None:
dp = Dispatcher(storage=MemoryStorage())
dp.include_router(router)
bot = Bot('7222712472:AAEAN1jlnaV7-8jpCnBYhJveVmdCvMi3F0E',
default=DefaultBotProperties(parse_mode=ParseMode.HTML))
await dp.start_polling(bot)
if __name__ == "__main__":
logging.basicConfig(level=logging.INFO)
try:
asyncio.run(main())
except KeyboardInterrupt:
print("Завершение работы бота...")
не забудьте установить библиотеку:
pip install aiogram
p.s. Так как вы засветили свой токен, то я использовал его в своем примере, не забудьте сменить его