PythonでSharePointの特定サイトの特定リストの特定レコードのURLを取得する方法

公開日:2019-02-19
最終更新:2019-02-19
※この記事は外部サイト(https://qiita.com/rnakamuramartiny/items/d...)からのクロス投稿です

本記事は

この記事の番外編になります。
PowerApps でセンサーデータの値を取得してみた!(ソースもあるよ!)

まず最初に・・・

SharePointのレコードデータを取得するためにはどうするのか?


このようなURL構造にして
メソッドによって処理を変えます。

  • Get:レコードのデータを取得
  • Patch:レコードを更新
  • Delete:レコードを削除

つまりは・・・

以下の手順を踏んでいけば、このURLパスが完成することになります。

  1. サイト名を元に検索して、サイトIDを取得する
  2. 取得したサイトIDからリスト名を元に検索してリストIDを取得する
  3. 取得したサイトID及びリストIDから検索するレコードの特定カラムの文字列を検索してレコードIDを取得する

検索に必要なデータは予め変数として格納しておきます。

では取得していきましょう。

検索用の変数

以下のようにします。

変数名 用途
SPS_SiteName 検索するサイト名称
SPS_ListName 検索するリスト名称
SPS_SearchColumn 検索対象のリスト列名
SPS_SearchRecord 検索文言

サイトIDを取得する


# サイトIDを取得するためのURLを生成する。  
SiteGet_URL = 'https://graph.microsoft.com/v1.0/sites?search=' \  
            + SPS_SiteName  

# Microsoft Graphを実行し、その結果をres1に格納する。  
res1 = requests.get(  
                SiteGet_URL,  
                headers=headers  
            )  
# requrest処理をクローズする  
res1.close  

# res1をjsonファイルに整形  
res1json    = res1.json()  

# 結果からSiteIDを取得する。  
SiteID = res1json['value'][0]['id']

res1jsonの取得結果

{  
    "@odata.context": "https://graph.microsoft.com/v1.0/$metadata#sites",  
    "value": [  
        {  
            "createdDateTime": "2018-06-08T01:54:26Z",  
            "id": "xxxxxxxx.sharepoint.com,xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxx,xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxx",  
            "lastModifiedDateTime": "2018-05-23T19:38:15Z",  
            "name": "testsite",  
            "webUrl": "https://xxxxxxxx.sharepoint.com/sites/zzzzzzzzzzzzzzzzzzzz",  
            "displayName": "テストサイト",  
            "root": {},  
            "siteCollection": {  
                "hostname": "xxxxxxxx.sharepoint.com"  
            }  
        }  
    ]  
}

ここで詰まったところ

[‘value’][‘id’]とすれば値が取得できると思っていました。
ところが、実際に投げたところ、こういうエラーが発生しました。

TypeError: string indices must be integers, not str

調べたところ、リストのインデックスは数値型じゃないとだめとのことです。
というわけで、値取得の方法を以下のように書き換えます。

SiteID = res1json['value'][0]['id']

今回、取得したjsonは1件しかない想定ですので
リストのインデックス番号「0」を付与することで
確実にパラメタを取得することができるようになります。

リストIDを取得する

# ListIDを取得するためのURLを生成する  
ListGet_URL = "https://graph.microsoft.com/v1.0/sites/" + \  
             SiteID + "/lists? + \  
             $filter=displayName eq '" + SPS_ListName + "'"  

# Microsoft Graphを実行し、その結果をres2に格納する。  
res2 = requests.get(  
                ListGet_URL,  
                headers=headers  
            )  

# requrest処理をクローズする  
res2.close  

# res2をjsonファイルに整形  
res2json    = res2.json()  

# 結果からListIDを取得する  
ListID = res2json['value'][0]['id']

res2jsonの取得結果

{  
    "@odata.context": "https://graph.microsoft.com/v1.0/$metadata#sites('xxxxxxxx.sharepoint.com,xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxx,xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxx')/lists",  
    "value": [  
        {  
            "@odata.etag": "\"xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxx,13\"",  
            "createdDateTime": "2019-02-13T12:51:59Z",  
            "description": "",  
            "eTag": "\"xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxx,13\"",  
            "id": "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxx",  
            "lastModifiedDateTime": "2019-02-14T13:16:31Z",  
            "name": "IoT_Data",  
            "webUrl": "https://https://xxxxxxxx.sharepoint.com/sites/zzzzzzzzzzzzzzzzzzzz/Lists/IoT_Data",  
            "displayName": "IoT_Data",  
            "createdBy": {  
                "user": {  
                    "email": "[email protected]",  
                    "id": "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxx",  
                    "displayName": "テストユーザ"  
                }  
            },  
            "lastModifiedBy": {  
                "user": {  
                    "email": "[email protected]",  
                    "id": "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxx",  
                    "displayName": "テストユーザ"  
                }  
            },  
            "parentReference": {},  
            "list": {  
                "contentTypesEnabled": true,  
                "hidden": false,  
                "template": "genericList"  
            }  
        }  
    ]  
}

ここで詰まったところ

文字列をシングルクォート(‘)で囲っていたため
検索文字列をダブルクォート(“)で囲うようにしてましたが
それだとエラーになったため
URL生成部分はダブルクォートにして以下のように宣言しました。

"https://graph.microsoft.com/v1.0/sites/" + \  
             SiteID + "/lists? + \  
             $filter=displayName eq '" + SPS_ListName + "'"

レコードIDを取得する

# RecoardIDを取得するためのURLを生成する  
RecordGet_URL   = "https://graph.microsoft.com/v1.0/sites/" + \  
                        SiteID + "/lists/" + ListID + \  
                        "/items?expand= + \  
                        fields(select=Id," + SPS_SearchColumn + \  
                        ")&filter=fields/" + SPS_SearchColumn + " eq '" + \  
                        SPS_SearchRecord + "'"  

# Microsoft Graphを実行し、その結果をres3に格納する。  
res3 = requests.get(  
                RecordGet_URL,  
                headers=headers  
            )  

# requrest処理をクローズする  
res3.close  

# res3をjsonファイルに整形  
res3json   = res3.json()  

# 結果からRecordIDを取得する  
RecordID   = res3json['value'][0]['id']

res3jsonの取得結果

{  
    "@odata.context": "https://graph.microsoft.com/v1.0/$metadata#sites('xxxxxxxx.sharepoint.com,xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxx,xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxx')/lists('xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxx')/items",  
    "value": [  
        {  
            "@odata.etag": "\"xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxx,48752\"",  
            "createdDateTime": "2019-02-14T13:16:31Z",  
            "eTag": "\"xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxx\"",  
            "id": "2",  
            "lastModifiedDateTime": "2019-02-18T13:12:05Z",  
            "webUrl": "https://https://xxxxxxxx.sharepoint.com/sites/zzzzzzzzzzzzzzzzzzzz/Lists/IoT_Data/2_.000",  
            "createdBy": {  
                "user": {  
                    "email": "[email protected]",  
                    "id": "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxx",  
                    "displayName": "テストユーザ"  
                }  
            },  
            "lastModifiedBy": {  
                "user": {  
                    "displayName": "SharePoint アプリ"  
                }  
            },  
            "parentReference": {},  
            "contentType": {  
                "id": "0x01003F9D3A2ADE72BA4BBEA8AB7FCD7ECD6D"  
            },  
            "[email protected]": "https://graph.microsoft.com/v1.0/$metadata#sites('xxxxxxxx.sharepoint.com,xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxx,xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxx')/lists('xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxx')/items/$entity",  
            "fields": {  
                "@odata.etag": "\"xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxx,48752\"",  
                "Product": "PiSensor",  
                "id": "2"  
            }  
        }  
    ]  
}

ここで詰まったところ

検索クエリ部分ですね。
ここは試行錯誤するしかなかったです。
field で検索対象のリストからIDと検索対象のカラム名を指定し
filter関数で検索対象のカラム名のデータが何か?という指定をしています。

まとめ

いかがだったでしょうか?
実運用で使用する場合は、やはりある程度変数化する必要があります。
今回、それを試していく中で、Microsoft Graph SharePoint の特性がちょっとわかった気がします。
みなさんのOffice365ライフで何かの足しになれば幸いです。

記事が少しでもいいなと思ったらクラップを送ってみよう!
18
+1
@cHFbegNF3xXnRYyBの技術ブログ

よく一緒に読まれている記事

0件のコメント

ブログ開設 or ログイン してコメントを送ってみよう
目次をみる

技術ブログをはじめよう

Qrunch(クランチ)は、ITエンジニアリングに携わる全ての人のための技術ブログプラットフォームです。

技術ブログを開設する

Qrunchでアウトプットをはじめよう

Qrunch(クランチ)は、ITエンジニアリングに携わる全ての人のための技術ブログプラットフォームです。

Markdownで書ける

ログ機能でアウトプットを加速

デザインのカスタマイズが可能

技術ブログ開設

ここから先はアカウント(ブログ)開設が必要です

英数字4文字以上
.qrunch.io
英数字6文字以上
ログインする