コントロール アクションを使用して制御フローを変更する

完了

コントロール アクションを使用すると、ロジック アプリのワークフローに決定を行わせることができます。 ソーシャル メディア監視アプリではコントロール アクションを使用して、ツイートのセンチメント スコアをテストし、そのスコアが肯定的なものか否定的なものかに基づいてワークフロー パスを分岐します。 このユニットでは、ワークフローの実行パスを管理するのに役立つ 4 つのコントロール アクションを見ていきます。 また、ワークフロー デザイナーを使用してコントロール アクションを追加および構成する方法についても説明します。

Condition アクション

condition コントロール アクションは、処理中のデータに基づいているかどうかに応じて、ワークフローを 2 つのパスに分割するための if ステートメントです。 このアクションはブール式と 2 つのアクションで構成されています。 実行時に、実行エンジンによって式が評価され、式が true であるか false であるかに基づいてアクションが選択されます。

たとえば、経費報告書を金額に基づいて別の管理者にルートすることができます。 電子メールを処理している場合は、メッセージに優先度が高いフラグが設定されているかどうかをテストする必要がある場合があります。 このソーシャル メディア監視アプリでは、condition ステートメントを使用することで、ツイートのセンチメント スコアに基づいて分岐を行います。 次の図は、ワークフローで condition コントロール アクションがどのように使用されるかを示しています。

Diagram shows a conceptual view for the entire social media monitoring app. The *condition* control action appears highlighted.

型と演算子

condition コントロール アクションでは、数値、文字列、ブール値、JSON オブジェクトをテストすることができます。 次の擬似コードは、各単純型の例を 1 つずつ示しています。

if (score is-greater-than 0.7)              ... // Numeric
if (TweetedBy does-not-contain "MyCompany") ... // String
if (Favorited is-equal-to true)             ... // Boolean

各型には、比較で使用できる一連の演算子があります。 次の表に、型ごとの演算子を一覧表示します。

数値 文字列 ブール値 JSON オブジェクト
is-equal-to is-equal-to is-equal-to is-equal-to
is-not-equal-to is-not-equal-to is-not-equal-to is-not-equal-to
is-greater-than contains
is-greater-than-or-equal-to does-not-contain
is-less-than starts-with
is-less-than-or-equal-to does-not-start-with
ends-with
does-not-end-with

ほとんどの演算は直感的ですが、次の 2 つのケースに注意する必要があります。

  • 文字列比較では、大文字と小文字がすべて区別されます。
  • JSON の比較では、deep equal と呼ばれるものが使用されます。 この比較は、等値演算子でオブジェクト全体 (複雑なオブジェクト内のすべての子孫トークンを含む) を比較することを意味します。

ANDOR を使用して式を結合する

Azure Logic Apps を使用すると、AND または OR を使用して条件を結合することで、複雑な式を作成できます。 たとえば、センチメントが中立的なツイートを特定したいとします (ここで、0.5 に近いスコアは中立です)。 次の擬似コードのような式を記述できます。

if (score is-greater-than 0.4 AND score is-less-than 0.6)

データの可用性

Azure Logic Apps では、前述のすべてのステップからのデータを以降のステップで使用することができます。 この機能は、前の任意のステップで生成された値を式で使用できることを意味します。 さまざまなステップからの値を 1 つの式に結合することもできます。 たとえば、次の擬似コードでは、あなたの会社が送信したもの "ではない" 肯定的な感情を含むツイートを検索します。 スコアセンチメントの検出アクションから得られるのに対し、TweetedBy 値は新しいツイートが投稿されたときトリガーから得られることに注目してください。

if (score is-greater-than 0.7 AND TweetedBy does-not-contain "MyCompany")

グループを使用して複雑な式を作成する

たとえば、影響力のあるツイートを識別する式を作成したいとします。 満たすべき次の 2 つの条件を決めます。

  • センチメント スコアが 0.9 を超え、ツイートがお気に入りとしてマークされている。
  • リツイート数が 1000 を超えている

このアイデアを形にするために、次の擬似コードのような式を構築できます。

if (score is-greater-than 0.9 AND Favorited is-equal-to true OR RetweetCount is-greater-than 1000) // Error, cannot mix AND and OR

