SharePointでワークフローを作成する(リスト作成からFlowまで)

# はじめに
何番煎じですが、SharePointのリストをあまり理解せずに、場当たりでワークフローを作成してみました。その時のメモです。
間違っていたり、もっと良い方法があるなら教えて欲しいです。

# 作成手順
## リストを作成する
ググってみるとワークフローを作成するのはSharePointのリスト+Flowが良い組み合わせのようです。MS Forms+Flowでも出来そうですが、ワークフローのステータスを独自で管理する必要がありそうです。
というわけで、まずはリストから作成してみます。
SharePoint Onlineのサイトコンテンツの「新規」からリストを選択します。
<img width="293" alt="" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/245365/e7d6ab60-cb31-13d5-2be8-396221b4c305.png">
適当に名前を入力して作成します。
<img width="461" alt="" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/245365/0f56213b-a043-2a8d-ff55-e672cd91abba.png">
こんな感じでリストが作成されます。「タイトル」列はデフォルトで作成されるようですが、要らないんですよね。稟議のワークフローだったら必要ですが。
<img width="706" alt="" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/245365/dd7cbba4-311b-6132-1a95-e903bb76a7b1.png">
今回は通勤手当を申請するワークフローを作ってみます。

## リストの設定
画面右上部の歯車マークから「リストの設定」をクリック。
<img width="273" alt="" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/245365/8210e9bf-9d3d-0820-a527-3059302f5c58.png">

### 列の追加
画像のように「列の作成」リンクをクリックすると列を追加する画面が表示されます。多分ここは説明不要かと思います。
<img width="690" alt="" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/245365/aeabcbb9-c0f3-d0aa-bbfb-8ff05e66b008.png">
「タイトル」列ですが、使うことはあんまり無いような気がするんですが、デフォルトでは必須項目になっているので不要である場合は、「タイトル」をクリックすると編集画面になるので、下図のように「この列への情報の入力を必須にする」を「いいえ」にしましょう。
<img width="264" alt="" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/245365/99ecb1e2-e8ad-c06e-9c01-f38c543a3220.png">

列を新規追加する際に「情報の種類」を選べることができます。リストやラジオボタンに出来たりします。後述のFlowでは、選択した文字列をそのまま扱うことができます。
ここで注意したいのは、「複数行テキスト」を選択したときです。「複数行テキスト」を選択すると下図のように「使用可能なテキストの種類を指定してください」を選択できるのですが、要はプレーンテキストかリッチテキストかを選択できます。リッチテキストだとハイパーリンクできたり文字修飾できそうなんですが、実際の値には＜div＞タグが入ってしまいます。
<img width="504" alt="" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/245365/ad1cdd72-de6a-071a-0533-72bc35c41f5a.png">
正直これだと使い勝手が悪いので、「書式なしテキスト」を選択します。リッチテキストと言う割には、リスト表示の際でもHTMLタグが無効になっているので、意味が無いように見えるんですが。

さて、今回は「経路」と「金額」列を追加しました。
<img width="677" alt="" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/245365/24af20c9-4258-cbfd-2aee-c6264a98fd0e.png">
「更新日時」以降はデフォルトの列ですが、そのままにしておきました。今回は「更新者」を申請者、「更新日時」を申請日時として扱います。これらはリストにアイテムを追加した際に自動で値がセットされるので特に設定は不要です。

### リストのビュー
リストは以下のような感じになります。
<img width="631" alt="" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/245365/a4107b0e-b818-24d1-7e2d-07d4535110bf.png">
タイトル列は不要なので非表示にしたいし、更新者列を表示したいのですが、それをするためにはビューを作成します。ただこのビューはいまいち分かっていなくて、ビューは全閲覧者共通のようですが、各個人でビューを自由にカスタマイズ出来てしまいます。なので見せたく無い列も見えてしまうようになってしまいますが、基本的には自分で作成したアイテムしか表示されないので(後述)、見えてしまって良いかなとは思います。

#### ビューの作成
ビューを作成することができます。リストの設定から画面最下部の「ビューの作成」リンクをクリックします。
<img width="280" alt="" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/245365/97a3555c-30ba-0900-4f25-d5f65455e0a9.png">
ビューの種類は4タイプあるようですが、「標準ビュー」を選択します。他のビューはまだ試していないので詳細不明です。
<img width="821" alt="" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/245365/bcb8a3a1-3f52-5686-3150-863d90187173.png">
「標準ビュー」を選択すると、ビューの詳細設定画面が表示されます。
特筆すべき項目は以下の２点。
<img width="1216" alt="" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/245365/f6a5a532-cc7e-8cdc-8cf8-3c558b192dca.png">
「このビューを既定にする」にチェックと「パブリック ビューを作成する」にチェック。そうすると作成したビューが全ユーザのデフォルトのビューになるようです。。。がたまにそうはならない場面があったりします(どの場面かは忘れた)。またビューは自分でも変更できるのでユーザに対してビューを強制することはできなさそうです。他の項目は設定不要かと思います。

### リストのアクセス権限
#### アイテムごとのアクセス権限
まずはアイテムごとの権限を設定します。リストの設定から「詳細設定」リンクをクリックします。
<img width="227" alt="" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/245365/c80dd00f-92cc-9cf4-0417-1c3fd54f73b6.png">
下図のような設定がありますので適宜設定します。
<img width="678" alt="" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/245365/378f0433-8eb1-005b-32be-c1a9628b5b05.png">
「読み取りアクセス件」は他のユーザに自分の申請を見られないように「ユーザー本人が作成したアイテム」に設定します。
「作成/編集のアクセス権」は「ユーザー本人のアイテム」に設定します。「すべてのアイテム」だと他のユーザが作成した申請（アイテム）まで編集出来てしまいそうです。
なお、このサイトの管理者は上記設定に関わらず全ユーザのアイテムが見えてしまうようです。

#### リストのアクセス権限
上記のアイテムごとのアクセス権限を設定しても、サイトの設定でサイトに対しての編集権限が無いと、リストに新しいアイテムを投稿すらできません。
今回作成した通勤手当申請用のリストはそれ用のサイトを作成したわけではなく、いわゆる総務部以外は閲覧権しか持っていない既存のサイトに作成しました。基本的にサイト配下に作成したリストやらドキュメントは上位のアクセス権限を継承するので、今回作成した通勤手当申請リストは総務部以外は閲覧権限のみ付与されている状態で、アイテムを追加できませんでした（つまり「新規」ボタンが表示されない）。
今回はこのリストだけの権限設定をすることとします。この申請用のサイトを作れば個別の権限設定は不要だと思いますが、申請書ごとにサイトを作成するのは現実的ではないので。

いつも通り、リストの設定から「このリストに対する権限」をクリックします。
<img width="600" alt="" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/245365/3b607f7c-81f2-5532-2114-885ba002e4fa.png">
権限設定の画面が表示されるので、左上の「権限の継承を中止」ボタンを押下すると、独自の設定ができるようになります。ただ、権限の継承を中止してしまうと、親サイトで変更してもこのリストは影響を受けなくなってしまうのが難点です。
![](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/245365/61a3a9fb-c2d7-d61f-1ebc-a88b97e9bafd.png)
権限の継承を中止した後に、変更したい権限にチェックして「ユーザ権限の編集」をクリックします。今回は「閲覧者」に対して権限を追加するので、「閲覧者」にチェックしてボタンをクリックします。
<img width="307" alt="" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/245365/ae25d4ff-4a2a-ae42-9494-6fa7eef7efc2.png">
今回はこのリストに対して投稿させるだけで良いので、「投稿」にチェックします。
<img width="720" alt="" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/245365/fe32306f-4a83-2b5f-9f31-620d7e4517cc.png">
本当はドキュメントの編集とかもさせたくないんですけどね。細かい権限設定は出来ないようです。

以上で、
- アイテムは投稿できるが、他のユーザが投稿したアイテムは参照できない
- サイト管理者は全投稿を参照ができる
- サイトの他ドキュメントの権限は親サイトの権限のまま
- このリストの権限は独自設定で、親サイトの権限設定に影響されない
　- これは逆に欠点にもなる
ということになります。

