

クロールして取得したデータ（1行分）をスプレッドシートの最下行に反映したいのですが、下記エラーが表示されうまく反映されません。  
解決方法はありますでしょうか。

**コード**

[code]

    JSON_KEYFILE = 'APIのJSONファイル'
    SPREADSHEET = 'TEST'
    WORKSHEET = 'Sheet1'
    
    scope = ['https://spreadsheets.google.com/feeds', 'https://www.googleapis.com/auth/drive']
    
    #認証情報設定
    serviceAccountCredentials = ServiceAccountCredentials.from_json_keyfile_name(JSON_KEYFILE, scope)
    gspreadClient = gspread.authorize(serviceAccountCredentials)
    worksheet = gspreadClient.open(SPREADSHEET).worksheet(WORKSHEET)
    
    df = pd.read_csv('test.csv', encoding="shift_jis")
    ls = df.loc[0:0]
    
    ls = ls.to_json()
    
    spread = client.open(SPREADSHEET) 
    sheet = spread.worksheet(WORKSHEET)
    worksheet.append_row(ls)
    
[/code]

**エラーコード**

`worksheet.append_row(ls)` の部分でAPIエラーが発生してしまいます。

[code]

    gspread.exceptions.APIError: {'code': 400, 'message': 'Invalid value at \'data.values[0]\' (type.googleapis.com/google.protobuf.ListValue), "{"\\u58f2\\u4e0a\\u65e5":{"0":"2021\\/06\\/14"},"\\u30a4\\u30f3\\u30d7\\u30ec\\u30c3\\u30b7\\u30e7\\u30f3(I)":{"0":19},"\\u30af\\u30ea\\u30c3\\u30af(C)":{"0":36},"\\u30aa\\u30fc\\u30c0\\u30fc\\u767a\\u751f\\u4ef6\\u6570":{"0":0},"\\u30aa\\u30fc\\u30c0\\u30fc\\u767a\\u751f\\u500b\\u6570":{"0":0},"\\u30aa\\u30fc\\u30c0\\u30fc\\u30ad\\u30e3\\u30f3\\u30bb\\u30eb\\u500b\\u6570":{"0":0},"\\u30aa\\u30fc\\u30c0\\u30fc\\u58f2\\u4e0a\\u984d":{"0":0},"\\u30ad\\u30e3\\u30f3\\u30bb\\u30eb\\u76f8\\u5f53\\u984d":{"0":0},"\\u5831\\u916c\\u5bfe\\u8c61\\u7d14\\u58f2\\u4e0a\\u984d":{"0":0},"\\u5831\\u916c\\u5bfe\\u8c61\\u30af\\u30ea\\u30c3\\u30af\\u6570":{"0":0},"\\u5831\\u916c\\u5bfe\\u8c61\\u30ea\\u30fc\\u30c9(\\u63d0\\u643a\\u8ab2\\u91d1)\\u6570":{"0":0},"\\u6210\\u679c\\u5831\\u916c\\u984d":{"0":0},"\\u78ba\\u5b9a\\u60c5\\u5831":{"0":"\\u78ba\\u5b9a"}}"', 'status': 'INVALID_ARGUMENT', 'details': [{'@type': 'type.googleapis.com/google.rpc.BadRequest', 'fieldViolations': [{'field': 'data.values[0]', 'description': 'Invalid value at \'data.values[0]\' (type.googleapis.com/google.protobuf.ListValue), "{"\\u58f2\\u4e0a\\u65e5":{"0":"2021\\/06\\/14"},"\\u30a4\\u30f3\\u30d7\\u30ec\\u30c3\\u30b7\\u30e7\\u30f3(I)":{"0":19},"\\u30af\\u30ea\\u30c3\\u30af(C)":{"0":36},"\\u30aa\\u30fc\\u30c0\\u30fc\\u767a\\u751f\\u4ef6\\u6570":{"0":0},"\\u30aa\\u30fc\\u30c0\\u30fc\\u767a\\u751f\\u500b\\u6570":{"0":0},"\\u30aa\\u30fc\\u30c0\\u30fc\\u30ad\\u30e3\\u30f3\\u30bb\\u30eb\\u500b\\u6570":{"0":0},"\\u30aa\\u30fc\\u30c0\\u30fc\\u58f2\\u4e0a\\u984d":{"0":0},"\\u30ad\\u30e3\\u30f3\\u30bb\\u30eb\\u76f8\\u5f53\\u984d":{"0":0},"\\u5831\\u916c\\u5bfe\\u8c61\\u7d14\\u58f2\\u4e0a\\u984d":{"0":0},"\\u5831\\u916c\\u5bfe\\u8c61\\u30af\\u30ea\\u30c3\\u30af\\u6570":{"0":0},"\\u5831\\u916c\\u5bfe\\u8c61\\u30ea\\u30fc\\u30c9(\\u63d0\\u643a\\u8ab2\\u91d1)\\u6570":{"0":0},"\\u6210\\u679c\\u5831\\u916c\\u984d":{"0":0},"\\u78ba\\u5b9a\\u60c5\\u5831":{"0":"\\u78ba\\u5b9a"}}"'}]}]}
    
