创建电报机器人时出错,输入姓名/电子邮件/电话时,我要求他再次执行此操作,然后他给我以下错误消息:
<HttpError 400 when requesting https://sheets.googleapis.com/v4 /spreadsheets/1saG-
dfVZEUmu_dLoOjm85XEc0xyMIQMLUWslXTVjrQc/values/DadosTelegram%21A5%3AD5?valueInputOption=USER_ENTERED&alt=json returned "Requested writing within range [DadosTelegram!A5:D5], but tried writing to column [E]". Details: "Requested writing within range [DadosTelegram!A5:D5], but tried writing to column [E]">
我在通过Python运行电报机器人时尝试第二次插入数据,它插入了第一个数据,但是在第二次尝试插入数据时,它给出了错误。
import os.path
import datetime
import telebot
import requests
import io
from PIL import Image
from telebot.types import InlineKeyboardMarkup, InlineKeyboardButton, CallbackQuery, InputMediaPhoto
from functools import partial
from google.auth.transport.requests import Request
from google.oauth2.credentials import Credentials
from google_auth_oauthlib.flow import InstalledAppFlow
from googleapiclient.discovery import build
from googleapiclient.errors import HttpError
CHAVE_API = "secret"
bot = telebot.TeleBot("secret")
#mensagem de continuidade do bot
message_continius = "Você está no controle! Se quiser experimentar outras opções ou precisar de mais informações, estou à disposição:"
SCOPES = ['https://www.googleapis.com/auth/spreadsheets']
SAMPLE_SPREADSHEET_ID = 'secret'
SAMPLE_RANGE_NAME = 'DadosTelegram!A1:D10'
def main():
global user_data
user_data = {}
bot.polling()
def save_to_google_sheets(user_data):
creds = None
if os.path.exists('token.json'):
creds = Credentials.from_authorized_user_file('token.json', SCOPES)
if not creds or not creds.valid:
if creds and creds.expired and creds.refresh_token:
creds.refresh(Request())
else:
flow = InstalledAppFlow.from_client_secrets_file(
'client_secret.json', SCOPES
)
creds = flow.run_local_server(port=0)
with open('token.json', 'w') as token:
token.write(creds.to_json())
try:
service = build('sheets', 'v4', credentials=creds)
# Determine the next empty row in the first column
result = service.spreadsheets().values().get(
spreadsheetId=SAMPLE_SPREADSHEET_ID,
range="DadosTelegram!A:A" # Check the entire column A
).execute()
values = result.get('values', [])
next_empty_row = len(values) + 1
range_name = f"DadosTelegram!A{next_empty_row}:D{next_empty_row}" # Assume you have 4 columns of data
user_data_values = user_data + [datetime.date.today().strftime('%d/%m/%Y')]
values_update = [
user_data_values,
]
# Update the range name based on the next empty row
range_name = f"DadosTelegram!A{next_empty_row}:D{next_empty_row}"
result = service.spreadsheets().values().update(
spreadsheetId=SAMPLE_SPREADSHEET_ID,
range=range_name,
valueInputOption="USER_ENTERED",
body={'values': values_update}
).execute()
except HttpError as err:
print(err)
@bot.message_handler(func=lambda message: True)
def send_welcome(message):
user_data[message.chat.id] = []
response = requests.get("https://media.discordapp.net/attachments/1046247245303001109/1228049740508168284/ConsisteLogo.png?ex=662aa172&is=66182c72&hm=bc9562674b28a5a3255d6290507b60cda73976a9d478f4d194b73cb86914ed50&=&format=webp&quality=lossless")
img = Image.open(io.BytesIO(response.content))
img.save("temp.webp", "webp")
with open("temp.webp", "rb") as f:
bot.send_sticker(message.chat.id, f)
os.remove("temp.webp")
send_keyboard(message, "Olá, Seja bem vindo a Consiste! Escolha uma opção para continuar:")
def send_keyboard(message, message_text):
keyboard = InlineKeyboardMarkup()
button1 = InlineKeyboardButton("Saber Mais Sobre a Consiste", callback_data="opcao1")
button2 = InlineKeyboardButton("Quero Entrar em Contato com a Consiste", callback_data="opcao2")
button3 = InlineKeyboardButton("Quero que a Consiste entre em contato comigo", callback_data="opcao3")
button4 = InlineKeyboardButton("Finalizar Atendimento", callback_data="finalizar")
keyboard.row(button1)
keyboard.row(button2)
keyboard.row(button3)
keyboard.row(button4)
bot.send_message(message.chat.id, message_text, reply_markup=keyboard)
@bot.callback_query_handler(func=lambda call: True)
def callback_inline(call):
if call.data == "opcao1":
bot.send_photo(call.message.chat.id,"https://media.licdn.com/dms/image/C4E03AQG7G7Gl7htZbQ/profile-displayphoto-shrink_200_200/0/1517610064166?e=1718236800&v=beta&t=DFmyD5O8UI4KusfYf9jxx-ZfjZ51rnFQ3tnQaqZrvdg")
bot.send_message(call.message.chat.id, "Esté é Marcos Vinicius Fonseca, nosso Presidente")
bot.send_message(call.message.chat.id,"""CONSISTE: Servindo ao Sucesso
Na CONSISTE, nossa missão é clara: impulsionar o sucesso dos nossos clientes. Combinamos paixão por tecnologia e comprometimento com resultados para oferecer soluções inovadoras.
Nossa equipe, composta por profissionais íntegros e criativos, trabalha em um ambiente de confiança e colaboração, onde o cliente é prioridade absoluta.
O XTR, nossa solução, é flexível e adaptável a diversas áreas. Desde a coleta de dados até o relacionamento com clientes, promove uma gestão eficiente e focada em resultados tangíveis.
Venha conhecer a CONSISTE e descubra como podemos ajudar a impulsionar o seu sucesso empresarial, na CONSISTE, servir é nossa paixão e seu sucesso, nossa prioridade. para saber mais acesse: https://www.consiste.com.br/portal.nsf/index.xsp""")
send_keyboard(call.message, message_continius)
elif call.data == "opcao2":
bot.send_message(call.message.chat.id, """
Você pode entrar em contato com a Consiste das seguintes formas:
Fone: (71) 2102-6969
E-mail: [email protected]
Para saber mais você também pode entrar em nosso Site: https://www.consiste.com.br/portal.nsf/index.xsp""")
send_keyboard(call.message, message_continius)
#Pedindo Nome
elif call.data == "opcao3":
bot.send_message(call.message.chat.id, "Você Escolheu: Quero que a Consiste entre em contato comigo")
bot.send_message(call.message.chat.id, "Por favor, digite seu Nome:")
bot.register_next_step_handler(call.message, partial(get_email, user_id=call.message.chat.id))
#Finalizando Conversa
elif call.data == "finalizar":
bot.send_message(call.message.chat.id, "Atendimento finalizado, a Consiste agradeçe!")
bot.clear_step_handler(call.message)
def get_email(message, user_id):
user_data[user_id].append(message.text)
bot.send_message(message.chat.id, "Por favor, nos informe seu E-mail:")
bot.register_next_step_handler(message, partial(get_telefone, user_id=user_id))
def get_telefone(message, user_id):
user_data[user_id].append(message.text)
bot.send_message(message.chat.id, "Por favor, nos informe seu Telefone:")
bot.register_next_step_handler(message, partial(get_phone, user_id=user_id))
def get_phone(message, user_id):
phone = message.text
if len(phone) < 12 and not phone.startswith('+'):
phone = "+55" + phone
user_data[user_id].append(phone)
bot.send_message(message.chat.id, "Obrigado pela colaboração, entraremos em contato em breve!")
send_keyboard(message, message_continius)
save_to_google_sheets(user_data[user_id])
if __name__ == "__main__":
main()
从您显示的
Requested writing within range [DadosTelegram!A5:D5], but tried writing to column [E]
错误消息来看,我猜测在这种情况下,values_update
的值的长度可能是5。在您的脚本中,从range_name = f"DadosTelegram!A{next_empty_row}:D{next_empty_row}"
开始,使用了“A”到“D”列。在这种情况下,当值的长度超过5时,就会出现这样的错误。如果你想把两个值都放进去而不报错,下面的修改怎么样?
range_name = f"DadosTelegram!A{next_empty_row}:D{next_empty_row}"
range_name = f"DadosTelegram!A{next_empty_row}"
values_update
为["a", "b", "c", "d"]
时,这些值将被放入“A”至“D”列中。并且,当 values_update
为 ["a", "b", "c", "d", "e"]
时,这些值将放入“A”至“E”列中。