【问题标题】:Errors returning the correct value at indecie在索引处返回正确值的错误
【发布时间】:2021-12-28 21:22:36
【问题描述】:

底部编辑

我只发布与我的问题相关的部分代码,因为我现在正在使用大约 300 行代码并且正在快速增长。

我的错误:

gspread.exceptions.APIError: {'code': 400, 'message': 'Invalid requests[0].addSheet: A sheet with the name "Elijah Skinner" already exists. Please enter another name.', 'status': 'INVALID_ARGUMENT'}

我的想法:

我认为问题在于 getUser() 没有返回正确的值。我不确定是因为我需要使用 enumerate 还是在获取索引时。

我的代码:

import gspread
import pandas as pd
from gspread import worksheet
from oauth2client.service_account import ServiceAccountCredentials
from tkinter import *
from tkinter import messagebox
import tkinter.font as tkFont
from datetime import datetime
from time import strftime

# authorize the clientsheet 
client = gspread.authorize(creds)

# get the instance of the Spreadsheet
sheet = client.open('Punch Card Systems')

# get the first sheet of the Spreadsheet
sheet_instance = sheet.get_worksheet(0)

# get the total number of columns
sheet_instance.col_count

# get the value at the specific cell
sheet_instance.cell(col=3, row=2)


class Employee:
    def __init__(self, firstName, lastName, email, timeCard, payRate):
        self.firstName = firstName
        self.lastName = lastName
        self.email = email
        self.timeCard = {}
        self.payRate = 15
        self.clockedIn = False


p1 = Employee("Elijah", "Skinner", "email@gmail.com", timeStamp(), 15.00)


fullName = (p1.firstName + " " + p1.lastName)


def getUser():
    for r in range(1, sheet_instance.row_count - 1):
        row = sheet_instance.row_values(r)
        if row[0] == fullName:
            print(row[0])
            return row[0]


if fullName == getUser():
    sheet_runs = sheet.get_worksheet(fullName)
    worksheet.update_cell(1, 1, p1.timeCard)

if fullName != getUser():
    sheet.add_worksheet(rows=20, cols=20, title=fullName)
    worksheet.update_cell(1, 1, p1.timeCard)

第二个 if 语句成功创建了一个具有正确名称的新工作表,但我的 update_cell 行不工作;不过我更关心的是第一个 if 语句。

我上面粘贴的错误是我在创建工作表后运行程序时得到的。它完全跳过了第一个 if 语句。这告诉我(我认为) getUser() 返回了错误的值。

另一方面,当我使用 print(row[0]) 打印索引值时,无论如何它都会打印出我正在搜索的正确值。如果它返回正确的值,那么这是否意味着我的 if 语句有问题?

编辑:

我只是尝试了这个,看看它是否会返回我需要的正确值:

def getUser():
    for r in range(1, sheet_instance.row_count - 1):
        row = sheet_instance.row_values(r)
        if row[0] == fullName:
            print(row[0])
            name = row[0]
    return name

我收到了这个错误:IndexError: list index out of range

############################

def getUser():
    for r in range(1, sheet_instance.row_count - 1):
        row = sheet_instance.row_values(r)
        if row[0] == fullName:
            print(row[0])
            return row[0]


if fullName == getUser():
    sheet_runs = sheet.get_worksheet(fullName)
    sheet_runs.update_cell(1, 1, p1.timeCard)

if fullName != getUser():
    sheet.add_worksheet(rows=20, cols=20, title=fullName)
    sheet_runs.update_cell(1, 1, p1.timeCard)

我认为我返回了正确的值,但我收到了这个错误:TypeError: list indices must be integers or slices, not str

老实说,这让我更加困惑。它正在打印正确的响应,但没有发送它。是不是因为我打印的时候,它还在那个索引上?

#####################################

def getUser():
    for r in range(1, sheet_instance.row_count + 1):
        row = sheet_instance.row_values(r)
        if row[r] == fullName:
            print(row[0])
            return True


if getUser():
    sheet_runs = sheet.get_worksheet(fullName)
    sheet_runs.update_cell(1, 1, p1.timeCard)
else:
    sheet.add_worksheet(rows=20, cols=20, title=fullName)
    sheet_runs = sheet.get_worksheet(fullName)
    sheet_runs.update_cell(1, 1, p1.timeCard)
#############################################

【问题讨论】:

  • 请阅读stackoverflow.com/help/minimal-reproducible-example 并尝试创建一段其他人无需修改即可运行的自包含代码以查看问题。甚至不清楚您正在使用哪些库,或者您正在尝试解决什么问题。请尝试提出问题,而不是仅仅通过代码、错误消息和您的思考过程来讨论
  • 感谢您的意见。我会相应地更新。
  • @KarlKnechtel 现在应该可以了。我添加了除 tkinter 代码和一些敏感信息之外的所有内容。为混乱道歉。
  • 我的问题是为什么 if 语句 if fullName == getUser(): 不能正常工作,我该如何解决它
  • getUser() 将返回fullNameNone。如果您所做的只是验证名称,则可以返回 True 或 False。 sheet_instance 是否应该包含您的工作表名称列表?你究竟是从哪里得到 TypeError 的?

标签: python if-statement tkinter google-sheets gspread


【解决方案1】:

已解决

感谢 cmets 中的 Tim,我将 getUser() 函数更新为布尔值,因为这正是我所需要的。这清楚了很多。为了解决我遇到的类型错误,我将 get_worksheet 更改为 worksheet。因为我已经把所有的床单都放进去了,所以我不需要再拿了。

更新的工作代码

fullName = (p1.firstName + " " + p1.lastName)
currentUserSheet = sheet.worksheet(fullName)

def getUser():
    for r in range(1, sheet_instance.row_count + 1):
        row = sheet_instance.row_values(r)
        if row[0] == fullName:
            print(row[0])
            return True


if getUser():
    print("It WORKS")
    #currentUserSheet.update_cell(1, 1, p1.timeCard)
else:
    sheet.add_worksheet(rows=20, cols=20, title=fullName)
    #currentUserSheet.update_cell(1, 1, p1.timeCard)

单元格更新被注释掉,因为 p1.timecard 是谷歌表格的无效格式。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-04-02
    • 2017-07-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多