我正在尝试使用 object_values 填充多重选择列表,但在较旧的工作表上,它在返回时无法工作
"Required object attribute(s) are missing from your request: cell.value."
所以我编写了一个函数来将列更新为 MULTI_PICKLIST,但它实际上不会改变
这是我用来更新专栏的代码
client = smartsheet.Smartsheet('KEY')
client.errors_as_exceptions(False)
target_sheet = init_sheet(workspace, target_sheet_name, client)
target_column = target_sheet.get_colunm(1234567890)
update_column = smartsheet.models.Column({
'title': 'New Column',
'index': target_column.index,
'level': 3,
'type': 'MULTI_PICKLIST',
'options': options
})
client.Sheets.update_column(target_sheet.id, target_column.id, update_column)
但是当我再次加载工作表时,该列仍然是 TEXT_NUMER 类型
首先 - 错误
"Required object attribute(s) are missing from your request: cell.value."
表示尝试为多选列表设置值的 Python 代码存在问题。有关显示如何在新行中创建多选下拉列的代码,请参阅我在这篇文章中的回答:如何使用多选下拉值将新行添加到 Smartsheet 工作表?。具体来说,请参阅答案的更新 - 完整的概念证明部分中的代码片段。
关于您在问题中发布的“更新列”代码:
index
属性,因为您不会通过更新列请求更改其值。level
不是更新列请求中的有效列属性,因此设置其值没有任何好处(它只会被忽略)。关于您尝试解决的场景 - 使用 Update Column API 请求将列从类型
TEXT_NUMBER
更改为类型 MULTI_PICKLIST
- 似乎您的代码应该按编写的方式工作(假设值代码中的 options
是一个值列表(数组))。 (不过,请继续删除 index
属性和 level
属性,因为在您的请求中设置这些属性不会产生任何效果。)
我通过在工作表中创建一个
TEXT_NUMBER
列,然后运行以下代码来证明这一点——将列类型更改为 MULTI_PICKLIST
并使用 3 个值填充列表。
column_spec = smartsheet.models.Column({
'title': 'multi-select col now',
'options': ['One', 'Two', 'Three'],
'type': 'MULTI_PICKLIST'
})
# Update column
sheetId = 2702602705784708
columnId = 7331855331184516
result = smartsheet_client.Sheets.update_column(sheetId, columnId, column_spec)
运行此代码后,我通过刷新 Smartsheet 中的工作表然后查看列属性来验证它是否有效:
到目前为止,一切都很好——对吗?但后来我发出了 Get Column API 请求,以查看该列定义,现在它显然已更改为
MULTI_PICKLIST
列:
要求:
GET https://api.smartsheet.com/2.0/sheets/2702602705784708/columns/7331855331184516
这是我收到的 API 响应:
{
"id": 7331855331184516,
"version": 2,
"index": 4,
"title": "multi-select col now",
"type": "TEXT_NUMBER",
"options": [
"One",
"Two",
"Three"
],
"validation": false,
"width": 150
}
到底是什么?!
TYPE
属性设置为 TEXT_NUMBER
——尽管存在暗示选项列表的 options
属性,并且尽管当我在智能表中查看其属性时该列绝对是 MULTI_PICKLIST
列应用程序。
我怀疑这就是您所看到的 - 即,如果您在运行代码后查看应用程序中的列属性,您会看到列类型确实已更改为
MULTI_PICKLIST
- 但如果您通过 API 检索该列定义(通过 Get Sheet 请求或 Get Column 请求)——API 响应中 column.type
的值仍然是 TEXT_NUMBER
。
不管你信不信,这种行为实际上是“设计使然”——由于 Smartsheet 不久前添加/实现新列类型的方式
MULTI_PICKLIST
(出于向后兼容性原因)。
默认情况下,
MULTI*
列类型(多选选项列表、多选联系人等)的 API 响应将为 column.type
指定 TEXT_NUMBER
任何 MULTI*
列。
要进行 API 响应,请为任何 MULTI*
列(例如
MULTI_PICKLIST
)指定 actual列类型 - 相应的 API 请求必须指定
level
查询字符串参数,并按所述设置值此处(取自获取列操作的文档)。
因此,如果我对我的列发出另一个 Get Column 请求(这次在查询字符串中指定
level=2
),我会看到 type
返回的值是 MULTI_PICKLIST
,正如我所期望的那样.
要求:
GET https://api.smartsheet.com/2.0/sheets/2702602705784708/columns/7331855331184516?level=2
回应:
{
"id": 7331855331184516,
"version": 2,
"index": 4,
"title": "multi-select col now",
"type": "MULTI_PICKLIST",
"options": [
"One",
"Two",
"Three"
],
"validation": false,
"width": 150
}