You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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"}}}

问题根源

  1. DataFrame存在空值:部分单元格的值为NaN或None,Smartsheet API不接受未赋值的cell.value,触发1012错误;
  2. DataFrame生成逻辑缺陷:原代码的except块在触发KeyError时,直接给未定义的dict1赋值,会导致NameError,实际运行中可能部分设备的Lan_Ip字段未被正确填充,产生空值;
  3. 循环变量命名错误: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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.21 15:15:33