面白そうな内容なのでやってみました。フローで実現してみました。
課題の内容
内容はこちらです。
#ハジメの一歩会 pic.twitter.com/Lwdud1G7xl
— かーでぃ@ガノタなIoTプロフェッショナル (@_0447222690292) October 3, 2022
作成したフローとその実行結果
フロー図
作成したフローはこちらです。トリガーとアクション2つで実現できます。
ステップごとの解説
「手動でフローをトリガーします」トリガー
名前の通り、フローを手動で実行するトリガーです。今回はこのトリガーでの入力情報はありません。
「選択」アクション
「データ操作」>「選択」アクションです。
このアクションの各欄に記載している内容は以下の通りです。
「開始」欄:
range(1,100)
「マップ」欄:
"@{item()}": "@if(equals(mod(item(),12),0),'3と4の倍数',if(equals(mod(item(),4),0),'4の倍数',if(equals(mod(item(),3),0),'3の倍数','')))"
「選択」アクションの出力結果
このアクションの出力は下図の通りです。100までの数字の判定を行っています。
この「選択」アクションで実現していること
このアクションひとつで以下の処理を実現しています。
[重要]「選択」アクションの本質は繰り返し処理である
前章のような判定と配列化を「選択」アクションで実現できる理由について解説します。
「選択」アクションの本質は繰り返し処理です。「開始」欄で定義されている配列の各要素に対して「マップ」欄で定義した処理を行い、処理結果を配列として出力しています。
「開始」欄で定義している数字の配列が繰り返し処理の対象です。数字は1から100まであるので、繰り返しの回数は100回です。
「マップ」欄で定義した処理の結果は配列の要素として返されます。繰り返し処理の回数は100回なので、要素の個数が100個である配列が返されます。
「開始」欄で定義していること
「開始」欄で使用しているrange関数は指定した整数から始まる連番を要素として持つ配列(アレイ)を生成する関数です。
つまり、range(1,100) は「1から100までの連番で構成された配列(アレイ)を生成する」を表します。
「マップ」欄で定義していること
「マップ」欄で使用している式は以下の通りです。
「マップ」欄:
"@{item()}": "@if(equals(mod(item(),12),0),'3と4の倍数',if(equals(mod(item(),4),0),'4の倍数',if(equals(mod(item(),3),0),'3の倍数','')))"
item関数は「開始」欄で定義された配列のうち現在の処理対象としている要素を表す関数です。例として、今回のフローにおいては1回目の繰り返し処理では「1」を表し、2回目の繰り返し処理では「2」を表します。
「作成-JSON Dictionaryを作る」アクション
このアクションは「データ操作」>「作成」アクションです。このフローでは関数を使って「選択」アクションの出力を見やすい形式に変換するために使います。
このアクションで定義している式は以下の通りです。
json(concat('{',replace(replace(replace(replace(string(body('選択')),'{',''),'}',''),'[',''),']',''),'}'))
このアクションで何をしているのかについてはこちらの記事を参照してください。
wataruf.hatenablog.com
このアクションの入力情報(= 「選択」アクションの出力):
このアクションの出力情報:
これでこのフローの最終的な目的である配列を作ることができました。
「選択」アクションの処理内容をApply to each に置き換えることも可能
このフローで伝えたいことは「選択」アクションの本質は繰り返し処理であるということです。
つまり、今回のフローは以下の通り選択アクションではなくApply to each(繰り返し)で実現することもできます。出力結果は「選択」アクションを使用したフローと全く同じです。
ただし、今回のフローのケースにおいては「選択」アクションを使用したほうが処理時間が圧倒的に短く済みます。そのため、「選択」アクションを使用することが適しているケースといえます。
さいごに
説明を読んだだけでは理解が難しい内容だと思いますが、「選択」アクションの使い方を覚えておくとフロー作成においてとても強力な武器になります。ぜひ手を動かして使ってみて欲しいアクションのひとつです。
今回は以上です。