【问题标题】:How to use result of search in Smartsheet Python SDK?如何在 Smartsheet Python SDK 中使用搜索结果?
【发布时间】:2021-01-30 21:44:24
【问题描述】:

启动程序后

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}

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

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

new_row = smartsheet.models.Row()

new_row.id = results.objectId

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

new_row.id = results.objectId

导致错误

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

感谢您的帮助!

附:我找到了方法。

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"]

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

【问题讨论】:

  • 我不确定您包含的第二个代码示例(更新工作表的一行中的单元格)与您提出的问题有什么关系。为清楚起见,我建议从您的帖子中删除该代码(如果它不相关)或在您的帖子中添加其他信息,以阐明此代码示例与您寻求的帮助的相关性。
  • 另外,我不清楚您所说的 “我试图插入就地 cmets,但它不正确。” 是什么意思。你能澄清一下吗?
  • 我编辑了这篇文章。现在我希望它变得更加清晰。

标签: python json search smartsheet-api


【解决方案1】:

根据 Smartsheet API 文档中的SearchResultItem Object 定义,搜索结果项永远不会包含有关值所在列的信息。如您发布的 JSON 结果所示,如果在工作表的行中找到指定的值(即,在该行包含的任何单元格中),则相应的搜索结果项将标识工作表 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。

更新:

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

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

  • 在 Smartsheet 中的所有内容(正在使用的 API 令牌的持有者可以访问)中搜索字符串值
  • 遍历搜索结果项以处理任何“行”结果(即字符串出现在工作表单元格内的任何位置)
  • 用字符串new value 替换工作表(的单元格)内的任何匹配项
# 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])

【讨论】:

  • 谢谢,这正是我需要的!
  • 太棒了!乐于助人。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-02-17
  • 1970-01-01
  • 2014-05-02
  • 1970-01-01
  • 2018-06-04
  • 2021-04-29
相关资源
最近更新 更多