Ham*_*ton 2 python google-sheets pandas google-sheets-api
我正在使用谷歌表格来保存共享项目的数据。使用 Google 的 Sheets API 我访问数据,在 python 中处理它,我试图在函数编写器中使用batchUpdate更新 Sheets 文件。
TypeError: Object of type DataFrame is not JSON serializable.to_json(),我会得到这个:googleapiclient.errors.HttpError: <HttpError 400 当请求https://sheets.googleapis.com/v4/spreadsheets/XXX/values:batchUpdate?alt=json 时返回“‘data[0].values’处的无效值(类型。 googleapis.com/google.protobuf.ListValue), "{"0":{"0":1},"1":{"0":2},"2":{"0":3}," 3":{"0":4}}""。详细信息:“[{'@type':'type.googleapis.com/google.rpc.BadRequest','fieldViolations':[{'field':'data[0].values','description':'无效值在 'data[0].values' (type.googleapis.com/google.protobuf.ListValue), "{"0":{"0":1},"1":{"0":2}," 2":{"0":3},"3":{"0":4}}"'
任何指针将不胜感激。
import pickle
import os.path
import pandas as pd
from googleapiclient.discovery import build
from google_auth_oauthlib.flow import InstalledAppFlow
from google.auth.transport.requests import Request
from pprint import pprint
# If modifying these scopes, delete the file token.pickle.
SCOPES = ['https://www.googleapis.com/auth/spreadsheets']
# Spreadsheet ID: https://docs.google.com/spreadsheets/d/XXX/edit#gid=0
SPREADSHEET_ID = 'XXX'
RANGE_NAME = 'contacts'
def writer(df):
service = build('sheets', 'v4', credentials=gsheet_api(SCOPES))
sheet_name = 'contacts'
data = [{'range' : sheet_name, 'values' : df}]
batch_update_values_request_body = {
'value_input_option': 'RAW',
'data': data }
request = service.spreadsheets().values().batchUpdate(spreadsheetId=SPREADSHEET_ID,
body=batch_update_values_request_body)
response = request.execute()
pprint(response)
df = [[1, 2, 3, 4]]
writer(df)
Run Code Online (Sandbox Code Playgroud)
我相信你的目标和情况如下。
为此,这个答案怎么样?
我不确定数据框的值。因此,在此答案中,我想使用以下示例数据框解释修改点。
A B C
0 1 2 3
1 4 5 6
2 7 8 9
Run Code Online (Sandbox Code Playgroud)
不幸的是,数据帧不能直接用于方法“spreadsheets.values.batchUpdate”的请求主体。所以在这种情况下,需要从数据帧转换为二维数组。为此,我使用了tolist().
当您使用示例数据框修改脚本时,它变成如下。
df = [[1, 2, 3, 4]]
writer(df)
Run Code Online (Sandbox Code Playgroud)
到:
sampleValue = [[1, 2, 3], [4, 5, 6], [7, 8, 9]]
df = pd.DataFrame(sampleValue, columns=list('ABC'))
values = [df.columns.values.tolist()]
values.extend(df.values.tolist())
writer(values)
Run Code Online (Sandbox Code Playgroud)
从
values = [df.columns.values.tolist()]
values.extend(df.values.tolist())
Run Code Online (Sandbox Code Playgroud)
到
values = df.values.tolist()
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
3714 次 |
| 最近记录: |