python(gspread)-将整个数据表放在我的Google Sheets的一个单元格中,而不是单独的单元格中



我的目标是通过用我自己的数据表(即,针对类属性的实例表(替换第一个工作表的内容来更新Google Sheets文档。我曾尝试使用模块gspread来做到这一点,但效果不太好:如果我运行

client.open("GoogleSheetName").sheet1.update('A1:R181',Member.display().to_json())

(其中Member是我的类,display((是我自己的类方法,它只是将我的数据转换为pandas dataFrame对象。(,整个Member.display().to_json()字符串被放入单元格A1中,就好像它从未被拆包并且只是作为一个字符串留下一样。如果我使用json模块并使用json.dumps(Member.display().to_dict())转储数据,我会遇到同样的问题。

我还试图简单地将数据更改为Member.display().to_dict(),在这种情况下,我会得到一个"Invalid JSON payload received"错误。

数据似乎需要采用矩阵格式才能工作,即[[..,..,..][..,..,..]...],因为在我的情况下,这是唯一正确工作的格式。我知道它有效,因为当我通过运行来测试API时

client.open("GoogleSheetName").sheet1.update('A1:B2', [[1, 2], [3, 4]])

根据需要,每个数字都放在各自独立的单元格中。这是我必须使用的格式吗?

我该如何解决这个问题?这就像我的数据需要发送JSON可读,但不能是字符串,否则它将被解释为单个参数!

如有任何帮助,我们将不胜感激。

如果Member.display()是pandas DataFrame,您可以执行以下操作来使用gspread更新工作表:

df = Member.display()
ws = client.open("GoogleSheetName").sheet1
ws.update([df.columns.values.tolist()] + df.values.tolist())

有关将gspread与panda一起使用的其他示例在文档中。

旁注:

当然,正如Alberto所指出的,你可以使用官方的API。这完全取决于您的用例。Google Sheets API是一个较低级别的API。非常强大,但需要更多的样板代码。如果比较两个代码示例,您可以看到这一点。这是一种权衡。

正如API官方表格在方法中所说:spreadsheets.values.append请求正文

请求正文包含ValueRange的一个实例。

ValueRange是一个JSON,它必须包含一个名为values的键,该键必须是数组数组。我基于Python Quickstart制作了以下示例,向您展示如何将所需数据传递到电子表格。

service = discovery.build('sheets', 'v4', credentials=creds)
spreadsheet_id = 'YOUR-SHEETS-ID'
ranges = "A1:A"
value_render_option = "DIMENSION_UNSPECIFIED"
value_input_option = "USER_ENTERED"
df = pd.DataFrame({
'age':    [ 3,  29],
'height': [94, 170],
'weight': [31, 115]
})
value_range_body = {
"values": df.to_numpy().tolist(),
"majorDimension": "DIMENSION_UNSPECIFIED"
}
request = service.spreadsheets().values()
.append(spreadsheetId=spreadsheet_id, range=ranges, valueInputOption=value_input_option, body=value_range_body)
response = request.execute()
print(response)

正如您所看到的,我正在使用df.to_numpy().tolist()将pandas数据帧转换为NumPy数组,然后转换为普通的Python列表。

相关内容

最新更新