【问题标题】:gspread update_cells writes to wrong placegspread update_cells 写入错误的位置
【发布时间】:2019-09-04 04:50:00
【问题描述】:

我正在为一个个人 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 行长而且几乎不相关。)

【问题讨论】:

    标签: python google-sheets-api gspread


    【解决方案1】:

    这个答案怎么样?

    问题:

    update_cells() 的 gspread 使用 Sheets API 中的 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创建用于将值放入电子表格的列表时,这些值被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 为电子表格放置和获取值。

    参考资料:

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

    补充:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-11-01
      • 1970-01-01
      • 2012-03-03
      • 1970-01-01
      相关资源
      最近更新 更多