【Power Automate(MS Flow)の使い方事例】変数とループ(Apply to each)を活用しよう

最終更新:2020年01月15日 公開:2019年12月13日

前回の記事では、弊社で使用している有給休暇自動承認フローについて紹介しました。当記事は前回の記事の続編ですので、詳しくは前回の記事を参照ください。
【Microsoft Flowの使い方事例】有給申請を自動化しよう!

「そもそもMicrosoft Flowってなに?」という方は、前々回の記事を参照ください。
【初めてのPower Automate(MS Flow)の使い方】承認フローを作成する

 

今回はMicrosoft Flowで、「変数」や「ループ (Apply to each) 」を扱う際の注意点や手順について説明します。応用編として、「HTTP要求 (HTTPリクエスト) 」の使い方についても少し触れていきます!

 

※「Microsoft Flow」は2019年11月に「Microsoft Power Automate」と改称されました。新しい機能(RPA機能)もいくつか追加されています。当記事で紹介するワークフローは、RPA機能が追加される前の「Microsoft Flow」で作成したものですので、当記事では「Microsoft Flow」と呼称しております。

2次承認フローについて

今回説明する「2次承認フロー」は「1次承認フロー」とほぼ同じ流れです。二つのフローチャートを見比べてみましょう。

 

2次承認フローは、申請が承認された時のアクションが増えています。
今回追加されたアクションは以下の2点です(上図の赤枠で囲まれている部分)。


①個人リストに振り分ける
②申請者に承認通知メールを送信する

これから、①と②について説明します。

「個人リスト」の用途について

1次承認フローでは、承認済みの休暇申請を「1次承認待ちリスト」から「2次承認待ちリスト」へ移動するだけでしたが、2次承認フローでは「2次承認待ちリスト」から「承認済みリスト」と「個人リスト」へ移動する必要があります。

ここでいう「承認済みリスト」とは、1次承認者および2次承認者に承認された休暇申請が格納されるリストのことです。「1次承認待ちリスト」と「2次承認待ちリスト」は、承認前の休暇申請が一時的に保存されるだけですが、「承認済みリスト」には過去から現在の間に承認されたすべての休暇申請が保存されています。

もう1つのリストである「個人リスト」の役割は、「承認済みリスト」と同じです。ただ、「個人リスト」は申請者(社員)1人につき、1つのリストが割り当てられています。そのため、フロー実行ごとに申請者が誰かを判断し、それに応じて休暇申請の保存先リストを変更する必要があります。

「どうしてそんな手間をかけてまで「個人リスト」を使用するのか?」と疑問に思う方もいるのではないでしょうか?その理由は、データの閲覧権限にあります。

弊社で運用している休暇申請フローには、管理者以外は閲覧できないように、すべてのリストに対してデータの閲覧権限を設定しています。

しかし、自分の休暇申請履歴を閲覧したい社員もいるかもしれません。そのため、個別にリストを作成して、そのリストだけ別に閲覧権限を設定(管理者+リストの所有者のみ閲覧可)しています。

※SharePointのアクセス制限の設定方法は、公式サイトのヘルプを参照してください。

承認済みリスト」に休暇申請を保存するだけなら1次承認フローと同じ処理で構いませんが、「個人リスト」に振り分ける際は別に処理を作成します。これは、最初の記事で説明した「条件分岐」に「変数」と「ループ」を加えた少し特殊な条件分岐で作成します。

ワークフロー作成の準備をする

社員のメールアドレスリストを作成しておく

下図のように、社員の名前とメールアドレスが格納されたリストを作成します。

1次承認ワークフローをコピーする

2次承認フローの基本構造は1次承認フローと同じなので、1次承認フローをコピーして編集していきます。
1次承認フロータイトルの右端に表示されている3つの点が縦に並んでいるマークをクリックして、「名前を付けて保存」を選択します。

コピーするフローの名前を変更できるので、任意のタイトルに変更します。

【変更前】
「コピー – 【休暇用】1次承認待ちリストにアイテムが追加されたときに承認を開始する」
【変更後】
「【休暇用】2次承認待ちリストにアイテムが追加されたときに承認を開始する」

