PowerShellでリストアイテムを全件取得する

SharePoint

今回はPowerShellを使ってSharePointOnlineのリストアイテムの情報を全件取得する方法とかについて説明していきます(∩´∀`)∩

事前準備

PowerShellのスクリプトを実行する際に必要なSDK等がありますので、その辺のインストール等がまだの方は↓の記事を参考に準備しておいてください(∩´∀`)∩

SharePoint Online Client Component SDK というヤツを使います。

PowerShellからSharePointOnlineを操作する為の準備
今回はPowerShellからSharePoint Onlineを操作するための下準備について説明してみます。 PowerShellによる操作 まずSharePoint OnlineをPowerShellで操作するには2つの方法が用意されて...

リストの取得

接続等行った状態から説明していきます。その辺は記事末尾のサンプルコード内には書いておきますので、そちらも参考にしていただけたらと。

今回は以前作成した ほげほげ(hogehoge)というリストに列を追加します。

で、まずはリストを取得します。

# リスト取得
$list = $Context.Web.Lists.GetByTitle("ほげほげ")
# リストIDが分かっている場合、GetByIdでもOK
# $list = $Context.Web.Lists.GetById("IDの文字列")

GetByTitle か GetByID でリストを取得します。タイトルを使う時は内部名でも表示名でもどちらでもOKです。今回は表示名です。

IDで取得する場合は下記記事の方法などを使うか、PowerShellでなんやかやするなどしてIDを取得しておきます。

SharePointOnlineでリストのIDを取得する
監査ログを見るときや、プログラムからなんやかんやする時に必要になったりするリストID。今回はその取得方法というか、確認方法について簡単に説明してきます~(∩´∀`)∩

CAMLクエリを書いてアイテム取得

次にCAMLクエリを用いてリストアイテムを抽出します。ここで書いたクエリの条件に合致したアイテムの情報が取得できます。

今回は条件による絞込等は無しで全件取得します。アイテム数が多い場合はここで絞込を掛けるのがよさげ。

$query = New-Object Microsoft.SharePoint.Client.CamlQuery
$query.ViewXml=""

# クエリを用いてアイテム取得
$ListItems = $list.GetItems($query)

# 読み込みと実行
$Context.Load($ListItems)
$Context.ExecuteQuery()

$query.ViewXmlに空を入れて投げると全件取得になります。ここに条件を記述したクエリを入れて投げると、その条件に合致したアイテムに絞って取得できます。

これで取得に関しては完了です。

実行してみる

では実際に実行してみます。ただ取得しただけだとどのようなデータが入っているのかわからないので、最後に下記コードを追記して画面上に表示してみます。

foreach($item in $ListItems)
{
    write-host $item.Id $item["Title"]  item.FieldValues["_x65b0__x898f__x306e__x5217_"]  $item.FieldValues["testCol"]
}

今回取得するリストは↓の画像のリストです。IDとタイトル、新規の列、testColの値を表示するコードになっています。

実行結果は↓のようになります。

取得したデータの扱いについて補足

取得したデータは複数レコードがまとまった形ですので、foreach構文などで1件ずつ取り出して扱ってやる必要があります。

また各アイテムの中身を見るときは↓のようにしてアクセスします。

  • ID ⇒ $item.ID
  • タイトルや更新者、更新日時(SPO標準列) ⇒ $item[“Title”] や  $item[“Editor”].LookupValue 、 $item[“Modified”]
  • ユーザーが追加した列 ⇒ $item.FieldValues[“内部列名”]

列によって書き方が変わってくるのでちょっとややこしいですね。

サンプルコード

[System.Reflection.Assembly]::LoadWithPartialName("Microsoft.SharePoint.Client") | Out-Null
[System.Reflection.Assembly]::LoadWithPartialName("Microsoft.SharePoint.Client.Runtime") | Out-Null
 
#接続情報等
$SiteUrl = "https://xxxxx.sharepoint.com/testsite" 
$Account = "administrator@xxxxx.onmicrosoft.com" 
$Password = Read-Host -Prompt "Enter Password." -AsSecureString
 
# Credential作成
$Credential = New-Object Microsoft.SharePoint.Client.SharePointOnlineCredentials($Account, $Password) 
 
# Context作成
$Context = New-Object Microsoft.SharePoint.Client.ClientContext($SiteUrl)
$Context.Credentials = $Credential

# リスト取得
$list = $Context.Web.Lists.GetByTitle("ほげほげ")
# リストIDが分かっている場合、GetByIdでもOK
# $list = $Context.Web.Lists.GetById("IDの文字列")

$query = New-Object Microsoft.SharePoint.Client.CamlQuery
$query.ViewXml=""

# クエリを用いてアイテム取得
$ListItems = $list.GetItems($query)

# 読み込みと実行
$Context.Load($ListItems)
$Context.ExecuteQuery()

foreach($item in $ListItems)
{
    write-host $item.Id $item["Title"] $item.FieldValues["_x65b0__x898f__x306e__x5217_"] $item.FieldValues["testCol"] $item["Editor"].LookupValue $item["Modified"]
}

# 後始末
$Context.Dispose()

コメント

タイトルとURLをコピーしました