使用Python与Spreadsheets API的batchUpdate和appendCells时遇报错
问题解决:Google Sheets batchUpdate oneof字段冲突
错误根源
你把addSheet和appendCells两个操作塞进了同一个request对象里,而Google Sheets API的batchUpdate要求每个request只能包含一种操作类型(这是oneof字段的限制),所以触发了"oneof field 'kind' is already set"的错误。
修正方案
把两个操作拆成独立的request项,放在requests数组中。另外注意:新建工作表的sheetId不能直接用0(默认sheet的id通常是0,但新建的sheet会生成新id),要么手动指定一个自定义id,要么先获取新建sheet的id再执行追加操作。
修正后的代码示例
方式1:手动指定sheetId
sheet_values = [] for row in ws: row_data = {'values': []} for cell in row: row_data['values'].append({ 'userEnteredValue': {'stringValue': cell.value}, 'userEnteredFormat': {'horizontalAlignment': 'LEFT'} }) sheet_values.append(row_data) # 拆分两个操作到不同的request request_data = {"requests": [ { "addSheet": { "properties": { "title": 'sheet_name', "sheetId": 123456 # 自定义一个唯一的sheetId } } }, { "appendCells": { "sheetId": 123456, # 和上面的sheetId保持一致 "fields": "userEnteredValue, userEnteredFormat", "rows": sheet_values } } ]}
方式2:动态获取新建sheet的id
如果不想手动指定id,可以先执行新建sheet的请求,从响应中提取id再执行追加:
# 先构造新建sheet的请求 create_sheet_request = {"requests": [ { "addSheet": { "properties": { "title": 'sheet_name' } } } ]} # 执行新建请求并获取sheetId response = service.spreadsheets().batchUpdate( spreadsheetId="你的表格ID", body=create_sheet_request ).execute() new_sheet_id = response['replies'][0]['addSheet']['properties']['sheetId'] # 构造追加单元格的请求 append_request = {"requests": [ { "appendCells": { "sheetId": new_sheet_id, "fields": "userEnteredValue, userEnteredFormat", "rows": sheet_values } } ]} # 执行追加请求 service.spreadsheets().batchUpdate( spreadsheetId="你的表格ID", body=append_request ).execute()
额外检查
你的sheet_values构造逻辑是正确的,每个单元格包含了userEnteredValue和userEnteredFormat,符合appendCells的要求。
内容的提问来源于stack exchange,提问作者Edward Noga
相关产品推荐
相关产品推荐

