簡體   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