如何在 Smartsheet Python SDK 中使用搜索结果?

How to use result of search in Smartsheet Python SDK?

启动程序后

results = smart.Search.search("2244113312180")
print(results)

获取数据

{"results": 
[{"contextData": ["2244113312180"], 
"objectId": 778251154810756, 
"objectType": "row", 
"parentObjectId": 3648397300262788,
 "parentObjectName": "Sample Sheet", 
"parentObjectType": "sheet", 
"text": "2244113312180"}, 
{"contextData": ["2244113312180"],
 "objectId": 7803446734415748, 
"objectType": "row", 
"parentObjectId": 3648397300262788, 
"parentObjectName": "Sample Sheet", 
"parentObjectType": "sheet",
"text": "2244113312180"}], 
"totalCount": 2}

如何在我的程序中正确使用它们? 请提供正确的用法示例。

以及如何找到 id_column 中找到值“2244113312180”的值?

new_row = smartsheet.models.Row()

new_row.id = results.objectId

抱歉,我没有立即写下错误。我无法使用结果中的属性。字符串:

new_row.id = results.objectId

导致错误

AttributeError: 'SearchResult' object has no attribute 'objectId'

感谢您的帮助!

P.S。我找到了方法。

results = smart.Search.search("2244113312180")
text = str(results)
json_op = json.loads(text)
for i in json_op["results"]:
    new_row = smartsheet.models.Row()
    new_row.id = i["objectId"]

我不知道这是不是一个好的解决方案。

根据 Smartsheet API 文档中的 SearchResultItem Object 定义,搜索结果项永远不会包含有关值所在列的信息。结果 JSON 您 posted 显示,如果在 sheet 的行中找到指定值(即在该行包含的任何单元格中),则相应的搜索结果项将标识 sheet ID (parentObjectId) 和行 ID (objectId)。

然后您可以使用这两个值来检索行,如文档的 Get Row 部分所述:

row = smartsheet_client.Sheets.get_row(
  4583173393803140,       # sheet_id 
  2361756178769796       # row_id 
)

然后您可以遍历 row.cells 数组,检查每个单元格的 value 属性 以确定它是否与您之前搜索的值匹配。当您找到包含该值的 cell 对象时,该 cell 对象的 column_id 属性 将为您提供匹配值所在的列 ID。

更新:

感谢您澄清原始 post 中的信息。我正在更新此答案以提供一个完整的代码示例,该示例实现了我之前描述的方法。希望这对您有所帮助!

此代码示例执行以下操作:

  • 搜索 Smartsheet 中的所有内容(正在使用的 API 令牌的持有者可以访问)字符串值
  • 遍历搜索结果项以处理任何“行”结果(即字符串出现在 sheet 的单元格中的任何位置)
  • 用字符串 new value
  • 替换 sheet(的单元格)中的任何匹配项
# set search criteria
query = '2244113312180'

# search everything 
search_results = smart.Search.search(query)

# loop through results 
# (acting upon only search results that appear within a row of a sheet)
for item in search_results.results:
    if item.object_type == 'row':
        # get row
        row = smart.Sheets.get_row(
            item.parent_object_id,       # sheet_id 
            item.object_id               # row_id
        )

        # find the cell that contains the value and update that cell value 
        for cell in row.cells:
            if cell.value == query:
                # build new cell value
                new_cell = smartsheet.models.Cell()
                new_cell.column_id = cell.column_id
                new_cell.value = "new value"
                new_cell.strict = False

                # build the row to update
                new_row = smartsheet.models.Row()
                new_row.id = item.object_id
                new_row.cells.append(new_cell)

                # update row
                result = smart.Sheets.update_rows(
                    item.parent_object_id,      # sheet_id
                    [new_row])