「保存」をクリックすると、1次承認フローのコピーが作成されます。コピーしたフローはコピー元のワークフローと内容が重複するため、初期設定ではオフになっています。これは、トリガーが実行されてもフローが開始しない状態です。

編集中はオフのままでも構いませんが、動作テストをする際は、忘れずにオンにしましょう。

新しい処理を追加する前に、コピー元である1次承認フローの内容を2次承認フロー用に書き換えます。

・各ステップの名前を変更する
下図は、どのステップがどのような働きをするのかを示しています。

・各ステップの中身を変更する
①トリガーを「1次承認待ちリストにアイテムが追加されたとき」から「2次承認待ちリストにアイテムが追加されたとき」に変更します。
②承認申請メールのTitle(件名)とAssigned To(送信先メールアドレス)を2次承認用に変更します。

③承認済みアイテムのコピー先を「2次承認待ちリスト」から「承認済みリスト」へ変更します。
④削除するアイテムのリスト元を「1次承認待ちリスト」から「2次承認待ちリスト」へ変更します。
⑤差戻し通知メールの宛先に「1次承認者のメールアドレス」を追加します。

・承認通知メールの設定をする
申請者に承認通知メールを送信する」処理も作っておきます。「はいの場合」の一番下に新規アクションを追加して、「宛先」・「件名」・「本文」を指定します。具体的な作成方法は、こちらを参照してください。

これで事前準備は完了です。それでは、新しい処理を作成していきましょう。

ループ (Apply to each) を用いて個人リストに振り分ける

【2次承認フローの「個人リストに振り分ける」をフローチャート】

【ワークフロー作成画面に当てはめる場合】

【完成イメージ】

SharePointリストを取得する


①について説明します。

このステップでは、社員のメールアドレスリスト(社員リスト)内のアイテム情報をすべて取得します。「はいの場合」の最初のステップに作成します。

ここでの注意点は、最上位に新規ステップを追加することはできないことです。

そこで、「承認済みリストにアイテムをコピーする」の下に作成して、あとで一番上に移動します。

「アクションの追加」表示がない場所にステップを挿入したいときは、矢印部分にカーソルを合わせると表示される+ボタンを使用します。

+ボタンをクリックすると、アクション選択画面が表示されます。検索ボックスに
「SharePoint」と入力し、「複数の項目の取得」をクリックします。
※「複数の項目の取得」とは、指定したリストのアイテム情報をすべて取得するアクションです。

「サイトのアドレス」と「リスト名」を指定します。「リスト名」には、先ほど作成したメールアドレスリスト「社員リスト」を選びます。

これで①の設定は完了です。次のステップに進む前に、一つ前のステップ「承認済みリストに承認済みアイテムをコピーする」をドラッグ&ドロップして、「①複数の項目の取得」の下に移動させましょう。

【移動後】

名前も変更しておきます。

【変更後】

ループ「Apply to each」を作成する

②、③について説明します。

ここでは、「リスト内のメールアドレスと申請者メールアドレスを比較し、両者が一致したときのみ、特定の処理を実行する」というアクションを、社員数分の繰り返し処理を行います

ここでいう「特定の処理」とは、個人リストに項目を作成することを指します。

フローを作成するとき、同じ処理を複数回実行したいと思うことがしばしばあります。その時に、何度も同じ処理を作成するのは、大変です。そこで、最初の一回だけの処理を作成し、それを繰り返し実行してくれる「ループ」機能を利用します。

ループにはいくつか種類がありますが、Microsoft Flowで扱えるのは「Do until」と「Apply to each」の2つです。

・Do until(=~までする)
あらかじめ指定された条件の結果が、true(=Microsoft Flow内では、「はいの場合」)になるまでループ内の処理を繰り返す。例えば、足し算を繰り返し、合計が100を超えたらループを抜ける等の処理が行える。

・Apply to each(=それぞれに適用する)
ひとつのアクションに対して複数のデータが返ってくるときに、それぞれのデータに対して処理を行う。例えば、新しいメールに添付ファイルが複数ある場合、Apply to eachによってそれらのファイルに対してひとつずつ処理を行える。

今回は、①で取得したリストの項目数だけ同じ処理を繰り返したいので、「Apply to each」を使います。ループの中に条件分岐を設置する、いわゆる「入れ子構造」を作成します。

