Telegram Bot二次提交数据至Google Sheets触发400错误排查
错误原因分析
错误提示Requested writing within range [DadosTelegram!A5:D5], but tried writing to column [E]的核心原因是:同一用户再次提交数据时,旧的用户数据未被清空,新数据追加到旧数据列表后,导致要写入的元素数量超过了指定的4列(A-D)范围。
具体代码逻辑问题:
- 用户首次提交后,
user_data[chat.id]中保留了[姓名, 邮箱, 电话]的旧数据 - 当用户再次选择"Quero que a Consiste entre em contato comigo"选项时,没有重置该用户的
user_data列表 - 新输入的姓名、邮箱、电话会被追加到旧列表后面,最终
user_data[chat.id]会变成[旧姓名, 旧邮箱, 旧电话, 新姓名, 新邮箱, 新电话] - 调用
save_to_google_sheets时,又追加了日期,总元素数达到7个,远超指定的4列范围,触发Google Sheets的范围校验错误
解决方法
方法1:重置用户数据列表(核心修复)
在用户选择提交数据的选项(opcao3)时,强制清空该用户对应的user_data列表,确保每次提交都是全新的数据集:
修改callback_inline函数中的opcao3分支:
elif call.data == "opcao3": user_data[call.message.chat.id] = [] # 新增:清空该用户的旧数据 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))
方法2:添加数据长度校验(可选,增强鲁棒性)
在save_to_google_sheets函数中添加数据长度校验,提前拦截异常数据,避免请求到Google Sheets报错:
def save_to_google_sheets(user_data): creds = None # ... 省略原有认证代码 ... try: service = build('sheets', 'v4', credentials=creds) # ... 省略获取下一行的代码 ... user_data_values = user_data + [datetime.date.today().strftime('%d/%m/%Y')] # 新增:校验数据长度是否符合预期(4个元素:姓名、邮箱、电话、日期) if len(user_data_values) != 4: print(f"数据格式错误:期望4个元素,实际获取到{len(user_data_values)}个") return values_update = [user_data_values] 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)
内容的提问来源于stack exchange,提问作者ProgTest Beta
相关产品推荐
相关产品推荐

