使用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
相关产品推荐
相关产品推荐

