繁体   English   中英

python (gspread) - 整个 data.table 放在我的 Google 表格的一个单元格中,而不是单独的单元格中

[英]python (gspread) - whole data table placed in one cell of my Google Sheets instead of separate cells

我的目标是通过用我自己的数据表(即针对类属性的实例表)替换其第一个工作表的内容来更新 Google 表格文档。 我曾尝试使用模块 gspread 来执行此操作,但效果并不理想:如果我运行该行

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

(其中 Member 是我的 class,而 display() 是我自己的 class 方法,它只是将我的数据转换为 pandas dataFrame object。),整个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 可读但不能是字符串否则它被解释为单个参数!

任何帮助将不胜感激。

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

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

ValueRange是一个 JSON,它必须包含一个名为values的键,该键必须是 arrays 的数组。我根据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 dataframe 转换为 NumPy 数组,然后转换为正常的 Python 列表。

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

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

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

边注:

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM