SharePoint で簡易的な掲示板を作ってみる

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

先日、SharePoint のビューにかけるフィルターで動的値を使えることを知りました。

[Me] と [Today] を使うことで、アクセスしたユーザーとアクセスした日をフィルターとして使えます。

[![me_today_example-300x261.png](https://qiita-image-store.s3.amazonaws.com/0/118961/526086ae-69ef-7c9f-7e2c-ef83e860b311.png)](https://qiita-image-store.s3.amazonaws.com/0/118961/707540df-4595-a4b3-6543-a132d27e5317.png)


こちらを使って、ノンプラミングで簡単な掲示板を作ってみようと思いました
※ノンプラミングは無理でした \_(:3｣∠)_

## やりたい事(仕様)

* タイトル、本文、添付ファイルに加えて、掲載期間を指定できる
* 他人の作ったデーターは掲載期間外の時に閲覧不可
* 自分の作ったデーターは掲載期間外でも閲覧可能

## 環境

* サーバー環境
  - SharePoint Online

* クライアント環境
  - Windows 10 Pro
  - PowerShell 5.1

## 用意したリスト

リスト名は *掲示板* にしました。

リストの作成方法は詳しく書きませんが、列の内部名を半角英数字で付けるために、下記表の「列の内部名」で一旦登録して、その後に「列名」に変更しています。

| 列の内部名 | 列名 | 種類 | 必須 |
| --- | --- | --- | :---: |
| body | 本文 | 複数行テキスト | - |
| publish_date | 公開日時 | 日付と時刻 | ◯ |
| limit_date | 掲載期限 | 日付と時刻 | - |

* 公開日時(publish_date)
  [![](https://qiita-image-store.s3.amazonaws.com/0/118961/3a6d4aac-98ab-7214-f531-8b507063e36e.png)](https://qiita-image-store.s3.amazonaws.com/0/118961/3562aed2-aea3-b0e7-9ea2-541f71c3e58c.png)

* 掲載期限(limit_date)
  [![](https://qiita-image-store.s3.amazonaws.com/0/118961/11b9406e-5b71-a094-f9a1-25afbb6f98b4.png)](https://qiita-image-store.s3.amazonaws.com/0/118961/68278568-9fbc-0292-25aa-1419dbfa8c97.png)

## フィルターを作成する

フィルターは既存である「すべてのアイテム」を修正しました。

* 表示
  1. タイトル
  2. 登録者
  3. 公開日時
  4. 掲載期限

* 並び替え
  1. 公開日時、降順
  2. 掲載期限、昇順

* フィルター
  [![](https://qiita-image-store.s3.amazonaws.com/0/118961/9118861d-8bfa-311e-1b23-f0bb4c6453dd.png)](https://qiita-image-store.s3.amazonaws.com/0/118961/6d494cd2-f53f-f813-035f-adb1b6dbe12b.png)

このフィルターで次を実現している(つもり)です。

> (掲載期限 is null and 公開日時 <= 今日) or (掲載日時 >= 今日) or (登録者 = カレントユーザー)


## [Today] の落とし穴

SharePoint をやっている人だと常識なのでしょうが、[Today] は日付しか比較してくれません。[Now] とかは用意されていないようです。なんてイケてないんですか... しぇあぽいんとさんツンツンしすぎですね。

このままだと、*公開日時 2017/05/06 12:00* とした記事が 2017/05/06 00:00 になったら見れてしまいます！ いや、いいんですが折角作ったのに悲しい。

[![](https://qiita-image-store.s3.amazonaws.com/0/118961/a512bba9-49de-85bb-41b2-14a331aabe26.png)](https://qiita-image-store.s3.amazonaws.com/0/118961/394865d5-8484-41c0-59c6-53a7c51594da.png)

そこでぐぐってみると、SharePoint Designer で CAML Query を変更している記事が多いので、そちらを倣って... SharePoint Designer は嫌いなので PowerShell でやることにしました。

## [Today] を時間を見るように設定する

PowerShell を起動して下記を実行します

```ps1
[System.Reflection.Assembly]::LoadWithPartialName("Microsoft.SharePoint.Client") | Out-Null
[System.Reflection.Assembly]::LoadWithPartialName("Microsoft.SharePoint.Client.Runtime") | Out-Null

# 取得する SharePoint Online の URL
$url = 'https://<your tenant>/';

# ユーザー名
$user = '<your account>';

# パスワード
$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 インスタンスを生成
$context = New-Object Microsoft.SharePoint.Client.ClientContext($url)
$context.Credentials = $credentials

# View の取得
$view = $context.Web.Lists.GetByTitle("掲示板").Views.GetByTitle("すべてのアイテム")
$context.Load($view)
$context.ExecuteQuery()

# DateTime 型に時間も含める
$view.ViewQuery = $view.ViewQuery -replace '<Value Type="DateTime">', '<Value Type="DateTime" IncludeTimeValue="True">'

# 保存
$view.update()
$context.Load($view)
$context.ExecuteQuery()

# オブジェクト破棄
$context.Dispose()
```

18 行目まではほぼおまじないです。

21 行目で既存のビュー「すべてのアイテム」を取ってきて、26 行目で `IncludeTimeValue="True"` を付け加えて時間も加える設定をしています。

## 結果

* 登録者 2017/05/06 12:01 過ぎ
  [![](https://qiita-image-store.s3.amazonaws.com/0/118961/6ec8fa51-93d1-5c82-5e84-20264a2ad9b1.png)](https://qiita-image-store.s3.amazonaws.com/0/118961/928bd62f-458c-6498-35a3-878e62f2d83c.png)
  登録者は全部データが見えている

* 別ユーザー 2017/05/06 11:55
  [![](https://qiita-image-store.s3.amazonaws.com/0/118961/2eba1bb8-ef47-b306-a4c2-3cc82474e189.png)](https://qiita-image-store.s3.amazonaws.com/0/118961/411442f9-d161-f374-1a24-175273674eba.png)
  別ユーザーからは 公開日時 ≦ 現在 ≦ 掲載期限 のデーターが見えてる
  ＃公開期限 12:00 のデーター(パターン2 とパターン6)が見える

* 別ユーザー 2017/05/06 12:01 過ぎ
  [![](https://qiita-image-store.s3.amazonaws.com/0/118961/35a373ce-57bc-0664-13c6-661cab1508b1.png)](https://qiita-image-store.s3.amazonaws.com/0/118961/6a8d0400-73ca-1942-72c1-3cc2ed35d3ec.png)
  別ユーザーからは 公開日時 ≦ 現在 ≦ 掲載期限 のデーターが見えてる
  ＃パターン2 とパターン6 のデーターが見えない

## 参考

* [SharePoint 2013 リストビューでの複雑なフィルター条件設定](http://sharepointmaniacs.com/archives/5165)

* [How do I filter by [Today] and time in SharePoint list view ?](http://stackoverflow.com/questions/18362853/how-do-i-filter-by-today-and-time-in-sharepoint-list-view)