我的目标是更新一个Google Sheets文档,用我自己的数据表(即一个实例表和一个类的属性表)替换它第一张表的内容。我曾尝试使用gspread模块来实现这一目标,但效果并不理想。如果我运行这一行
client.open("GoogleSheetName").sheet1.update('A1:R181',Member.display().to_json())
(其中Member是我的类,display()是我自己的类方法,它只是将我的数据转换为pandas的dataFrame对象。),整个的 Member.display().to_json()
字符串被放在A1单元格中,就好像它从来没有被解压过,只是作为一个字符串留下。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())
其他关于使用 大熊猫 是在文档中。
Sidenote:
当然,你也可以像Alberto指出的那样使用官方API。这一切都取决于你的用例。Google Sheets API是一个低级别的API。非常强大,但需要更多的模板代码。如果你比较两个代码示例,你可以看到这一点。这是一个权衡。
正如官方的Sheets API所说 方法: spreadsheets.values.append 请求正文
请求体包含一个ValueRange的实例。
ValueRange的实例。 是一个JSON,必须包含一个名为 价值观 ,必须是一个数组。我做了下面这个例子,基于 Python快速入门 来告诉您如何将您想要的数据传递到您的电子表格中。
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 列表。