[/code]


CC BY-SA 4.0
2021-06-17T01:56:10.700
77615
2022-12-08T09:08:26.053
2021-06-17T06:56:57.830
3060
45216
question
python python3 google-spreadsheet
Google スプレッドシートへのデータフレーム追加時にエラー: type.googleapis.com/google.protobuf.ListValue


[metropolis氏のコメント](https://ja.stackoverflow.com/questions/77615/%e3%82%b9%e3%83%97%e3%83%ac%e3%83%83%e3%83%89%e3%82%b7%e3%83%bc%e3%83%88%e3%81%b8%e3%81%ae%e3%83%87%e3%83%bc%e3%82%bf%e3%83%95%e3%83%ac%e3%83%bc%e3%83%a0%e3%81%ae%e8%bf%bd%e5%8a%a0#comment87737_77615)でもあるように、Sheets
APIを使用して値をSpreadsheetへ挿入する場合は、セルに入るデータ部分はリストである必要があります。そこで、次のような修正はいかがでしょうか。

## Pattern 1:

このパターンでは、dataframeはリストに変換されて`values_update`メソッドを使ってセルへ挿入します。

### From:

[code]

    ls = df.loc[0:0]
    ls = ls.to_json()
    
    spread = client.open(SPREADSHEET) 
    sheet = spread.worksheet(WORKSHEET)
    worksheet.append_row(ls)
    
[/code]

### To:

[code]

    ls = df.loc[0:0]
    
    values = [ls.columns.values.tolist()]
    values.extend(ls.values.tolist())
    
    spread = client.open(SPREADSHEET)
    spread.values_update(WORKSHEET, params={'valueInputOption': 'USER_ENTERED'}, body={'values': values})
    
[/code]

## Pattern ２:

このパターンでは、[gspread-dataframe](https://github.com/robin900/gspread-
dataframe)のライブラリを使用します。

### From:

[code]

    ls = df.loc[0:0]
    ls = ls.to_json()
    
    spread = client.open(SPREADSHEET) 
    sheet = spread.worksheet(WORKSHEET)
    worksheet.append_row(ls)
    
[/code]

### To:

[code]

    ls = df.loc[0:0]
    
    spread = client.open(SPREADSHEET) 
    sheet = spread.worksheet(WORKSHEET)
    gd.set_with_dataframe(sheet, ls)
    
[/code]

この場合、`import gspread_dataframe as gd`を使用します。

### References:

  * [values_update(range, params=None, body=None)](https://docs.gspread.org/en/latest/api.html?highlight=values_update#gspread.models.Spreadsheet.values_update)
  * [gspread-dataframe](https://github.com/robin900/gspread-dataframe)


CC BY-SA 4.0
2021-06-17T06:44:44.090
77622
2021-06-17T06:44:44.090
19460
77615
answer