ルドルフもわたるふもいろいろあってな

Microsoft 365、Power Platform、PowerShellについて調べたことや検証したことなどを投稿します。技術の話は面白い。

【Power Automate】【クイズ・パズル】ゴミの分別を判定する

前回と同じく面白そうな課題をお借りしました。

課題の内容

内容はこちらです。


作成したフロー

アクションの設定を閉じた状態のフロー図


開いた状態のフロー図


実行イメージ

手動トリガーでフローを実行します。

結果が出力されました。課題の条件通りの出力になりました。


(`・ω・´)シャキーン


フローで何を行っているか(概要)

フローの概要を解説します。

まずは1行目の文章作成に取りかかります。

1行の文章作成は前半部分と後半部分で処理分けます。
・前半部分 ・・・ 現在が何日目なのかで文章を決定します
・後半部分 ・・・ 現在が何曜日なのかで文章を決定します

この処理を7行分(= 7日分)繰り返し行います。

これにより、フロー実行日を起点として7日間の分のゴミの分別を表す文章にします。


ステップごとに解説します

ステップごとの解説

「手動でフローをトリガーします」トリガー

名前の通り、フローを手動で実行するトリガーです。今回はこのトリガーでの入力情報はありません。

「変数を初期化する-本文」アクション

このアクションは「変数」>「変数を初期化する」です。このフローが最終的に出力する文章を格納する変数です。


初期化時は空白値にしておきます。

「変数を初期化する-1日分の行」アクション

このアクションは「変数」>「変数を初期化する」です。このフローの繰り返し処理時に使用する文字列を一時的に保管する領域として使用する変数です。


この変数も初期化時は空白値にしておきます。

「作成-曜日の配列」アクション

このアクションは「データ操作」>「作成」です。

このアクションに記載している式

createArray('日', '月', '火', '水', '木', '金', '土')


このアクションではcreateArray 関数によって各曜日を日本語で表した配列を定義しています。

この配列に対して、0~6 の数字をわたすことで曜日を取得することができます。

createArray('日', '月', '火', '水', '木', '金', '土')?[0]
 → 出力:日

この方法はふらり(@flali_world)さんのブログで紹介されている方法を真似させていただきました。m(__)m
flali.hatenablog.com

「作成-分別の配列」アクション

このアクションは「データ操作」>「作成」です。

ここのアクションに記載している式

createArray('何もありません', '燃えるゴミの日', '燃えないゴミの日', '資源ゴミの日', '燃えるゴミの日', '何もありません','何もありません')

この配列に対して、0~6 の数字をわたすことでゴミの分別を取得することができます。

createArray('何もありません', '燃えるゴミの日', '燃えないゴミの日', '資源ゴミの日', '燃えるゴミの日', '何もありません','何もありません')?[0]
 → 出力:'何もありません'

「作成-今日の日付(日本時間)」アクション

このアクションは「データ操作」>「作成」です。

このアクションに記載している式

convertTimeZone(utcnow(),'UTC','Tokyo Standard Time','yyyy-MM-dd HH:mm:ss')


現在時刻を日本時間で取得します。

出力例

「Apply to each」アクション

このアクションは「コントロール」>「Apply to each」です。繰り返し処理を行います。

この繰り返し処理のインデクサとして使用する配列は range関数 で作成しています。

range(0,7) は 0を起点とした要素が7個の配列を表します。


繰り返し処理内のステップについて解説します。

「スイッチ-前半部分」アクション

このアクションは「コントロール」>「スイッチ」アクションです。

1行の前半部分の文字列をここで指定しています。


1ループ目なら「今日は、」。

2ループ目なら「明日は、」。

3ループ目なら「明後日は、」。

それ以外なら「○○曜日は、」。

「○○曜日は、」の曜日判定は以下の式で行っています。

concat(outputs('作成-曜日の配列')?[dayOfWeek(addDays(outputs('作成-今日の日付(日本時間)'),item()))],'曜日は、')


出力例

ここでは dayOfWeek関数の返り値(= 0~6までの数値1桁)を「曜日の配列」に渡すことで曜日を取得しています。

参考:
blog-tips.sekenkodqx.jp

スイッチのいずれの分岐についても「変数に設定」アクションを使って変数「1日分の行」に"前半部分"の文章を入力しています。

ループ内で使用する一時変数であるため、前のループの値を上書きする目的で追記アクションではなく設定アクションを使っているところがポイントです。


「文字列変数に追加-後半部分」アクション

このアクションは「変数」>「文字列変数に追加」アクションです。

このアクションに記載している式

outputs('作成-分別の配列')?[dayOfWeek(addDays(outputs('作成-今日の日付(日本時間)'),item()))]

このアクションでは”後半部分”の文章を変数「1日分の行」に追記しています。

先ほどの"前半部分"の実現方法と同じく、dayOfWeek関数の返り値(= 0~6までの数値1桁)を配列に渡すことで目的の文字列を取得しています。

「文字列変数に追加」アクション

このアクションは「変数」>「文字列変数に追加」アクションです。

このアクションに記載している式

concat(variables('1日分の行'),decodeUriComponent('%0A'))


変数「1日分の行」に格納している文章を、このフローが最終的に出力する文章を格納する変数に転記しています。

また、decodeUriComponent('%0A') は改行を表しています。

「作成-結果を表示」アクション

このアクションは「データ操作」>「作成」です。

このフローの最終的な出力です。

最後に

今回お借りした課題は本来は"前半部分"と"後半部分" を返り値として返すメソッドを定義することをお題とした課題のようです。
メソッド的な機能を使わずにフローで実現したらこんなロジックになります。フローを組み立てるうえでの参考になれば幸いです。

別解として子フローやOfficeスクリプトを作ってメソッド的な機能を実現する方法もあるかと思います。別途そんな例を紹介するブログ記事を書いてみたいと思います。


今回は以上です。