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

[ブログからの転載](http://1bed.allright.life/?p=2710)

## 経緯

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

## 環境

### クライアント環境

* Windows 10 Pro
* PowerShell 5.1.17134.165

### SharePoint Online 環境

* Site URL: https://&lt;tenant>.sharepoint.com/sites/example
* リスト名: SyncBase

| 列名 | 内部列名 | 列のタイプ |
| --- | --- | --- |
| タイトル | Title | 1行テキスト |
| コメント | Comment | 1行テキスト |


## コード

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

```powershell
[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 = 'miyamiya@example.com';
# パスワード
$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 のインスタンスを生成、設定します

```powershell
# 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 とか使うより、個人的にはコードで設定したほうが分かりやすいと思う

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

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

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

取得した件数を確認

```powershell
PS > $changeItems.Count
0
```

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

[![](https://1bed.allright.life/wp-content/uploads/2018/07/1-300x161.png)](https://1bed.allright.life/wp-content/uploads/2018/07/1.png)

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

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

取得されたアイテム情報

```powershell
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 に絞って取り直してみる。

```powershell
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 に絞って取り直してみる。

```powershell
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
```

今回はこれでおしまい！


## 参考

* [Query SharePoint change log with ChangeQuery and ChangeToken](https://docs.microsoft.com/en-us/sharepoint/dev/solution-guidance/query-sharepoint-change-log-with-changequery-and-changetoken)
* [SP.ChangeQuery object](https://msdn.microsoft.com/en-us/library/office/jj245254.aspx)