如何使用Python将本地CSV文件内容追加至现有Google Sheet
错误根因
当前报错是因为你直接将Pandas DataFrame对象传递给了Google Sheets API的请求体,API无法将DataFrame序列化为JSON格式;同时你使用了错误的请求体字段结构,values.append接口要求的是values字段而非data字段。
最简实现方案(复用已导入的gspread库,代码更简洁)
你已经导入了gspread库,不需要直接调用底层的googleapiclient接口,用gspread封装好的追加方法更不易出错,完整修正代码如下:
import pandas as pd from oauth2client.service_account import ServiceAccountCredentials import gspread as gs scope = ["https://spreadsheets.google.com/feeds", 'https://www.googleapis.com/auth/spreadsheets', "https://www.googleapis.com/auth/drive.file", "https://www.googleapis.com/auth/drive"] # 配置路径 imp_dir = "C:\\Users\\SRevelle\\Google Drive" credentials = ServiceAccountCredentials.from_json_keyfile_name(f'{imp_dir}\\client_secret.json', scope) client = gs.authorize(credentials) # 读取本地CSV df = pd.read_csv(f'{imp_dir}\\data.csv') # 打开目标Google Sheet spreadsheet_id = '1_XXXXXXXXXXXdwEOkETjEI0HrdP5M5Jh4XXXXXXXXXX' sheet = client.open_by_key(spreadsheet_id).worksheet('Test') # DataFrame转二维列表:不需要追加表头就用当前写法,需要加表头就改为 values = [df.columns.tolist()] + df.values.tolist() values = df.values.tolist() # 追加到表格末尾,保留原有数据 sheet.append_rows(values, value_input_option='USER_ENTERED', insert_data_option='INSERT_ROWS')
若要保留原有googleapiclient调用逻辑,仅需修改请求体构造部分即可
# 将DataFrame转为API可识别的二维列表 values = df.values.tolist() request = service.spreadsheets().values().append( spreadsheetId=spreadsheet_id, range=rangeval, valueInputOption=value_input_option, insertDataOption=insert_data_option, body={'values': values} # 替换原有的错误写法'data':df ) response = request.execute()
注意事项
- 请提前将服务账号JSON文件中的
client_email对应的邮箱,添加到目标Google Sheet的共享列表中,授予编辑权限,否则会触发权限不足报错 - 如果需要同时追加CSV表头,只需要将转列表的代码调整为
values = [df.columns.tolist()] + df.values.tolist()即可
内容的提问来源于stack exchange,提问作者SRev
相关产品推荐
相关产品推荐

