我正在为一个个人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)