2016-04-01 22 views
1

私はhttp://smartsheet-platform.github.io/api-docs/?python#update-row(s)でPythonの例をほぼそのまま使用しています。違いは、1つの行で1つのセルしか更新していないことです。変数row_aの値の変化を見ることができますが、行はスマートシート自体で更新されません。ここでスマートシートAPIを使用して行を更新できません

は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]) 

text「の新しい値が」このコードを実行した後にSmartsheetに表示されないことを見て、私が追加しました私はInvalidRowLocationErrorを修正し、私のRを取得できますか

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

:単語APIの呼び出しによって返されると、これが結果ですかを確認するには、最後の行の前に印刷は(私は読みやすくするためにインデントを追加しました)スマートシートに送信される更新はありますか?

+1

私は自分のシートと行IDでコードを実行しました。エラーコードは、行を移動しようとした結果です。あなたのコードで 'move_rows'を呼び出していますか? – stmcallister

+0

いいえ、私は行を移動しようとしていません。私が投稿したコードは、すべてのコードです(sheetId定数のインポートと設定を除く)。私は完全に困惑している。私は、すべてのコード行の後にprint文を置いて、期待通りのことを行っていることを確認し、 "update_rows"コマンドまですべてが期待どおりに動作するようにします。私はPostmanでAPIコールを手動で実行しても動作します。 SDKがPython 2.7で動作することが確認されました。 – doron

+0

この質問を[email protected]に送ってもらえますか?私たちのサポートチームは、問題を再現するためにあなたと協力して、あなたが再び動くのを手助けできるようにしたいと考えています。 – stmcallister

答えて

4

実際にsmartsheet-python-sdkバージョン1.0.1のupdate_rowsに関連する2つのバグがありますが、回避策もあります。セルがインデントされている行を更新しようとするとエラーInvalidRowLocationErrorが発生します(バグの説明はhttps://github.com/smartsheet-platform/smartsheet-python-sdk/issues/44を参照してください)。セルに数式、他のセルへのリンク、システム値、またはGantt値が含まれている行を更新しようとするとエラー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" 
    } 
    ] 
} 
0

ここでの実際の問題は、リクエストがPOSTの代わりにPUT使用する必要がありますということです。 を参照してください:http://smartsheet-platform.github.io/api-docs/?shell#update-row(s)

+0

元の質問はsmartsheet-python-sdkの使用と関係しています。 Python SDKを使用する場合、PUTやPOSTのようなものは、代わりにメソッドを呼び出すユーザから抽象化されます。 – doron

0

私は与えられた行は、式やNotEditableViaApiErrorに関連しているAPIの更新をブロックするものを持って行の特定のセルを更新しながら、まだSDKを使用する方法を見つけました。

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呼び出しは、まだありますが、少なくともだけ与えられた行の特定のセルを更新する問題を回避する方法があります。この呼び出しでは、行のリスト内のセルのみが更新され、他のセルは変更されません。

関連する問題