入れ子構造

では順番に、ループから作成していきましょう。
「社員のメールアドレスリストを取得する」ステップの下の+ボタンをクリックします。

アクション選択画面の「組み込み」タブを選択し、「Apply to each」をクリックします。

Apply to each」ステップが挿入されます。

直前のステップで取得した「社員リスト」内のアイテムを出力するため、「社員のメールアドレスリストを取得する」ステップの「value」パラメータを挿入します。

「リスト内のメールアドレス=申請者メール」となったときのみ処理を行うため、
Apply to eachの中に「リスト内のメールアドレス=申請者メール」を条件に設定した分岐を追加します。

「アクションの追加」→「組み込み」タブから「条件」をクリックします。

左側の「値の選択」にステップ名「社員のメールアドレスリストを取得する」の「メールアドレス」パラメータを挿入します。

右側の値には、トリガーでもある「2次承認待ちリストに新規アイテムが追加されたときに処理を開始する」ステップの「送信者」パラメータを挿入します。

条件の設定が完了したら、分岐後の処理を作成していきましょう。

変数とは

④について説明します。

変数とは、値の出し入れができる箱のことです。ここでいう「値」とは、数値文字列です。Microsoft Flowでサポートされている型は、以下の通りです。

タ型の名称 説明
ブール値 論理値のこと。True(真)かFalse(偽)のいずれかの値が格納されている。
整数 小数を除いた数値を扱える。
Float 小数を含んだ数値を扱える。
文字列 単語や文章としての各種文字を扱える。
オブジェクト 配列(列のみ)を扱える。
アレイ 配列(列と行)を扱える。

2次承認フローでは、「文字列」を使用します。具体的には、「申請者の氏名」を格納します。

先に進む前に、冒頭の完成イメージ図の④を見てみましょう。

②~③で作成したループは、投稿通知メールアドレスをもとに、申請者の名前を特定するためのものでした。④は、②~③で特定した「申請者の名前」を「文字列」という形で扱うために、「変数」という箱を用意するためのステップです。

変数とは何か、何のために使うのか、なんとなくイメージはつかめたでしょうか?

個人リストの各リスト名は任意のもので構いませんが、一目で個人を特定できる要素を入れましょう。弊社では、「氏名」をリスト名に入れています。個人リストに振り分ける際、「氏名」を基準にしています。

さて、Microsoft FlowでSharePointの項目を作成するとき、リスト名を指定したことを覚えていますか?これは、処理の結果にかかわらず、毎回固定のリストに項目を作成するためのものでした。

今回は項目を作成するリストをその都度変更したいので、今までの同じやり方では不十分です。そこで、ここに「変数」を加えます。「変数」を使用すれば、フロー中の状況に応じて、その後に行う処理を変更することができます。

ここで、なぜ「条件分岐」を使わないのかというと、条件分岐は選択肢が多ければ多いほど、効率が落ちるからです。

条件分岐は、選択肢の数(今回の場合は社員の数)の処理を作成しなければなりません。それに対し、変数は最初に変数さえ用意しておけば、多様な処理を行うことができます。

とはいえ、処理の内容によっては、条件分岐を使用したほうが効率的な場合もあります。選択肢が少ないときや、選択肢ごとに処理内容が大幅に変わるときなど、状況に応じて、使い分けましょう。

変数を設定する

変数を設定していきましょう。Microsoft Flowでは、変数を使いたいとき、必ず初期化をする必要があります。具体的には、事前に、「名前」・「」・「初期値」を宣言します。

変数の初期化」はフローの最上位でないと行えないため、トリガーの次にステップを挿入します。

トリガー直下の+ボタンをクリックすると、アクション選択画面が表示されます。「組み込み」タブを選択し、紫色の「変数」アイコンをクリックします。

すると、変数のアクション一覧が表示されるので、「変数を初期化する」をクリックします。

変数の初期化画面が表示されました。

それぞれの値を以下のように設定します。

