python - 如果调用多个函数,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)
为什么这是一个问题,我该如何解决?
解决方案
关于你的情况:
我了解您的情况如下。
- 作为初始情况,工作表只有 4 行。
- 对于 4 行的工作表,当您运行 时
append_row([""])
,会附加一个空行,并且工作表有 5 行。 - 对于 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 + rows
。Ref当我看到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 + rows
是6
和7
, 分别。我认为这是您的问题的原因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”。在这种情况下,它似乎
""
被用作值。
参考:
推荐阅读
- r - Parquet 文件中的 DATE-TIME / TIMESTAMP 字段在 Parquet 文件查看器中显示为数字
- python - 如何从元素列表python中提取数据
- python - 如何在python和beautifulsoup的文本文件中将多个for循环打印结果写入一行
- machine-learning - 人体运动分类的无监督特征提取方法
- typescript - 使用 Tailwind 和 Typescript 创建下一个应用程序
- installation - 从源代码构建 llvm 时,如何将其安装到系统中?
- c# - C# 重定向到 about:blank
- python - 乌龟在 While 循环中崩溃
- php - smtp mailler 在本地服务器上运行良好,但在实时服务器中发送空邮件(不发送提交表单 fileld 数据)
- android - 北极狐升级后安卓模拟器无法启动,libvulkan.so: failed