### 他のリストの設定
他にも設定が必要です。
#### 承認の設定
[リストの設定]-[バージョン設定]をクリック
<img width="593" alt="" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/245365/e689627c-6a56-155f-c94c-ac9b351681a6.png">
後述しますが、FlowでApprovalを使う際は設定が不要な気がしますが、例えば今回の通勤手当の申請は課長職であれば承認フローは走らせない、としました。この場合、Flowでそのアイテムに対して「承認」状態にしようとしたのですが、出来ませんでした。必ずApprovalを実行させないといけないようです。
Approvalを実行させたくないとき上記を「はい」にしておけば、Approvalを実行させなくても承認ステータスを変更出来るようです。
#### クイック編集
[リストの設定]-[詳細設定]をクリック
クイック編集は複数件投稿する際にExcelのセル感覚で入力できる機能です。
今回は一度に複数件投稿する必要が無い、投稿時に入力例を表示したかったので無効にしておきます。
<img width="639" alt="" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/245365/e0c52ccd-e19f-7116-65b2-cf0cb50220e5.png">

### 新規アイテム投稿時のフォームカスタマイズ(PowerAppsで)
次に新規アイテムを新規に投稿する場合は「新規」ボタン押下で右側にフォームが表示され、そのフォームで入力します。
<img width="604" alt="" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/245365/2ea05be2-fa9e-14c8-167f-186d5c0e9e7d.png">
デフォルトの状態だと全項目となぜか添付ファイルを付けられるようになっています。このフォームはPowerAppsでカスタマイズすることができます。フォームのヘッダーの「PowerAppsでカスタマイズ」するをクリックすると、PowerAppsが起動します。※初回起動時は時間がかかります。

起動が完了すると下図のような画面が表示されます。VBライクでフォームを編集できます。
<img width="1435" alt="" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/245365/af3522ee-7cc7-a38b-5c2d-976b6a8a2d11.png">

タイトルと添付ファイルは不要なので消しちゃいます。消し方はクリックして削除です。特別な操作は不要です。
<img width="312" alt="" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/245365/91195a18-b229-7802-9a6d-39ffe9a985c9.png">
それほどカスタマイズする必要はないのですが、入力エリアにヒントの文字を入れておきます。
ヒント文字を入れたいエディットをクリックすると、右側にプロパティが表示されます。
<img width="872" alt="" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/245365/ca382392-20f9-657c-77b2-7b7cc0238f3f.png">
そのプロパティの「詳細設定」タブをクリック。下図のようにプロパティ操作のためにロックを解除します。鍵をクリックするだけです。
<img width="317" alt="" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/245365/c5cba5f2-a7de-cce1-c782-ef10c7370b35.png">
少し下の「データ」の項目に「HintText」があるので、そこがヒント文字を設定する部分です。ダブルクォートで表示したい文字を囲む必要があるようです。
<img width="307" alt="" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/245365/c132f402-f6b0-f09f-0308-386a9eeb05e8.png">
これ以外にもテキストエリアのサイズを変更したり、入力例を追加したりなど適当にやってください。
編集が終わったら、画面左上の「SharePointに戻る」をクリックします。
はい、変わりました。
<img width="429" alt="" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/245365/312acdf7-c416-6692-9cf4-67e3d6a822a1.png">
以上で、リストで行う作業は終了です。お疲れ様でした。次はFlowを使ってワークフローを作成します。

## ワークフロー作成(Flowで)
SharePointのリストにもワークフローは出来るようですが、よくわからないのでFlowを使うことにします。
リストのヘッダーの「Flow」をクリックして「フローの作成」をクリック
<img width="654" alt="" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/245365/0b7c75a6-9ad5-8147-d096-521ec4495112.png">
そうするとFlowのテンプレートが表示されます。ここは「新しいアイテムが追加されたときに承認を開始する」を選択しましょう。
<img width="337" alt="" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/245365/92fe7c0c-0e44-918c-6df6-aa81c4ce50a7.png">
下図のような画面になります。画面下部の「続行」をクリックします。このタイミングでOffice365の認証が走るかもしれません。そのときは普通に認証してください。
<img width="797" alt="" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/245365/d5e1f211-b590-eaad-8905-a2e9c2b14f34.png">