名前:この変数には「申請者の氏名」を代入したいので、そのまま「Name」とします。変数の名前は、どんな用途で使われるのかが分かるものにします。
種類:申請者の名前を文字型データとして扱いたいので、「文字列」を選択します。
値: この変数の初期化時点では、まだ申請者の氏名を特定する手段がないので、「何もない・からっぽ」という意味の「null」を代入しておきます。

これで、変数の初期化は終了です。

ステップ名も分かりやすいものに編集しておきましょう。

次に、申請者の名前を変数に代入します。

申請者の名前を特定したあと、つまり③~④で作成したループ内にある条件分岐の、「はいの場合」に「変数の設定」アクションを設置します。

「アクションの追加」→「組み込み」→「変数」から「変数の設定」を選択します。

変数の設定画面が表示されました。

名前」項目の下向き三角をクリックすると、事前に宣言した変数一覧が表示されます。先ほど宣言した変数「Name」を選択しましょう。

「値」には、「メールアドレスリスト」の「タイトル」を指定します。

ここでいう「タイトル」は、社員の氏名を意味します。分からない場合は、SharePointのメールアドレスリストをもう一度見てみましょう。

以上で、変数「Name」には申請者の名前が代入されたことになります。早速、次のステップで変数を使ってみましょう。

変数の設定」ステップの下に「項目の作成」アクションを設置して、リスト名の一部に変数「Name」を挿入します。
※リスト名一覧の一番下の「カスタム値の入力」から任意の文字列を入力できます。

リスト名」項目に「休暇取得リスト【】」と入力し、「【」と「】」の間にカーソルを合わせて変数「Name」パラメーターを挿入します。

すると、「設計時にパラメーター ‘path.$.table’ を評価できません。パラメーターは空か、実行時式が設定されています。」という警告が出ます。

実行時式が設定されています」とあるので、フローの実行時に値が変わる可能性のあるパラメーター、つまり変数設定できないということです。

実際には、この警告が表示されていてもフローは問題なく動作します。しかし、本来の使い方ではないようです。予期せぬ動作を引き起こす可能性があるので、今回は別の方法で「項目の作成」を行うことにします。

項目の作成」アクションと同じ処理を別の方法で実行したいわけですが、具体的にどういう手段を使えばいいのでしょうか?

ここから多少ややこしい話になってきますので、よくわからないという方はこちらを参照してください。記述されているコードを画面通りにコピー&ペーストすれば、処理を行うことができます。

(応用編)コードを利用する

ここは、上級者向けの内容です。

Microsoft Flowには、ステップごとに「コードのプレビュー」機能があります。

試しに、「休暇取得リスト【山田一郎】」に項目を作成するアクションを作り、右上の「…」マークから「コードのプレビュー」をクリックして、「コードのプレビュー」を見てみましょう。

コードビューが表示されます。

