【问题标题】:cannot update row using Smartsheet API无法使用 Smartsheet API 更新行
【发布时间】:2016-04-01 19:26:51
【问题描述】:

我几乎逐字逐句地使用http://smartsheet-platform.github.io/api-docs/?python#update-row(s) 的 Python 示例。不同之处在于我只更新一行中的一个单元格。我可以看到变量 row_a 中的值发生了变化,但该行在 Smartsheet 本身中没有得到更新。

这是我的代码,与 API 指南中发布的代码几乎相同:

row_a = smartsheet.Sheets.get_row(sheetId, 916467282667396)
cell_a = row_a.get_column(5937660066850692)
cell_a.value = 'new value'
row_a.set_column(cell_a.column_id, cell_a)
smartsheet.Sheets.update_rows(sheetId, [row_a])

运行此代码后,看到文本“新值”未出现在 Smartsheet 中,我在最后一行前面添加了单词 print 以查看 API 调用返回的内容并这是结果(为了便于阅读,我添加了缩进):

{
    "requestResponse": null, 
    "result": {
        "code": 1062, 
        "name": "InvalidRowLocationError", 
        "recommendation": "Do not retry without fixing the problem.", 
        "shouldRetry": false, 
        "message": "Invalid row location.", 
        "statusCode": 400
    }
}

如何修复 InvalidRowLocationError 并将我的行更新发送到 Smartsheet?

【问题讨论】:

  • 我刚刚使用我自己的工作表和行 ID 运行了您的代码,它对我有用。错误代码是尝试移动行的结果。您是否在代码中的任何位置调用 move_rows
  • 不,我不是要移动一行。我发布的代码是我的所有代码(除了 sheetId 常量的导入和设置)。我完全感到困惑。我在每一行代码之后都放置了打印语句,以验证它是否按照我的预期进行,并且在“update_rows”命令之前一切都按预期运行。我什至用 Postman 手动运行 API 调用,它可以工作。确认 SDK 应该适用于 Python 2.7。
  • 您介意将此问题发送至 api@smartsheet.com 吗?我们的支持团队希望与您合作重现该问题,以便我们可以帮助您重新开始。

标签: smartsheet-api


【解决方案1】:

在 smartsheet-python-sdk 版本 1.0.1 中实际上有两个与 update_rows 相关的错误,但也有一个解决方法。如果您尝试更新单元格缩进的行,则会遇到错误InvalidRowLocationError(请参阅https://github.com/smartsheet-platform/smartsheet-python-sdk/issues/44 的错误描述)。如果您尝试更新一个单元格包含公式、指向其他单元格的链接、系统值或甘特值的行,则会遇到错误 NotEditableViaApiError(请参阅 https://github.com/smartsheet-platform/smartsheet-python-sdk/issues/42 的错误描述)。

无论您尝试更新行中的哪个单元格,都会出现这些错误,因为 smartsheet-python-sdk 会更新整行。重要的是要注意 API 有效。所以解决方法是使用 Python requests 模块来执行实际更新,如下所示:

import requests
url = "https://api.smartsheet.com/2.0/sheets/SHEETID/rows"
payload = "{\"id\": 6436521654937476, \"cells\": [{\"columnId\": 8276294740797316,\"value\": \"new value\"}]}" 
# headers omitted from here for privacy
headers = { YYYYYYYYYYYYYYYYYYYYY }
response = requests.request("PUT", url, data=payload, headers=headers)
print(response.text)

在上面的示例中,有效负载仅包含我要更新的一个单元格,而不是整行。更易读的有效载荷版本是(只有一个单元格的行对象):

{
  "id": 6436521654937476,
  "cells": [
    {
      "columnId": 8276294740797316,
      "value": "new value"
    }
  ]
}

【讨论】:

    【解决方案2】:

    这里的实际问题是请求要求您使用 PUT 而不是 POST。 见:http://smartsheet-platform.github.io/api-docs/?shell#update-row(s)

    【讨论】:

    • 原始问题与使用 smartsheet-python-sdk 有关。在使用 Python SDK 时,PUT 和 POST 之类的东西是从用户那里抽象出来的,用户会调用一个方法。
    【解决方案3】:

    我找到了一种仍然使用 sdk 的方法,同时只更新一行中的某些单元格,其中给定的行有公式和阻止与 NotEditableViaApiError 相关的 api 更新的东西。

    for row in sheet.rows:
        cell = row.get_column(column_id)
        cell.value = 'modified cell value'  # edit the cell locally
    
        # gather more cells and add to list of cells for row...
    
        # remove all cells in row and just add back the single cell or list of cells
        row.cells = [cell]
        print my_sheets.update_rows(sheet_id, [row])  # update sheet
    

    对于我来说,每行仍然有一个 api 调用才能让事情正常工作,但至少有一种方法可以解决仅更新给定行的某些单元格的问题。此调用只会更新行列表中的单元格,而不会影响其他单元格。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多