なんか業務で利用するフローってこうした条件が多い気がするんですよ。月の最終金曜日にだけ行う事務処理があるとか。

ただ、スケジュール実行のフローを作成しようとすると、毎月何日とか毎週何曜日とかの条件は簡単に設定できるものの、月の最終金曜日のような設定は少し難しそうでした。

というわけで、それにちょっとチャレンジしてみます。

まずはロジックを考える

最終金曜日をどうやって判定するかロジックを考えましょう。例えば、今日の日付が最終金曜日かどうかを判断するにはどうしたらよいか…。

最終金曜日というのはその月の最後の金曜日なわけで…、翌週の金曜日は翌月なわけですね。つまり今日の 7 日後が翌月かつ金曜日であれば、今日は最終金曜日と判定しても良さそうです。

Power Automate のスケジュール実行のトリガーでは、毎週金曜日に実行するという設定は簡単にできそうです。つまり毎週金曜日に実行するようにしておき、その実行日の 7 日後が翌月であれば、実行された当日が最終金曜日になります。

なんとなくできそうですね。あとはこれを Power Automate でどう設定するかです。

こうなりました

まずは、スケジュール トリガーを利用し、次のように設定します。毎週金曜日の毎朝 9 時に実行します。

加えてトリガーの設定からトリガーの条件を設定します。ここには、次のような関数式を入れました。

@not(
    equals(
        convertFromUtc(
            utcNow(),
            'Tokyo Standard Time',
            'MM'
        ),
        addDays(
            convertFromUtc(
                utcNow(),
                'Tokyo Standard Time'
            ),
            7,
            'MM'
        )
    )
)

実行時の UTC 時間を日本時間に変更したものと、それに 7 日を足したものの月を比べて、等しければ false を、異なれば true を返す式になっています。つまりは、7 日を足したものが翌月であれば、トリガーが起動しフローが実行されるというわけです。

これで目的通りのトリガーを設定できたと思います…。

結果は後日判明します!

と、この記事を書いている今日が 9 月の最終金曜日なので、上手く動作するのか結果が分かるのは来月の最終金曜日 10 月 28 日になります。楽しみですね。

無事に思った通りに動作しました!動作履歴を確認してみましょう。作成日の夕方にテスト実行されてから、今月の最終金曜日の設定時刻まで実行されておらず、最終金曜日にだけフローが実行されていることがわかります。

最終金曜日はプレミアムフライデー

そう。毎月最終金曜日はプレミアムフライデーです。このトリガーによって、プレミアムフライデーであることを、みんなにツイートでお知らせすることもできるわけですね。

さいごに

そんなわけで、業務でよくありそうな、月の最終金曜日に実行されるフローの作り方を考えてみました。トリガー標準の設定と関数式を組み合わせて上手く作れたのではないかと思っていますが、どうでしょうか?

付録: 最終金曜日の日付を求める

ついでに、実行日当月の最終金曜日の日付を求める関数式も考えてみました。

まずは、月の最終日を求めてみます。

addDays(
    startOfMonth(
        addToTime(
            convertFromUtc(
                utcNow(),
                'Tokyo Standard Time'
            ),
            1,
            'Month'
        )
    ),
    -1
)

関数式では addToTime で実行日の翌月の日付を求め、startOfMonth を用いて翌月 1 日の日付を取得します。さらに addDays でその前日の日付を取得すれば、今月の最終日となっているわけです。

この日付を元に、最終金曜日を求めていきます。

if(
    equals(
        dayOfWeek(
            outputs('今月の最終日')
        ),
        5
    ),
    outputs('今月の最終日'),
    addDays(
        outputs('今月の最終日'),
        sub(
            -2,
            dayOfWeek(
                outputs('今月の最終日')
            )
        )
    )
)

今月の最終日が金曜日であるかどうかを判断し、金曜日であればそのまま今月の最終日の日付を返します。

今月の最終日が金曜日ではない場合、日曜日を 0 とする曜日番号を今月の最終日から引くことで直前の日曜日の日付を求め、さらにそこから 2 日分を引いた日付を求めると、今月の最終金曜日を求めることができます。