在 gspread中,如果我执行以下操作
wks.range('D2:D13')
我没有收到任何错误。
但是,如果我想从第 2 行获取"D"列中的所有行,请使用 A1 表示法出现错误:
wks.range('D2:D')
错误:
raise IncorrectCellLabel(label)
gspread.exceptions.IncorrectCellLabel: D
根据 gspread api 参考,Worksheet.range 应该使用 A1 表示法。 根据Google的Sheets API文档,我正在尝试做的事情似乎是正确的。
这是怎么回事?gspread 不支持该格式还是我用错了?
前言
在调查这个特别的问题时,我发现没有一种非常清晰的gspread方法可以从 Google 工作表中获取 A1 表示法的单个范围,这真的很奇怪,但我相信这是有原因的。
如文档中所述,gspread 的创建者希望减少对 Google Sheet API 的 API 调用:https://docs.gspread.org/en/latest/user-guide.html#getting-all-values-from-a-row-or-a-column。
答案
无论如何,有一种偷偷摸摸的 GSPREAD 提供了通过batch_get方法获取特定范围或范围的方法。您应该尝试:
wks.batch_get( ('D2:D',) )[0]
更好的是,如果你想一次获得几个不同的范围(通过一个 API 调用(,你可以调用:
ranges = wks.batch_get( ('D2:D', 'A2:A') )
- a1Notation of
D2:D
和 python 使用 gspread 来检索值。 - 在当前阶段,当运行
wks.range('D2:D')
时,会发生问题中显示的错误。 - 您想知道此错误的原因。
- 您已经能够使用表格API获取和输入Google电子表格的值。
如果我的理解是正确的,那么这个答案呢?请将此视为几种可能的答案之一。
问题和解决方法:
当我确认range()
的源脚本时,当运行range()
时,发现这些值是用data = self.spreadsheet.values_get(range_label)
检索的。所以在这种情况下,可以使用D2:D
。
但是(last_row, last_column) = a1_to_rowcol(end)
运行,就会发生错误。a1_to_rowcol()
的脚本可以在这里看到。
确认a1_to_rowcol()
后,D2:D
的D2
返回CELL_ADDR_RE = re.compile(r'([A-Za-z]+)([1-9]d*)')
正则表达式中的值。但是D
D2:D
不会从正则表达式返回值。这样,raise IncorrectCellLabel(label)
运行,然后发生此类错误。
解决方法:
为了使用D2:D
的 a1Notation 检索值,以下解决方法如何?在此解决方法中,使用values_get(range, params=None)
方法。在这种情况下,D2:D
可用于从电子表格中检索值。
示例脚本:
client = gspread.authorize(credentials)
spreadsheetId = "###" # Please set the Spreadsheet ID.
sh = client.open_by_key(spreadsheetId)
res = sh.values_get("Sheet1!D2:D") # Please set the a1Notation.
print(res) # or print(res['values'])
- 在这种情况下,将检索
Sheet1
表上D2:D
单元格的值。 - 当工作表名称不像
res = sh.values_get("D2:D")
那样使用时,将从电子表格的第一个选项卡中检索值。
引用:
- values_get
- gspread on GitHub
如果我误解了你的问题,这不是你想要的方向,我很抱歉。