M365関連 プログラム 技術

SharePoint RestAPIをPowerShellから呼び出す

以前、C#にてSharePoint RestAPIを使用する方法について書きました。その際は、読み込みしかできませんでした
今回は、Azureアプリのクライアントシークレットキーを使用してリストアイテムの作成や削除ができるようになっています
また、Azureアプリの作成については、今回は記載しません。Azureアプリの権限は作成と削除ができるように【Sites.ReadWrite.All】を付与しています

前回の記事
SharePointRestAPIを使ってみる - ナストンのまとめ
SharePointRestAPIを使ってみる - ナストンのまとめ

SharePointに対して、これまでCSOMやPowerShellのPnPコマンド等を使っていましたがRestAPIは ...

記事へ

名称バージョン
PowerShell7.5.0

アクセストークンの取得

まず初めにRestAPIで使用する認証トークンを取得します

# SharePointサイトのURL
$spoAdminUrl = "SPOテナントAdminURL"
$tenantId = "使用するAzureアプリが存在するテナントID"
$clientId = "使用するAzureアプリのクライアントID"
$clientSecret = "使用するAzureアプリ上のクライアントシークレットの値"
# ユーザー資格情報(二段階認証の設定していないもの。対象サイトのサイトコレクション管理者またはサイトフルコントロールがあるユーザー)
$username = "認証時に使用するユーザーアドレス"
$password = "$usernameのパスワード"

$tokenRequestBody = @{
    grant_type    = "password"
    username      = $username
    password      = $password
    client_id     = $clientId
    client_secret = $clientSecret
    scope         = "$spoAdminUrl/.default"
}

$responseData = Invoke-RestMethod -Uri "https://login.microsoftonline.com/$tenantId/oauth2/v2.0/token" `
                                    -ContentType "application/x-www-form-urlencoded" `
                                    -Method POST -Body $tokenRequestBody

$accessToken = $responseData.access_token
Write-Host "Access Token: $accessToken"

このトークンを用いてRestAPIを呼び出します

リストアイテムの取得

まず初めに、SharePointリストのデータを取得します

$listName = "対象リスト表示名"
$restRequestHeader = @{
    "Authorization" = "Bearer $accessToken"
    "Accept" = "application/json;odata=verbose"
}
$restUrl = "$resourceUrl/_api/web/lists/getbytitle('$listName')/items"
$result = Invoke-WebRequest -Uri $restUrl -Headers $restRequestHeader -Method Get
$jsonResponse = $result.Content | ConvertFrom-Json -AsHashtable

# リストアイテムのフィールド値を出力
$jsonResponse.d.results | ForEach-Object {
    Write-Output "ID: $($_.ID), Title: $($_.Title), Created: $($_.Created)"
}

はまったこと

この際にレスポンスデータからの値の取り出しに苦労しました。調べたところ、以下のサイトが解決の糸口となりました
JSON形式に変換する際に今回の場合ID列が重複したためでした。そのため、【Invoke-RestMethod】コマンドではなく、【Invoke-WebRequest】コマンドを使用し、レスポンスデータを【ConvertFrom-Json -AsHashtable】コマンドを使用して変換する形としています

参考サイト
SharePoint REST APIとPowerShell - kooh-q-hook
SharePoint REST APIとPowerShell - kooh-q-hook

SharePoint の REST API は Accept ヘッダーに "application/json;odata ...

サイトへ

リストアイテムの作成

続いてリストアイテムを登録します

# REST APIリクエストヘッダー
$restRequestHeader = @{
    "Authorization" = "Bearer $accessToken"
    "Accept"        = "application/json;odata=verbose"
    "Content-Type"  = "application/json;odata=verbose"
}
$internalListName = "対象リスト内部名(internal Name)"

# 作成するリストアイテムのデータ
$itemData = @{
    "__metadata"  = @{
        "type" = "SP.Data.$($internalListName)ListItem" # リストの内部名に基づくエンティティタイプ名
    }
    "Title"       = "新しいアイテム01" # 作成するアイテムのフィールド値
} | ConvertTo-Json -Depth 10

$response = Invoke-WebRequest -Uri $restUrl -Headers $restRequestHeader -Method Post -Body $itemData
$jsonResponse = $response.Content | ConvertFrom-Json -AsHashtable
Write-Host "リストアイテムが作成されました: ID = $($jsonResponse.d.ID)"

こちらも先ほどのアイテム取得と同じように【Invoke-WebRequest】コマンドを使用しています

リストアイテムの削除

最後にリストアイテムの削除となります

# REST APIリクエストヘッダー
$restRequestHeader = @{
    "Authorization" = "Bearer $accessToken"
    "Accept"        = "application/json;odata=verbose"
    "IF-MATCH"      = "*" # アイテムのバージョンを指定。'*'はすべてのバージョンを対象
}

# 削除するリストアイテムのID
$itemId = 1 # 削除したいアイテムのIDを指定

# リストアイテムの削除エンドポイント
$deleteUrl = "$resourceUrl/_api/web/lists/getbytitle('$listName')/items($itemId)"
Invoke-RestMethod -Uri $deleteUrl -Headers $restRequestHeader -Method Delete
Write-Host "リストアイテムが削除されました: ID = $itemId"

削除に関しては【Invoke-RestMethod】コマンドでも問題ありません

最後に

前回の記事ではリストアイテムの取得しかできない内容でしたが、今回はリストアイテムの作成と削除ができるようになっています
アクセストークンを取得する際にまさかSPOのAdminURLを使用するとは思いませんでした
これで今後困ることは減るかなと思います

会社紹介

私が所属しているアドバンスド・ソリューション株式会社(以下、ADS)は一緒に働く仲間を募集しています

会社概要
「技術」×「知恵」=顧客課題の解決・新しい価値の創造

この方程式の実現はADSが大切にしている考えで、技術を磨き続けるgeekさと、顧客を思うloveがあってこそ実現できる世界観だと思っています
この『love & geek』の精神さえあれば、得意不得意はno problem!
技術はピカイチだけど顧客折衝はちょっと苦手。OKです。技術はまだ未熟だけど顧客と知恵を出し合って要件定義するのは大好き。OKです
凸凹な社員の集まり、色んなカラーや柄の個性が集まっているからこそ、常に新しいソリューションが生まれています

ミッション
私たちは、テクノロジーを活用し、業務や事業の生産性向上と企業進化を支援します

ホームページ
アドバンスド・ソリューション株式会社|ADS Co., Ltd.
アドバンスド・ソリューション株式会社|ADS Co., Ltd.

Microsoft 365/SharePoint/Power Platform/Azure による DX コンサル・シス ...

サイトへ移動

PR

-M365関連, プログラム, 技術
-, ,