テンプレートよりフローが作成されています。非常に便利です。
![](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/245365/6d465bc7-5ac7-52ff-5c26-af0d536a61c2.png)

もちろんカスタマイズは必要です。

### ワークフローの概要
改めて今回作成したワークフローの概要です。
<dl>
  <dt>一般社員が申請した場合</dt>
  <dd>申請後、上司に対してApprovalを実行。</dd>
  <dd>却下の場合はやりなおし。</dd>
  <dd>承認の場合は、総務へ申請内容をメールで送信。</dd>
  <dt>管理職が申請した場合</dt>
  <dd>申請後、総務へ申請内容をメールで送信。</dd>
</dl>
一般社員の場合も管理職が申請した場合も、申請内容をとあるExcelに追記するようにもしました。リストは申請後、一般社員が自由に削除できてしまい、削除されてしまうと過去の履歴が見れなくなってしまうからです。

### 作成したFlow
作成したワークフローをスクリーンショットを貼りながら簡単に説明します。
#### トリガー
トリガーの部分。これはテンプレートのまま。
![](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/245365/d5c4e905-2467-4420-81ba-acea231914cc.png)

#### Get Item
![](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/245365/c8b8dfe3-4b0b-2732-5292-615f0733fe86.png)
追加されたアイテムを取得するためのアクション。これもテンプレートのまま。ここで取得したアイテムの各種値は、以降のアクションで使用することができます。

