使用Smartsheet API推送Python DataFrame至Smartsheet遇400错误求助
解决Smartsheet API推送DataFrame时的1012错误(cell.value缺失)
问题背景
通过Meraki Dashboard API获取设备数据并生成约1000行11列的DataFrame,调用Smartsheet API将数据推送至指定表格时,触发400 Bad Request错误,错误信息如下:
{"response": {"statusCode": 400, "reason": "Bad Request", "content": {"detail": {"index": 0}, "errorCode": 1012, "message": "Required object attribute(s) are missing from your request: cell.value.", "refId": "1ob56acvz5nzv"}}}
问题根源
- DataFrame存在空值:部分单元格的值为
NaN或None,Smartsheet API不接受未赋值的cell.value,触发1012错误; - DataFrame生成逻辑缺陷:原代码的
except块在触发KeyError时,直接给未定义的dict1赋值,会导致NameError,实际运行中可能部分设备的Lan_Ip字段未被正确填充,产生空值; - 循环变量命名错误:
for i,i in data_dict.items()会覆盖变量值,虽不直接报错,但易引发逻辑混淆。
解决方案
1. 修正DataFrame生成逻辑
确保所有字段都有有效值,避免空值产生:
import pandas as pd alldata = pd.DataFrame() # 初始化空DataFrame for device in list_of_devices: # 用get方法统一处理字段缺失,默认赋值"NA" dict1 = { 'Name': device.get('name', 'NA'), "Serial_No": device.get('serial', 'NA'), 'MAC': device.get('mac', 'NA'), 'Network_Id': device.get('networkId', 'NA'), 'Product_Type': device.get('productType', 'NA'), 'Model': device.get('model', 'NA'), 'Tags': device.get('tags', 'NA'), 'Lan_Ip': device.get('lanIp', 'NA'), 'Configuration_Updated_At': device.get('configurationUpdatedAt', 'NA'), 'Firmware': device.get('firmware', 'NA'), 'URL': device.get('url', 'NA') } temp = pd.DataFrame([dict1]) # 直接用字典生成单行DataFrame alldata = pd.concat([alldata, temp], ignore_index=True) # 统一替换所有隐性空值为"NA" alldata = alldata.fillna("NA")
2. 修正Smartsheet推送代码
处理空值,修正循环变量,并确保cell.value始终有值:
import smartsheet import pandas as pd smart = smartsheet.Smartsheet(access_token='xxxxxxxx') sheet_id = xxxxxxxxxxxxx sheet = smart.Sheets.get_sheet(sheet_id) # 构建列标题到列ID的映射(注意标题大小写需完全匹配) column_map = {column.title: column.id for column in sheet.columns} # 将DataFrame转为行字典列表,更易遍历 data_rows = alldata.to_dict('records') rowsToAdd = [] for row_data in data_rows: new_row = smart.models.Row() new_row.to_top = True for col_title, cell_value in row_data.items(): # 双重校验,确保值不为空 cell_value = cell_value if pd.notna(cell_value) else "NA" # 统一转为字符串,避免非字符串类型(如日期)触发API格式错误 cell_value = str(cell_value) new_cell = smart.models.Cell() new_cell.column_id = column_map[col_title] new_cell.value = cell_value new_row.cells.append(new_cell) rowsToAdd.append(new_row) # 注意:Smartsheet API批量添加行上限为500行,1000行需分两次推送 if len(rowsToAdd) > 500: result1 = smart.Sheets.add_rows(sheet_id, rowsToAdd[:500]) result2 = smart.Sheets.add_rows(sheet_id, rowsToAdd[500:]) else: result = smart.Sheets.add_rows(sheet_id, rowsToAdd)
额外注意事项
- 确保Smartsheet表格的列标题与DataFrame的列名完全一致(大小写敏感),否则会出现列ID映射失败;
- 若包含日期类型数据,需转为Smartsheet支持的格式(如
YYYY-MM-DD HH:MM:SS); - 批量推送超过500行时必须拆分请求,否则会触发API限流或大小限制错误。
内容的提问来源于stack exchange,提问作者Abhishek_2912
相关产品推荐
相关产品推荐

