Microsoft Flowを1年使ってきた中で得た知見

# Microsoft Flowとは
Office365に含まれているIFTTTっぽいサービス。IFTTTがコンシューマ向けから始まって今や様々なサービスや機器とつながっているのとは対照的に、Microsoft FlowはMicrosoft関連やビジネス向けのサービスとの連携から始まっています。
でもMicrosoft関連が接続で優先されるかというとそういうわけでもなく、Office365に含まれるTorelloっぽいサービスであるPlannerよりもTorelloの方が先にコネクタ用意されたし、SlackっぽいサービスであるTeamsよりも先にSlackのコネクタが用意されました。
足りない機能もまだ結構ありますが、ほしい機能はコミュニティでアイデアを投稿して賛同者を募って賛同者の多いタスクが優先的に検討される、良く言えばコミュニティ主導のサービスなので、欲しい機能は[コミュニティサイト](https://powerusers.microsoft.com/t5/Flow-Ideas/idb-p/FlowIdeas)に<font color="red">英語で</font>アイデア投稿して賛同者を募るといいようです。
英語じゃなくてもいいのかもしれませんが、英語でないと賛同を得られにくく、結果的に後回しにされそうな気がします。
あと、アイデア投稿前に同様のアイデアが投稿済みでないかどうかはチェックし、既にある場合はそっちに投票しましょう。
アイデアがバラけると投票数が少なくなってしまうし、進捗が確認しにくくなります。

以下知見を雑多に並べます
特に機能ごとに並べたりはしてないので、使えそうなものを適当に探してください。
##特定のアクションが成功したらその結果を利用し、失敗したら別のデフォルト値を使いたい
標準の設定だとFlowはアクションが成功した場合しか次のアクションに進まず、失敗した場合はフロー自体を失敗として動作停止するようになっています。
ただし、失敗した場合も処理自体は継続したい場合もあると思います。
そんな場合のFlow編集の手順は以下の通り。

###1. 失敗しても処理を継続したいアクションの次に「変数の初期化」アクションを設置し、アクション枠の右上の「・・・」をクリックして「実行条件の構成」をクリックする

![ActionFailed01.png](https://qiita-image-store.s3.amazonaws.com/0/239862/9c2e0061-a2f5-c312-f299-0b63640d1221.png)

###2. 前段のアクションがどうなった場合にこのアクションが実行されるかを設定する画面が表示されるので、標準の成功した場合以外に失敗した場合のところにチェックを入れる

![ActionFailed02.png](https://qiita-image-store.s3.amazonaws.com/0/239862/5a4eba86-ec42-417e-b724-8910ba2d18e1.png)

「に失敗しました」にチェックを入れる

![ActionFailed03.png](https://qiita-image-store.s3.amazonaws.com/0/239862/14ba5b24-dc74-e7ae-e0e7-bd399aaea352.png)

「完了」を押して実行条件の構成画面を閉じる。

###3. 変数名と変数の型を好きなように設定し値の欄に式を入力する
変数名と変数の型は好きなように設定する。今回は型は文字列とし、成功すればOutlook予定表のイベントタイトル、失敗したら「failed」と入るよう式を構成する
変数名と型を決めたら値の欄をクリックすると右にこのアクションより前に実行されたアクションから引っ張ってこれる値が一覧で表示される。表示されない場合は値入力欄の右下に表示される「動的なコンテンツの追加」をクリックすると表示される。

![ActionFailed04.png](https://qiita-image-store.s3.amazonaws.com/0/239862/bd8f4431-8fb6-b006-968e-52fd5d6695c0.png)

表示された枠の上部にある「式」をクリックし、直下の式入力欄に「coalesce」と入力する（上記の画像のように関数名の補完が効く）。
第一引数に前段のアクションの結果から件名を引っ張ってくるために再度画面上部の「動的なコンテンツ」をクリックし、選択可能なパラメータからOutlookカレンダーアクションの「件名」の値を選択する。

![ActionFailed05.png](https://qiita-image-store.s3.amazonaws.com/0/239862/e7737387-3e8f-005f-f9c4-c8452c80789d.png)

前段以前のアクションから引っ張れる値が表示されればその値を選択する。

![ActionFailed06.png](https://qiita-image-store.s3.amazonaws.com/0/239862/372e3434-9687-6b82-dc5a-de5cf0e16535.png)

ここで引っ張ってきたい値が表示されない場合が稀によくあるので、その場合のワークアラウンドを下記に記す。

条件の追加をし、左側の値の入力欄でその値を選択する。

![ActionFailed09.png](https://qiita-image-store.s3.amazonaws.com/0/239862/5741a5c3-6907-05b2-cf09-656f3c786089.png)

次に条件枠の下にある「詳細設定モードで編集」のリンクをクリックする。

![ActionFailed10.png](https://qiita-image-store.s3.amazonaws.com/0/239862/26009047-b0b2-3ca4-71a5-467eec46f216.png)

するとequals関数の第一引数として引っ張りたい値を示す文字列が記載されているのでコピーしてcoalesce関数の第一引数に挿入する。

![ActionFailed11.png](https://qiita-image-store.s3.amazonaws.com/0/239862/4964f8f9-8838-d65e-2c9f-b9f0f4105b30.png)

最後に、coalesce関数の第二引数に失敗時の値(今回は「failed」)を追記して「OK」をクリックする。

![ActionFailed07.png](https://qiita-image-store.s3.amazonaws.com/0/239862/53645c01-2389-8bae-81b2-788643bdacda.png)

固定文字列を記入する場合はシングルクオーテーションで囲うこと。

アクションの失敗時には返ってくる値がnull判定されるようなのでcoalesceの第一引数に設定して、第二引数に失敗時の値を設定しておけば成否判定に使える。
ちなみに、2018年2月現在、coalesce関数は式の一覧からは選択できません。FlowサービスのベースになっているLogicAppsサービスで使える関数らしく、LogicAppsサービスで使える関数は基本的にFlowでも使えるっポイです。ほかにも便利な関数あったら教えてください。

##時刻がおかしい
これは結構いろんな理由がありますが、Flow内で取得する時間(「日付と時刻」コネクタのアクション)は基本的にUTCなので、都度タイムゾーンの変換を行う必要があります。
ほかのコネクタに関してはコネクタ側から渡される値によって様々ですが、Sharepointコネクタでリストから日時カラムの値をとってくる場合などば、Sharepointサイトのタイムゾーン設定がおかしい場合があるので確認した方がいいです。
私の場合、親サイトのタイムゾーンが太平洋標準時に設定されていたのでサブサイトもすべてデフォルトのタイムゾーンが太平洋標準時になってしまい、取得する値が全部太平洋標準時になってしまう事例がありました。
サイトの設定を開いて「サイトの管理」の直下に「地域の設定」という項目があるので、それをクリックするとタイムゾーンの設定画面が開きます。サイトのタイムゾーンを設定すればその後リストの日時型の項目の値はそのタイムゾーンの日時で取得できます。

##Sharepointリストの項目作成または更新時に参照カラム(LookupField)を空で設定したい
参照カラムは値を取得する場合、空だと返ってくる値も空なのですが、更新をする場合は参照先リストのアイテムIDを数値で入力する必要があり、その場合は0を設定する必要があります。
空の場合とそうでない場合で更新するアクションを別々に用意すると後々管理が面倒なので、変数を一つ用意し、デフォルト値を0にしておき更新する必要が出てきた場合に参照先リストアイテムIDを代入するなどの処理を実施すると項目の作成または更新のアクションが１つで済んで良さげです。

##Sharepointリストから複数の項目を取得する場合にフィルタを掛けたい
sharepointコネクタでリストから複数の値を取得する場合、フィルタの入力欄があるのですが、このフィルタの書き方が公式ドキュメントだとイマイチよくわからなかったので私がいろいろ試してうまくいった方法をまとめておきます。

* リストの項目名をすでにマルチバイトで作成済みの場合はわかりませんでした。項目を新しく作成できる場合限定です。
* 利用可能なクエリ演算子が限られているので、思い通りのフィルタを作ることができるとは限りません。

[公式ドキュメント](https://msdn.microsoft.com/ja-jp/library/office/fp142385.aspx)見て、これできちんとクエリ書けるもんなんですかね？私はよくわかんなかったです。

まず、項目を新規作成する際、項目名を初めからマルチバイトでは作らず、半角英数で項目名を設定します。
なぜかというと、Sharepointの項目は表示用の名称と内部名があり、項目名をマルチバイトで作成するとエンコードされた文字列が内部名として自動作成されるようなのですが、その内部名を参照するにはPowershellなどでSharepointに接続して内部名をコマンドで取得するしかないらしいのです。
~~一応項目の編集画面のHTTPアドレスの末尾に内部名っぽい文字列が含まれているのですが、それではクエリが実行されませんでした。~~  
**2018年10月21日追記**  
マルチバイトでカラム名決めた場合の項目名指定方法が判明したので追記します。
マルチバイトの名前で作成したカラムの設定画面(リストを開いた状態で画面右上の歯車→リストの設定→カラム名を選択)を開いた際のHTTPアドレスの末尾に「Field=～」という文字列があるのですが、その=より後ろの部分に「OData」というプレフィックスをつけ足せばフィルタクエリに使える項目名になります。
Microsoft EdgeだとURIエンコードされたままで表示されるようなので、URIデコードしてから頭に「OData」をつけ足します。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/239862/50f49028-977d-0df0-2a9d-c78de92ee858.png)
上記のField=の後の文字列をURLデコードすると「_x30de__x30eb__x30c1__x30d0__x30」となり、「OData」を頭に着けた「OData_x30de__x30eb__x30c1__x30d0__x30」がフィルタクエリに使う際の項目名です。
ChromeやFirefoxではFieldの値がURIデコードされて表示されるようなのでひと手間減ります。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/239862/83876e0c-d256-87ae-0f01-06615aa194d0.png)
ちなみにSharepointOnlineのPowershellコマンドで項目の内部名を調べてみても「OData」が付いてない、フィルタクエリの項目名としては使えない文字列が表示されました。
Sharepointの「項目の取得」アクションの結果に表示されるJSONを見てみたらマルチバイトで作成したカラム名が上記のように「OData<内部名>」になっていたため気付きました。
一度フィルタなしのクエリ実行するにしろ、この手順に書いてあるシングルバイトで作ってマルチバイトに項目名変更するにしろ、面倒なのには変わりないのでシングルバイトでもマルチバイトでも共通で使えるカラム名指定用の関数みたいなのがあればいいのに、と思いますね。  
**追記終わり**

なので、半角英数で作って内部名を明示的に指定することでクエリを書きやすくします。
一度決めると二度と変更できないので、スペルミスとか無いように、他と混同しないように注意して項目名を決めてください。
カラムの型などは最初の作成段階で目的の通りに設定してください。項目の初期作成時にしか選択できない型が結構あるので後から変更はできない場合があります。
内部名を半角英数で設定出来たらあとは上記の公式ドキュメントに沿ってクエリを書くだけです。

```
<項目内部名> <クエリ演算子> <値>
```

という構成が基本です。
内部名「ColumnA」という文字列型の項目の値が「テスト」である項目だけ取得したい場合は下記のとおりです。

```
ColumnA eq 'テスト'
```

複数条件の and や or でフィルタを掛けたい場合は、各条件を()で括って and または or で連結します。

```
( ColumnA eq 'テスト' ) and ( ColumnB eq 'テスト2' )
```

参照項目の付属値？（参照先のリストから引っ張ってきてる項目）でフィルタを掛ける場合、参照先のリストも内部名を半角英数で作っている必要があります。
例えばListAのColumnA-2という項目でListBのTitleを参照し、ListBからColumnB-2,ColumnB-3という項目も引っ張ってきてListAの項目に表示している場合、下記のようなクエリでColumnB-2の値でListAの項目にフィルタを掛けられます。

```
ColumnA-2/ColumnB-2 eq 'テスト'
```
リストAの項目内部名とリストBの項目内部名をスラッシュで連結するようです。
この方法をどこで見つけたか定かではないのですが、一応2018年2月時点では使えることを確認済みです。
1年間変わらずに使えているので当分使えそうな気がしますが、Sharepointのクエリの掛け方が変わったりすると使えなくなるかもしれません。

詳しい人には当たり前ことかもしれませんが、最近Microsoft Flowがちょくちょくいろんなサイトで話題に上がってくることも増えているようなので、初めて触る人の助けになればと思い公開します。