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

问题描述 投票:1回答:2

我的目标是更新一个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可读,但不能是一个字符串,否则会被解释为一个单一的参数!

任何帮助将是非常感激的。

python json pandas google-sheets gspread
2个回答
1
投票

如果 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。非常强大,但需要更多的模板代码。如果你比较两个代码示例,你可以看到这一点。这是一个权衡。


1
投票

正如官方的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 列表。

© www.soinside.com 2019 - 2024. All rights reserved.