上記のコードを抜き出してみましょう。(一部、URLを伏せてあります)
{
    “inputs”: {
            “host”: {
                “connection”: {
                   “name”: “@parameters(‘$connections’)[‘shared_sharepointonline’][‘connectionId’]”
                }
            },
            “method”: “post”,
            “body”: {
                    “Title”: “@triggerBody()?[‘Title’]”,
                    “OData__x672c__x6587_”: “@triggerBody()?[‘OData__x672c__x6587_’]”,
                    “OData__x5206__x985e_”: “休暇”
            },
            “path”: “/datasets/@{encodeURIComponent(encodeURIComponent
(‘https://0000000000000.com/’))}/tables/@{encodeURIComponent
(encodeURIComponent(‘a9c9c1b8-261d-4bb1-a4c8-0b6253d5e561’))}/items”
,

            “authentication”: “@parameters(‘$authentication’)”
    },
    “metadata”: {
            “flowSystemMetadata”: {
                    “swaggerOperationId”: “PostItem”
            }
    }
}

これをフロー作成画面と照らし合わせると、コードの赤字が項目名、青字が項目の内容に該当していることがわかります。

「項目の作成」に必要な項目は、上から順に「サイトのアドレス」、「リスト名」、「タイトル」、「本文」、「分類」となっています。「サイトのアドレス」、「リスト名」は別の方法で指定するので、それ以外の「タイトル」、「本文」、「分類」を示すコードを抜き出してみましょう。
タイトルタイトル
“Title”: “@triggerBody()?[‘Title’]”

本文本文
“OData__x672c__x6587_”: “@triggerBody()?[‘OData__x672c__x6587_’]”

分類休暇
“OData__x5206__x985e_”: “休暇”

どの文字列が何を指すのか、なんとなく把握できましたか?要するに、これらのコードをどうにかしてSharePointに送信できれば、「項目の作成」アクションと同じ処理が行えるということですね。

Microsoft Flowには、SharePointに直接データ(コード)を送れる機能があります。この機能を「HTTP要求(HTTPリクエスト)」といい、これを利用することで、既存のアクションだけでは手の届かない様々な処理を行うことができます。

HTTP要求の送信には、先ほど抜き出したコードが必要になります。

SharePointにHTTP要求を送信する

では、実際にHTTPリクエストを送信するための手順について説明していきます。まず、先ほど試しに作った「項目の作成」ステップを削除します。

「アクションの追加」から「SharePoint」の「SharePoint に HTTP 要求を送信します」を選択します。

HTTP要求送信の設定画面が表示されます。

「サイトのアドレス」を指定します。これは、今までのやり方と同じです。

次に、「方法」を指定します。5つの選択肢がありますが、それぞれの役割は下記の通りです。

GET:取得
PUT:更新
POST:登録
PATCH:部分置換
DELETE:削除

今回は、指定したリストに項目を追加、つまり「登録」をしたいので「POST」を選択します。

「URI」には、項目を作成したいリストのURIを指定します。これは「項目の作成」アクションの「リスト名」項目とほぼ同じ役割の項目です。
※「項目の作成」ではリスト名をそのまま指定していたのに対し、「URI」ではリストの場所をパス付き(URL)で指定することになります。

SharePointリストの場所を示すURIは、
_api/web/lists/getbytitle(‘リスト名’)/items」となります。

したがって、「URI」には「_api/web/lists/getbytitle(‘休暇取得リスト【】’)/items」と入力し、【】の間にパラメーター「変数:Name」を挿入します。

コピペ用:_api/web/lists/getbytitle('休暇取得リスト【@{variables('Name')}】')/items

ヘッダーは使わないので、空欄で構いません。ボディの値は先ほど抜き出した「タイトル」、「本文」、「分類」のコードをそのまま入力します。
コピペ用:
{
"Title": "@{triggerBody()?['Title']}",
"OData__x672c__x6587_": "@{triggerBody()?['OData__x672c__x6587_']}",
"OData__x5206__x985e_": "休暇"
}

コードの最初と最後には、必ず「半角波括弧{}」が必要です。波括弧がないとコードとして認識されないので、忘れないようにしましょう。

上記のコードを「ボディ」に入力(またはコピペ)すると、「@{triggerBody()?[‘Title’]}」、
「@{triggerBody()?[‘OData__x672c__x6587_’]}」の部分がパラメーターアイコンに置き換えられます。これはそれぞれ「トリガーのタイトル」、「トリガーの本文」を指すのですが、この画面に見覚えはありませんか?

「HTTP要求の送信」アクションには「方法」や「URI」、「ボディ」など聞き覚えのない単語が並んでいますが、構成自体は「項目の作成」アクションとほぼ同じです。

今回は変数を扱うため、馴染みのない手法を使いましたが、根本的には今までの操作と変わりはありません。この「HTTP要求」機能はいろんな使い方があります。興味のある方は、調べてみてください。

さて、これで「有給休暇自動承認フロー」は完成です。

2記事にわたって長々と説明しましたが、画像で見ると結構シンプルです。基本さえ理解していれば、簡単にフローを構築できてしまうのがMicrosoft Flowです。

ぜひ、日々のルーチンワークにMicrosoft Flowを取り入れて、業務の効率化を図りましょう。当記事で紹介した以外にも、多種多様な機能があります。動作テストを繰り返しつつ、独自のアレンジを加えてみてください。新しい世界が見えてくるかもしれませんよ!

この記事が気に入ったら
いいね ! しよう

Twitter でフォームズのブログを
フォームズ編集部
オフィスで働く方、ホームページを運営されている皆様へ
仕事の効率化、ビジネススキル、ITノウハウなど役立つ情報をお届けします。