#### タイムゾーンの変換
<img width="612" alt="" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/245365/26e82f13-0cbe-5e5c-8c33-0d873d99f394.png">
Flowで使用される日時はUTCなので、そのまま使うのは微妙です。なので、タイムゾーンを変換して
さらに日時のフォーマットを変更します。ここは上のGet Itemで取得した更新日時を変換しています。あとアクション名も分かりやすいように変更しておきます。
これらは↓のサイトを参考にさせていただきました。
[もくだいさんのOffice365至高のレシピ Flow で扱う時刻を日本時間に変換したい](https://mokudai.jp/knowledge-base/microsoft-flow/flow-convert-time-utc2japantime/)

#### ユーザの取得
<img width="600" alt="" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/245365/5514c5bd-bd54-1cc6-be35-80e0698836f5.png">
Get Itemで取得した更新者Email(=申請者のEMail)から申請者の情報を取得します。これは申請者の役職を取得するためです。

#### 役職で分岐
![](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/245365/dc8e6c92-0207-644d-24d8-8784d097a46b.png)
役職で分岐します。今回は一般社員の場合は「はい」で、一般社員以外は「いいえ」に分岐します。※余談ですが、弊社の場合、一般社員の役職はいくつかあるので、その役職を条件にいれて「または」にしています。

#### Get Manager
<img width="602" alt="スクリーンショット 2019-08-27 17.49.23.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/245365/7380357a-7201-1c98-6ebe-c54bf0e70ed4.png">
まずは、「はい」の一般社員の場合の流れです。
ここでは、ユーザの取得で取得した「メール」を使用しています。Get Itemの更新者Emailでも良いと思います。
なお、上司を設定するにはAzureADで設定できますが、PowerShellでも設定できます。詳細は拙著をみてください。
[PowerShellで上司を設定する](https://qiita.com/fukasuke/items/8a2b55e17f73c2cc5b94)

#### Approval
<img width="611" alt="" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/245365/26da7207-0f24-b0b5-37b2-da4c405516bc.png">
やっとApprovalです。基本はテンプレートで、Titleだけ変更しました。その後のアクションの承認判定処理もテンプレートのままです。

#### 承認後のステータス変更
![](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/245365/d1391f29-be95-e86e-8425-a584e01a3903.png)
承認後（却下も）、自動で承認のステータスを設定してくれるわけではなさそうです。アクションを追加して承認ステータスを変更してあげる必要がありそうです。操作に承認であれば「Approve」、却下であれば「Reject」を設定します。これでSharePointのリストのアイテムの値が設定されます。

#### タイムゾーンの変換(その２)
<img width="607" alt="" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/245365/e58e0b1e-d652-c859-e369-4fbc32d74b14.png">
このあとのメールで承認日時を入れたいので変換しておきます。変換する対象はApprovalの「Response date」です。これが承認（または却下）した日時のようです。

#### Excelの表に行を追加
![](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/245365/0c60fdfa-973f-4458-d45c-811889bb6cb3.png)
前述のとおりExcelにも申請内容を転記しておきます。転記先のExcelと表は予め用意しておきます。サイトは任意のサイトでいけます。表に列を追加した場合でも後から変更可能なので便利です。
なお、「通勤方法」ですが、リストのフォームではセレクトボックスで選択するようにしていたのですが、Get Itemで取得出来る値のうち、「〇〇Value」の方を指定しないと値が取れませんでした。

#### メール送信
![](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/245365/0960e125-ce5b-40e3-b3e7-337b720df5a6.png)
最後にメールを送信します。宛先は総務、CCに申請者と承認者を入れています。本文の黒塗りつぶし部分は社内用の文言です。
申請日時、承認日時はそれぞれ変換した日時を設定しています。申請内容の「アイテムへのリンク」はリストのアイテムを参照できるURLです。差出人はnotification@・・・という送信専用のアドレスを指定しています。これについては後述。

##### 送信専用アドレス(っぽいやつ)
上記のメール送信の差出人ですが、何も設定しないと、このFlowの作成者のアドレスになってしまいます。これを送信専用のアドレスに変更します。
今回は「共有メールボックス」を利用することとします。Office365の管理センターの「グループ」から「共有メールボックス」を作成します（もちろんExchange管理センターから追加でもOK)。
作成後、Exchange管理センターを表示して、「共有」をクリックして上記で作成した共有メールボックスの編集画面を表示します。
「メールボックスの委任」で「フル アクセス許可」「メールボックス所有者として送信する」に上記Flowの作成者を追加します。もしかしたら「フル アクセス許可」は不要かもしれませんが、調査が面倒なので。これで送信専用アドレスとして利用できます。この設定をしないとFlowで実際に動かした時にメール送信でエラーになってしまいます。

#### 承認：却下の場合
<img width="638" alt="" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/245365/7ae7f9dd-e556-2b90-bdc6-ba2ce6fb3460.png">
細かい設定は割愛しますが、承認ステータスを「却下(Reject)」に変更して、却下された旨のメールを送信者に送信します。却下されたので、Excelには行を追加しません。

#### 管理職の申請
<img width="632" alt="" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/245365/834df8b2-a3f4-9805-a3d3-025c1a97e738.png">
これも詳細は割愛します。管理職の場合は承認フローは走らせないので、強制的に「承認(Approve)」に変更させます。あとは一般社員とほぼ同じ。

#### その他
アクションはコピーすることができます。
<img width="614" alt="" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/245365/a125a0c3-2606-b663-f407-7ee53d9dfdc4.png">
コピーしたいアクションの右上の３点リーダをクリックすると「クリップ・・・」が出るので、それをクリックします。
アクションを追加したいところでクリックして、アクションを追加するところで、
<img width="601" alt="" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/245365/e2602d03-5533-cd95-57d7-e0f370459a22.png">
「自分のクリップボード」にコピーしたアクションが表示されます。※これを書きながら気づきましたが、コピペの仕方は書いてありましたね。勿体無いので残しておきます。

# まとめ
だいぶ長くなりましたが、夜な夜な書き続けてようやく書き終わりました。
FlowについてはPG経験者なら簡単にできるはずです。むしろSharePointのリストの方の挙動の調査が時間がかかりました。
今回は通勤手当の申請で、そんなに申請されることはないのでデータ数はそれほど多くなりませんが、データ件数が多くなるとSharePointではきついと思います。何かしらのDBなどにデータを格納した方が良いと思います。Flowのアクションは豊富なので、だいたいのことが出来ると思います。
本当はPowerApps Portalでやりたかったんですけどね。次回はその記事を書きたいと思います。
おしまい。