Azure Logic Apps ではこの式は間接的にサポートされています。このサポートを有効にするには、"グループ" と呼ばれる機能を使用します。 "グループ" は、AND または OR のいずれかを使用して結合された一連の式です。 グループ内に ANDOR を混在させることはできません。

擬似コードとして表された例をいくつか見てみましょう。 例を読みやすくするため、結合する必要がある式は小文字を使用して表します。 次に示す最初の例は、正当なグループですが、2 番目のものはそうではありません。

if (a AND b AND c) // OK
if (a AND b OR  c) // Error, cannot mix AND and OR

代わりに、前の例で AND でつながれた式に対してグループを作成する必要があります。 次に、OR を使用してグループを他の式につなぎます。 次の擬似コードでは、角かっこを使用してグループを表しています。

if ([a AND b] OR c) // OK

Switch アクション

switch コントロール アクションでは、値が複数のケースに対して比較され、一致するものだけが実行されます。 switch 式でサポートされる型は、stringinteger です。 switch には、一致が存在しない場合に実行する default アクションを含めることができます。

たとえば、メール メッセージを処理していて、メッセージの Importance (重要度) に応じて異なる応答をしたいとします。 Outlook メールでは Importance (重要度) は、0 - 2 の整数です。 次の擬似コードは、メールの重要度に対して switch アクションを構築する方法を示しています。

switch (Importance)
  case 0: ... // action(s) for low importance
  case 1: ... // action(s) for medium importance
  case 2: ... // action(s) for high importance
  default: ...

Foreach ループ

foreach ループ コントロール アクションは、配列を処理します。 このループでは、各配列項目に対して同じアクションを実行します。 既定では、各配列要素のアクションは並列で実行されますが、ループの構成でこの動作を制御できます。

たとえば、新しいツイートが投稿されたときトリガーによって返されたツイート データの一部は、ツイートに含まれるメディアの URL の配列です。 各 URL をデータベース内の独自の行に挿入するとします。 次の擬似コードのように、foreach アクションを使用して処理を実行することができます。

foreach url in MediaUrls
    insert-row

Until ループ

until ループ コントロール アクションでは、アクションのグループを複数回実行します。 次の 3 つの異なる停止条件を設定して、そのうちの 1 つが true になるまでループを実行できます。

  • Condition: すべてのイテレーション後に評価される式。
  • Count: イテレーションの最大数。 既定値は 60 です。
  • Timeout: ISO 8601 形式を使用して指定できる最大クロック時間。 既定値は 1 時間です。

このループを使用してデータを処理できますが、このループは、ネットワーク操作を、成功するかタイムアウトになるまで再試行する必要がある場合にも適したオプションとなります。たとえば、ワークフローで HTTP 要求を行うアクションを実行する必要があるとします。 次の擬似コードに示された例のような until ループを使用できます (時刻値 PT5M は 5 分間に相当します)。

repeat
    HTTP Get
until (StatusCode is-equal-to 200 OR Count is-greater-than 3 OR Timeout is-greater-than PT5M)

デザイナーを使用してコントロール アクションを追加する

ワークフロー デザイナーを使用すると、コントロール アクションを視覚的に追加および構成することができます。 コントロール アクションはすべて Control コネクタ内にパッケージ化されるため、最初のステップは、このコネクタを見つけることです。 コネクタが見つかったら、前に説明したコントロール アクションと、役には立つものの制御フローの管理というここでの目標には直接関係がない他のいくつかのアクションの中から選択できます。 次のスクリーンショットは、デザイナーに表示された使用可能なコントロール アクションを示しています。

Screenshot shows the actions in the **Control** connector in the workflow designer. The list includes the following control flow actions: **Condition**, **For each**, **Switch**, and **Until**.

デザイナーには、グループを含む、複雑な式を作成するための視覚的な方法も用意されています。 次のスクリーンショットは、デザイナーに表示された condition アクションを示しています。

Screenshot shows a configured **Condition** action in the workflow designer. The image contains a **Sentiment** action followed by a **Condition** action. The **Condition** action has a simple expression that tests whether the sentiment score is greater than 0.7.

このソーシャル メディア監視アプリでは、Condition コントロール アクションを使用して、センチメント スコアをテストする if ステートメントを追加します。