SharePoint Online でアイテムの更新状況を取得する(ChangeQuery)

2020/04/18

経緯

SharePoint Online のあるリストから、定期的に更新情報を取得して別のストレージに保存するというのをやったので、その時使った ChangeQuery についてメモ。

環境

クライアント環境

  • Windows 10 Pro
  • PowerShell 5.1.17134.165

SharePoint Online 環境

コード

まずは、いつもの SharePoint Online へログインまでです。

[void][System.Reflection.Assembly]::LoadWithPartialName("Microsoft.SharePoint.Client")
[void][System.Reflection.Assembly]::LoadWithPartialName("Microsoft.SharePoint.Client.Runtime")

# SharePoint Online の URL
$siteUrl = 'https://<tenant>.sharepoint.com/sites/example'
# ユーザー名
$user = '[email protected]';
# パスワード
$secure = Read-Host -Prompt "Enter the password for ${user}(Office365)" -AsSecureString;
# SharePoint Online 認証情報
$credentials = New-Object Microsoft.SharePoint.Client.SharePointOnlineCredentials($user, $secure);
# SharePoint Client Context インスタンスを生成
$ctx = New-Object Microsoft.SharePoint.Client.ClientContext($siteURL)
$ctx.Credentials = $credentials

次に ChangeQuery のインスタンスを生成、設定します

# ChangeQueryの定義
$cq = [Microsoft.SharePoint.Client.ChangeQuery]::new($false, $false)
$cq.Item = $true          # アイテムの更新が対象
$cq.Add = $true           # 追加したアイテム情報が対象
$cq.Update = $true        # 修正したアイテム情報が対象
$cq.DeleteObject = $true  # 削除したアイテム情報が対象

ChangeQeury インスタンスを生成する時の引数は以下の通り

new(allChangeObjectTypes:boolean, allChangeTypes:boolean)

ALL とか使うより、個人的にはコードで設定したほうが分かりやすいと思う

あとはリストからアイテムを取得するだけ

# 対象リスト
$list = $ctx.Web.Lists.GetByTitle('SyncBase')

# 対象リストから更新のあったアイテムを取得
$changeItems = $list.GetChanges($cq)
$ctx.Load($changeItems)
$ctx.ExecuteQuery()

取得した件数を確認

PS > $changeItems.Count
0

とりあえず 0 件
リスト SyncBase アイテムを追加する

その後、もう一度データの取得処理をしてみる

$changeItems = $list.GetChanges($cq)
$ctx.Load($changeItems)
$ctx.ExecuteQuery()
PS > $changeItems.Count
1

取得されたアイテム情報

PS > $changeItems

ActivityType         : 
ContentTypeId        : 
Editor               : 
EditorEmailHint      : 
EditorLoginName      : 
FileSystemObjectType : 
FileType             : 
Hashtag              : 
Hidden               : 
ItemId               : 1
ListId               : xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx
ListTemplate         : 
ListTitle            : 
ServerRelativeUrl    : 
SharedByUser         : 
SharedWithUsers      : 
Title                : 
WebId                : xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx
ChangeToken          : Microsoft.SharePoint.Client.ChangeToken
ChangeType           : Add
RelativeTime         : 
SiteId               : xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx
Time                 : 2018/07/21 11:24:50
Context              : Microsoft.SharePoint.Client.ClientContext
Tag                  : 
Path                 : 
ObjectVersion        : 
ServerObjectIsNull   : False
TypedObject          : Microsoft.SharePoint.Client.ChangeItem

ItemId と ChangeType が Add で取得できているのがわかる

次に編集して、ItemId, ChageType, Time に絞って取り直してみる。

PS > $changeItems | Select-Object ItemId, ChangeType, Time

ItemId ChangeType Time               
------ ---------- ----               
     1        Add 2018/07/21 11:24:50
     1     Update 2018/07/21 12:15:46

最後に削除して、ItemId, ChageType, Time に絞って取り直してみる。

PS > $changeItems | Select-Object ItemId, ChangeType, Time

ItemId   ChangeType Time               
------   ---------- ----               
     1          Add 2018/07/21 11:24:50
     1       Update 2018/07/21 12:15:46
     1 DeleteObject 2018/07/21 12:26:23

今回はこれでおしまい!

参考