Qiita Teams that are logged in
You are not logged in to any team

Log in to Qiita Team
Community
OrganizationEventAdvent CalendarQiitadon (β)
Service
Qiita JobsQiita ZineQiita Blog
7
Help us understand the problem. What are the problem?

More than 1 year has passed since last update.

posted at

updated at

Organization

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

本記事は

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

まず最初に・・・

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

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

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

つまりは・・・

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

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

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

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

検索用の変数

以下のようにします。

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

サイトIDを取得する

GetSPSSiteID

# サイト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の取得結果

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を取得する

GetSPSListID
# 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の取得結果

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": "xxx@xxx.com",
                    "id": "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxx",
                    "displayName": "テストユーザ"
                }
            },
            "lastModifiedBy": {
                "user": {
                    "email": "xxx@xxx.com",
                    "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を取得する

GetSPSRecordID
# 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の取得結果

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": "xxx@xxx.com",
                    "id": "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxx",
                    "displayName": "テストユーザ"
                }
            },
            "lastModifiedBy": {
                "user": {
                    "displayName": "SharePoint アプリ"
                }
            },
            "parentReference": {},
            "contentType": {
                "id": "0x01003F9D3A2ADE72BA4BBEA8AB7FCD7ECD6D"
            },
            "fields@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/$entity",
            "fields": {
                "@odata.etag": "\"xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxx,48752\"",
                "Product": "PiSensor",
                "id": "2"
            }
        }
    ]
}

ここで詰まったところ

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

まとめ

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

Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
7
Help us understand the problem. What are the problem?