Python gspread API 如果调用多个函数则不追加行

Python gspread API not appending rows if multiple functions called

我正在使用 Python 中的 gspread 模块创建一个涉及电子表格中动态行数的应用程序。

电子表格如下所示:

每当用户添加新的 Pinterest Pin 图时,程序应该在底部再追加一行。我可以模拟此行并附加以下代码:

client = gspread.authorize(SAC.from_json_keyfile_name("WROS-Editor.json", ['https://spreadsheets.google.com/feeds', 'https://www.googleapis.com/auth/drive']))
spreadsheet = client.open("WROS")

pinterest_sheet = spreadsheet.worksheet("Pinterest Pins")
pinterest_sheet.append_row([""])  # Simulating when the user creates a new pin

这按预期工作,在底部添加 1 行:

但是,当我调用该函数两次时,没有附加新行。以下代码的输出与之前的屏幕截图相同。

pinterest_sheet.append_row([""])  # Just adds 1 new row, should add 2 new rows.
pinterest_sheet.append_row([""])

当我使用 add_rows() 函数时,也会出现同样的问题。当我两次调用该函数时(每次添加 1 行,即 pinterest_sheet.add_rows(1)),它只添加 1 行。如果我将添加行的第二个数字更改为 2,它总共添加 2 行(应该添加 3)。

pinterest_sheet.add_rows(1)  # Only adds 2 rows in total, should add 3 rows.
pinterest_sheet.add_rows(2)

为什么会出现这个问题,我该如何解决?

关于你的情况:

我了解你的情况如下。

  1. 作为初始情况,sheet只有4行。
  2. 对于4行的sheet,当你运行append_row([""])时,附加了一个空行,而sheet有5行。
  3. 对于sheet有5行,当你运行append_row([""])时,sheet有5行。并且没有附加一个空行。
    • 你想知道这是什么原因。

关于append_row()

好像gspread的append_row()使用了Sheets API中的“spreadsheets.values.append”的方法。在此方法中,首先检索最后一行并将值附加到最后一行的下一行。我认为当搜索最后一行时,它会搜索该值是否在内部服务器的单元格中。这样,当第2个流在上面的流中是运行时,最后一行是第4行。当第3个流在上面的流中是运行时,最后一行是第4行,因为最后一行具有值的单元格是第 4 行。我认为这就是您 append_row().

问题的原因

此规范与Spreadsheet服务中ClassSheet的appendRow(rowContents)方法相同。从这个情况来看,在Google这边,似乎“spreadsheets.values.append”的方法和appendRow(rowContents)的方法都假设""不是这个值。

关于add_rows()

当我在GitHub看到gspread的add_rows()时,好像输入的数字是rows=self.row_count + rowsRef When I saw resize(), after the row was added, it seems that self.row_count is not updated. Ref 这样,当您 运行 以下脚本时,

pinterest_sheet.add_rows(1)
pinterest_sheet.add_rows(2)

pinterest_sheet.add_rows(1)pinterest_sheet.add_rows(2)处,rows=self.row_count + rows分别是67。我认为这就是您 add_rows().

问题的原因

解决方法:

当你想追加 3 个空行,即使最后一行的值没有改变,下面的解决方法怎么样?

模式 1:

pinterest_sheet.add_rows(3)

And/or

pinterest_sheet.append_rows([[""], [""], [""]])

模式二:

当脚本每次都是运行时要添加新行,即使最后一行的值没有改变,下面的脚本怎么样?

# client = Please set your client here
spreadsheetId = "###"  # Please set the Spreadsheet ID.
sheetName = "Sheet1"  # Please set the sheet name.
spreadsheet = client.open_by_key(spreadsheetId)
sheetId = spreadsheet.worksheet(sheetName)._properties['sheetId']
req = {
    "requests": [
      {
          "appendCells": {
              "rows": [
                  {
                      "values": [
                          {
                              "userEnteredValue": {
                                  "stringValue": ""
                              }
                          }
                      ]
                  }
              ],
              "fields": "userEnteredValue",
              "sheetId": sheetId
          }
      }
    ]
}
res = spreadsheet.batch_update(req)
print(res)
  • rows的长度增加到3时,追加3个空行。
  • 在这个示例中,使用了Sheets API中“spreadsheets.batchUpdate”方法的“AppendCellsRequest”。在这种情况下,似乎 "" 被用作值。

参考文献: