gspread update_cells 写入错误的地方

gspread update_cells writes to wrong place

我正在为一个包含大量 google 电子表格的个人 Twitter 机器人项目编写代码。 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,但是应该在第二列的列被写入了第一列,而应该在第一列的列列完全消失。不过它不会引发错误。

我做错了什么?我需要 post 更多代码来帮助你们吗? (我不想 post 整个函数,因为它有 130 行长而且大部分都不相关。)

这个答案怎么样?

问题:

gspread的

update_cells()使用了SheetsAPI中spreadsheets.values.update的方法。在这种情况下,为了创建用于放置值的列表,使用了 utils.py 文件中的 cell_list_to_rect() 函数。这时候,在你的脚本中,当cells按以下顺序创建时,

  1. gspread.models.Cell(josa_row+2, 2, tweet.text)
  2. gspread.models.Cell(josa_row+3, 1, "END")
  3. 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 时,

  1. gspread.models.Cell(josa_row+2, 2, tweet.text)
  2. gspread.models.Cell(josa_row+2, 1, location[0]+"/"+str(coord[0])+"/"+str(coord[1]))
  3. 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 创建时,这些值被 utils.py 文件中的 cell_list_to_rect() 函数删除。

从上面的结果来看,当使用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 为电子表格输入和获取值。

参考文献:

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

已添加:

作为另一种模式,使用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)