Smartsheet MULTI_PICKLIST 变为 TEXT_NUMER,尽管级别为 2

问题描述 投票:0回答:1

我正在尝试使用 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 类型

python smartsheet-api
1个回答
0
投票

首先 - 错误

"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
}
© www.soinside.com 2019 - 2024. All rights reserved.