首页 > 解决方案 > 如果调用多个函数,Python gspread API 不会附加行

问题描述

我正在使用 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)

为什么这是一个问题,我该如何解决?

标签: pythongoogle-sheets-apigspread

解决方案


关于你的情况:

我了解您的情况如下。

  1. 作为初始情况,工作表只有 4 行。
  2. 对于 4 行的工作表,当您运行 时append_row([""]),会附加一个空行,并且工作表有 5 行。
  3. 对于 5 行的工作表,当您运行 时append_row([""]),工作表有 5 行。并且没有附加一个空行。
    • 你想知道这其中的原因。

关于append_row()

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

appendRow(rowContents)该规范与电子表格服务中类表的方法相同。appendRow(rowContents)从这种情况来看,在谷歌方面,“spreadsheets.values.append”的方法和假设的方法似乎""不是值。

关于add_rows()

当我add_rows()在 GitHub 上看到 gspread 时,似乎输入的数字是 used rows=self.row_count + rowsRef当我看到resize(),添加行后,似乎self.row_count没有更新。参考由此,当您运行以下脚本时,

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

pinterest_sheet.add_rows(1)pinterest_sheet.add_rows(2),rows=self.row_count + rows67, 分别。我认为这是您的问题的原因add_rows()

解决方法:

当您想追加 3 个空行,即使值的最后一行没有更改,以下解决方法如何?

模式一:

pinterest_sheet.add_rows(3)

和/或

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”。在这种情况下,它似乎""被用作值。

参考:


推荐阅读