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

使用Smartsheet Python API解锁表格行时遇400错误求助

问题:调用Smartsheet Python API解锁行时返回400错误(错误码1008)

我有一个文件夹,里面有约40个Smartsheet表格,每个表格的第3至45行被锁定编辑。我编写Python脚本调用Smartsheet Python API,遍历该文件夹内所有表格,尝试解锁第3至30行,但运行脚本时返回400错误(错误码1008:Unable to parse request)。

原代码

import smartsheet
access_token = '2vdafasdfadfasdfasdf'
client = smartsheet.Smartsheet(access_token)
# 包含表格的文件夹ID
folder_id = '123456789'  # 替换为你的文件夹ID

def unlock_rows(sheet_id, start_row, end_row):
    sheet = client.Sheets.get_sheet(sheet_id)
    rows_to_update = []

    for row in sheet.rows[start_row-1:end_row]:
        # 修改获取到的Row对象
        row.locked = False
        rows_to_update.append(row)  # 添加修改后的Row对象

    # 更新表格中的行
    response = client.Sheets.update_rows(sheet_id, rows_to_update)
    if response.message == 'SUCCESS':
        print(f"已解锁表格 {sheet.name} 的第 {start_row} 至 {end_row} 行")
    else:
        print(f"解锁表格 {sheet.name} 的行失败: {response}")


# 获取文件夹内所有表格
folder = client.Folders.get_folder(folder_id)
sheets = folder.sheets

# 遍历每个表格并解锁指定行
for sheet in sheets:
    sheet_id = sheet.id
    unlock_rows(sheet_id, 3, 30)  # 可根据需要调整行范围

print("所有行解锁完成。")

报错信息

{"response": {"statusCode": 400, "reason": "Bad Request", "content": {"errorCode": 1008, "message": "Unable to parse request.", "refId": "36e3d096-06fd-4042-adc6-aa14c2e4aa77"}}}
Failed to unlock rows in sheet HOJAPRUEBA1: {"result": {"code": 1008, "errorCode": 1008, "message": "Unable to parse request.", "name": "ApiError", "recommendation": "Do not retry without fixing the problem. ", "refId": "36e3d096-06fd-4042-adc6-aa14c2e4aa77", "shouldRetry": false, "statusCode": 400}}
Rows unlocked successfully.

问题原因

直接修改从get_sheet接口获取的完整Row对象并传入update_rows,会导致请求中包含大量Smartsheet API不需要的冗余字段,API无法解析这种格式的请求,因此返回1008错误。

修复方案

不需要传递完整的Row对象,只需创建包含行ID和locked状态两个必要字段的精简Row对象即可。修改后的完整代码如下:

import smartsheet
access_token = '2vdafasdfadfasdfasdf'
client = smartsheet.Smartsheet(access_token)
# 包含表格的文件夹ID
folder_id = '123456789'  # 替换为你的文件夹ID

def unlock_rows(sheet_id, start_row, end_row):
    sheet = client.Sheets.get_sheet(sheet_id)
    rows_to_update = []

    for row in sheet.rows[start_row-1:end_row]:
        # 创建新的Row对象,仅设置必要的属性
        updated_row = smartsheet.models.Row()
        updated_row.id = row.id
        updated_row.locked = False
        rows_to_update.append(updated_row)

    # 更新表格中的行
    response = client.Sheets.update_rows(sheet_id, rows_to_update)
    if response.message == 'SUCCESS':
        print(f"已解锁表格 {sheet.name} 的第 {start_row} 至 {end_row} 行")
    else:
        print(f"解锁表格 {sheet.name} 的行失败: {response}")


# 获取文件夹内所有表格
folder = client.Folders.get_folder(folder_id)
sheets = folder.sheets

# 遍历每个表格并解锁指定行
for sheet in sheets:
    sheet_id = sheet.id
    unlock_rows(sheet_id, 3, 30)  # 可根据需要调整行范围

print("所有行解锁完成。")

关键修改说明

  • 使用smartsheet.models.Row()创建新的行对象,只保留id(用于定位目标行)和locked(要修改的状态)两个核心属性
  • 避免传递从get_sheet获取的完整行对象,剔除冗余数据,符合Smartsheet API的请求解析规范

运行修改后的脚本即可正常解锁指定范围的行。

内容的提问来源于stack exchange,提问作者josecal_ism

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.19 21:41:13