【问题标题】:Python gspread API not appending rows if multiple functions called如果调用多个函数,Python gspread API 不会附加行
【发布时间】:2020-09-07 10:06:47
【问题描述】:

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

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

【问题讨论】:

    标签: python google-sheets-api gspread


    【解决方案1】:

    关于你的情况:

    我了解您的情况如下。

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

    关于append_row()

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

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

    关于add_rows()

    当我在GitHub看到gspread的add_rows()时,输入的数字好像是rows=self.row_count + rowsRef 看到resize() 的时候,添加行后,好像self.row_count 没有更新。 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 个空行,即使最后一行的值没有改变,下面的变通方法怎么样?

    模式一:

    pinterest_sheet.add_rows(3)
    

    和/或

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

    模式2:

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

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

    参考资料:

    【讨论】:

    • 感谢您的回答!我想出了另一种解决方法,我只存储附加在变量中的行数(从 0 开始),每当我添加行时,我只使用sheet.add_rows(variable); variable += 1。但是,您的回答肯定帮助我理解了为什么会发生这种情况。
    • @Bhavye Mathur 感谢您的回复。我很高兴我知道我的回答有助于了解情况。也谢谢你。
    猜你喜欢
    • 1970-01-01
    • 2017-01-04
    • 1970-01-01
    • 2013-11-24
    • 2017-11-23
    • 1970-01-01
    • 1970-01-01
    • 2020-03-06
    • 1970-01-01
    相关资源
    最近更新 更多