我正在为一个个人Twitter机器人项目编写代码,该项目包括一堆Google电子表格。 Twitter方面运作良好,但Google电子表格方面存在问题。我使用的是gspread,该程序不断写入错误的位置。

cells=[]
cells.append(gspread.models.Cell(josa_row+2, 2, tweet.text))

if josa_place_vals[coord[0]-1][coord[1]]=="END":
    cells.append(gspread.models.Cell(josa_row+3, 1, "END"))
else:
    cells.append(gspread.models.Cell(josa_row+2, 1,
        location[0]+"/"+str(coord[0])+"/"+str(coord[1])))

cells.append(gspread.models.Cell(josa_row+3, 2,
    josa_place_vals[coord[0]-1][coord[1]-1]))

josa_record.update_cells(cells)


josa_record是我正在写的工作表,内容和行正确显示,因此我认为解释该部分的代码不是必需的。(但请告诉我。)

真正的问题是,尽管我已将列指定为2、1和2,但应将第二列上的列写入第一列,而应将第一列上的列完全消失了。它不会引发错误。

我究竟做错了什么?我是否需要发布更多代码以帮助您? (我不想发布整个函数,因为它有130行,而且几乎没有关系。)

最佳答案

这个答案怎么样?

问题:

gspread的update_cells()使用Sheets API中的sheets.values.update方法。在这种情况下,为了创建用于放置值的列表,使用了cell_list_to_rect()文件中的utils.py函数。目前,在您的脚本中,按以下顺序创建cells时,


gspread.models.Cell(josa_row+2, 2, tweet.text)
gspread.models.Cell(josa_row+3, 1, "END")
gspread.models.Cell(josa_row+3, 2, josa_place_vals[coord[0]-1][coord[1]-1])


[[tweet.text], [josa_place_vals[coord[0]-1][coord[1]-1]]]被创建为放置值的列表。 gspread.models.Cell(josa_row+3, 1, "END")不包括在列表中。

按照以下顺序创建cells时,


gspread.models.Cell(josa_row+2, 2, tweet.text)
gspread.models.Cell(josa_row+2, 1, location[0]+"/"+str(coord[0])+"/"+str(coord[1]))
gspread.models.Cell(josa_row+3, 2, josa_place_vals[coord[0]-1][coord[1]-1])


[[tweet.text], [josa_place_vals[coord[0]-1][coord[1]-1]]]被创建为放置值的列表。 location[0]+"/"+str(coord[0])+"/"+str(coord[1])不包括在列表中。

似乎从cells创建用于将值放入电子表格的列表时,这些值通过cell_list_to_rect()文件中的utils.py函数删除。

从以上结果可以看出,使用gspread的gspread.models.Cell时,将值附加到坐标的顺序很重要。

解:

如果您不想修改gspread的原始脚本,并且想要修改脚本,则需要考虑cells中每个值的顺序。它按行和列的小顺序附加值。那么下面的修改呢?

我认为您的情况可能需要进行一些修改,因此请仅将此作为几个答案之一。

修改后的脚本:

cells=[]
cells.append(gspread.models.Cell(josa_row+2, 2, tweet.text))

if josa_place_vals[coord[0]-1][coord[1]]=="END":
    cells.insert(0, gspread.models.Cell(josa_row+2, 1, ""))  # Added
    cells.append(gspread.models.Cell(josa_row+3, 1, "END"))
else:
    cells.insert(0, gspread.models.Cell(josa_row+2, 1, location[0]+"/"+str(coord[0])+"/"+str(coord[1])))  # Modified

cells.append(gspread.models.Cell(josa_row+3, 2,
    josa_place_vals[coord[0]-1][coord[1]-1]))

josa_record.update_cells(cells)


注意:


在此答案中,它假定您已经能够使用gspread放置和获取Spreadsheet的值。


参考文献:


gspread.models.Cell
update_cells
utils.py


如果我误解了您的问题,而这不是您想要的方向,我深表歉意。

添加:

作为另一种模式,使用sort()怎么样?

修改后的脚本:

cells=[]
cells.append(gspread.models.Cell(josa_row+2, 2, tweet.text))

if josa_place_vals[coord[0]-1][coord[1]]=="END":
    cells.append(gspread.models.Cell(josa_row+2, 1, ""))  # Added
    cells.append(gspread.models.Cell(josa_row+3, 1, "END"))
else:
    cells.append(gspread.models.Cell(josa_row+2, 1, location[0]+"/"+str(coord[0])+"/"+str(coord[1])))

cells.append(gspread.models.Cell(josa_row+3, 2,
    josa_place_vals[coord[0]-1][coord[1]-1]))

cells.sort(key=lambda x: (x._row, x._col))  # Added
josa_record.update_cells(cells)

10-07 12:54