7.1K Views
September 26, 24
スライド概要
気ままに勉強会 #94
今回のお題:気ままになんでもLT会~第5回~
https://kimamani.connpass.com/event/330459/
Microsoft 365、Power Platrform、PowerShellについて調べたことや検証したこと
Power Automateの フローの設計・実装における 私なりの ロジックの組み立て方 気ままに勉強会 #94 気ままになんでもLT会~第5回~ 2024/9/28 1
自己紹介 • 名前: • 活動場所 わたるふ • ブログ (主な活動場所) ルドルフもわたるふもいろいろあってな • こんなひとです https://wataruf.hatenablog.com • SharePoint Server 2007 から お仕事でMicrosoft 製品に関わる • PowerShell が好き https://marshmallow- • Microsoft Teams が好き qa.com/wataruf01?utm_medium=url_text&utm_source=promotion • 今はPower Automate に夢中 • • マシュマロ (フローについて質問を受け付けています) 過去の登壇資料 https://www.docswell.com/user/wataruf01 • 活動内容 • 調査・検証したことなどをブログで解説しています • 開発したもの(Power Automate のフロー、PowerShellの ソースコード)をGitHubで公開しています • X(旧 Twitter) https://twitter.com/wataruf01 • GitHub https://github.com/wataruf01 • Microsoft MVP for Business Applications Microsoft MVP プロフィールページ https://mvp.microsoft.com/ja-jp/PublicProfile/5005227?fullName=Wataru%20Fukai (2023/4~) 2
注意事項 • 解説する内容は私の個人的な見解が含まれています • 内容に誤りがある場合はご指摘をいただけると助かります 3
はじめに 今回お話する内容は個人ブログで今月投稿した内容です。 また、勉強会終了後に登壇資料を公開する予定です。 そのため、聞き逃したところや詳しく見直したい部分がでてきましたら ブログもしく登壇資料でご覧ください。 よろしくお願いいたします 4
今回のお話 Power Automate における フローのロジックの組み立てかたについて 私の経験則をお話します。 普段はほとんど感覚的に 行っていることを 今回言葉に表してみました 5
背景 • X(旧:Twitter)でこんな投稿がありました。 これは 「アルゴリズムクイズ」や 「コーディングチャレンジ」 と呼ばれる問題ですね。 • アルゴリズムクイズ: 与えられた入力に対して、効率的なアルゴリズムを用いて 正しい出力を導く問題 • コーディングチャレンジ: プログラミングスキルを試すためのチャレンジ形式の問題 6
この問題をPower Automate用に読み変えるとこうなります <問題> 下図の通り、「作成-入力」アクションの値を入力情報として「作成-出力」アクションの値を得ること 「作成-入力」アクション 「作成-出力」アクション ここで何かする 7
赤枠部分で何をするか想像できますか?? <問題> 下図の通り、「作成-入力」アクションの値を入力情報として「作成-出力」アクションの値を得ること 「作成-入力」アクション 「作成-出力」アクション ここで何かする 8
ロジックを組み立てるのは難しい 「作成-入力」アクション 「作成-出力」アクション 日付にハイフンが 含まれる場合は 指定された範囲の日付を 展開して出力する。 個々の日付ごとの 値を出力するために カンマで区切って 配列にする 日付にスラッシュが 含まれる場合は 月が変わる判定をいれる 9
避けたほうがよいこと • はじめから完成形を目指して 上から順番にフローを作成すること • 入れ子になっている繰り返し処理 • フローが使いそうな値をすべて変数アクションで 扱おうとする (= 定数にするべきかを検討しない) • フローがすべて組み終わってから はじめて動作確認をすること 10
避けたほうがよい理由 避けたほうがよい理由 詳細 全体的な処理の流れや課題を洗い出さずに実装を進めるため、作業ボリュ 完成までの見通しがたてにくい ームの見通しがたてにくい。最悪の場合、作業時間をかけたにも関わらず 『開発の進捗が進まない』という事態が起こり得る。 課題の発見が遅くなる可能性がある 可読性やメンテナンス性が低下しやすい 開発の引き継ぎが難しくなりやすい 開発の過程(特にフローの後半・終盤)でにおける課題の洗い出しが後回 しにされることがあり、問題解決に時間を要することがある。 フロー全体をイメージしない状態で開発を進めるため、一貫性が保たれず 表記のブレや冗長な実装が発生する場合がある。 途中で他のメンバーに開発を引き継ぐ際、最初に開発した人が後続処理を どのように考えていたかが伝わりづらい。 11
【結論・主旨】フローのロジックは段階的に組み立てよう 最初は出力の範囲を最小減に絞ってフローを作り、徐々に出力の対象範囲を広げていきます。 「作成-入力」アクション プロトタイプ 1 プロトタイプ 2 「作成-出力」アクション 「作成-出力」アクション プロトタイプ 3 「作成-出力」アクショ ン 完成品 「作成-出力」アクション 12
段階的なロジックの組み立てかたをフロー図で表すとこの通り プロトタイプ 1 トリガー プロトタイプ 2 トリガー 入力情報の定義 プロトタイプ 3 トリガー 入力情報の定義 完成形 トリガー 入力情報の定義 入力情報の定義 繰り返し処理 A 対象の配列から 繰り返し処理 A 対象の配列から 要素をひとつ取得 繰り返し処理 B で使う変数の初期化 要素をひとつ取得 繰り返し処理 A 対象の配列から 要素をひとつ取得 繰り返し処理 B 対象の配列から 繰り返し処理 B で使う変数の初期化 繰り返し処理 C で使う変数の初期化 要素をひとつ取得 繰り返し処理 C で使う変数の初期化 繰り返し処理 B 対象の配列から 要素をひとつ取得 繰り返し処理 C で使う変数の初期化 繰り返し処理 A 繰り返し処理 B 繰り返し処理 B 繰り返し処理 C 繰り返し処理 C 繰り返し処理 C 対象の配列から 繰り返し処理 C 要素をひとつ取得 変数を更新 条件分岐 & 変数の更新 出力 出力 出力 条件分岐 & 変数の更新 出力 13
【段階的にフローを組み立てる5つのメリット】 メリットその1:機械的に設計・実装を進められる • この手法では、最初に小さな出力範囲で簡単なフローを作成し、実際に動作するか確 認してから徐々に複雑な処理や出力対象を追加していきます。 • 開発者は、個々のステップごとに具体的なゴールを持って作業するため、迷うことな く効率的に作業が進みます。 • 段階的なアプローチにより、次に何をすべきかが明確で、フローの設計 や実装が機械的に進められます。 14
【段階的にフローを組み立てる5つのメリット】 メリットその2:かけた時間が無駄にならない • 出力範囲を小さく設定し、動作確認を行ってから次のステップに進むため フローが予期せず動作しないケースを早期に発見できます。 • また、逐次確認することで、実装の過程で発生する問題を小さな単位で特定しやすく なり手戻りを最小限に抑えることができます。 • この方法により、後になって大きなフロー全体を修正する必要がなく 初期段階で問題を解決できるため、かけた時間が無駄になりません。 15
【段階的にフローを組み立てる5つのメリット】 メリットその3:可読性・メンテナンス性を保ちやすい • 段階的な開発手法を採用することで、各段階のフローが整理された状態 で作成されるため、可読性が向上します。 • 各ステップで明確で簡潔なゴールをもとに開発が行われるため、 フロー全体を通してロジックが煩雑になることが回避しやすいです。 • フローを段階的に拡張していくことを前提とした開発手法であるため 要件の追加や変更があった場合にも、比較的柔軟に対応できます。 16
【段階的にフローを組み立てる5つのメリット】 メリットその4:ケース漏れが発生しにくい • 段階的にフローを拡張することで、各ステップごとに動作確認を行いながら開発を進 めるため、ケース漏れが発生しにくくなります。 • 出力範囲を少しずつ広げていくことで、想定される処理や例外ケースも小さな単位で 確認でき、結果としてすべてのケースが網羅されやすくなります。 • 最初から大規模なフローを構築する場合に比べて、 細かく動作確認を行えるため、後からケース漏れが発覚するリスクを 減らせます。 17
【段階的にフローを組み立てる5つのメリット】 メリットその5:開発途中での引継ぎが行いやすい • この開発手法では、小さな範囲ごとに確実に動作するフローが構築されて いるため途中で別の開発者に開発を引き継ぐ場合も引き継ぎが比較的ス ムーズに行えます。 • 各ステップが明確に分かれており、それぞれの範囲で期待される出力が明示されてい るため、新しい開発者がフローの意図を理解しやすく、開発を継続しやすいです。 18
まずはプロトタイプ1を作ります 「作成-入力」アクション プロトタイプ 1 プロトタイプ 2 「作成-出力」アクション 「作成-出力」アクション プロトタイプ 3 「作成-出力」アクショ ン 完成形 「作成-出力」アクション 19
プロトタイプ1における入力と出力 「作成-入力」アクション これがプロトタイプ1の 完成形 フローです。 完成形のフロー出力に 含まれる値のひとつを出力する ことを目的としたフローです。 「作成-出力」アクション 例として この値を出力対象 にします。 20
繰り返し処理を行うべき箇所を「ひとつの要素を対象にした処理」に仮置き このプロトタイプ1では 繰り返し処理を行うべき箇所を 「ひとつの要素を対象にした処 理」に置きかえてフローを作成 しています。 「作成-出力」アクション 21
プロトタイプ 1 では変数・条件分岐を使用しない プロトタイプ1では 特定のひとつの値を 出力することを目的としているため 変数アクションと条件分岐を 使用していない という特徴があります。 22
次にプロトタイプ2を作ります 「作成-入力」アクション プロトタイプ 1 プロトタイプ 2 「作成-出力」アクション 「作成-出力」アクション プロトタイプ 3 「作成-出力」アクショ ン 完成形 「作成-出力」アクション 23
プロトタイプ1 から プロトタイプ2への変化 最終的な出力に最も近い “仮置き”のアクションを 本来実装したい 繰り返し処理に置き換えます。 次のスライドで 注目箇所にズームします。 24
プロトタイプ1 から プロトタイプ2への変化 プロトタイプ 1 このアクションで 配列から要素をひとつ 取得します。 outputs('作成-指定範囲内の日付') [0] 次スライド以降でこの 「ひとつの要素を対象とした処理」を 本来の目的である 「配列を対象とした処理」 @{outputs('作成-コロンの左側')} @{outputs('作成-月’)} /@{outputs('【仮置き】作成-指定範囲内の日付-1個のみ')} に置き換えます。 プロトタイプ1の 最終的なアクション(出力)で 次のスライドへ この要素を使用しています。 25
プロトタイプ1 から プロトタイプ2への変化 プロトタイプ プロトタイプ 2 1 配列変数「出力」を初期 化 outputs('作成-指定範囲内の日付')[0] @outputs('作成-指定範囲内の日付') 「変数の設定」アクション @{outputs('作成-コロンの左側')} @{outputs('作成-月’)} /@{outputs('【仮置き】作成-指定範囲内の日付-1個のみ')} に置き換え @{outputs('作成-コロンの左側')} @{outputs('作成-月’)} /@{item()} 処理対象を配列に広げたことで @variables('出力') 値が固定から動的に変化した箇所を 変数に置き換えます 26
仮置きのアクションを繰り返し処理に置き換え (ひとつめが完了) ひとつめの 置き換えが 完了しました。 繰り返し処理に 置き換え済み 27
次工程のプロトタイプ3でも置き換えを行います 次に この仮置きアクションを 繰り返し処理に 置き換えます。 引き続き 繰り返し処理に 置き換え済み フローの最終的な出力に 近い順に行います。 28
次にプロトタイプ3を作ります 「作成-入力」アクション プロトタイプ 1 プロトタイプ 2 「作成-出力」アクション 「作成-出力」アクション プロトタイプ 3 「作成-出力」アクショ ン 完成形 「作成-出力」アクション 出力対象の 範囲を広げる 29
プロトタイプ2 から プロトタイプ3への変化 プロトタイプ 3 プロトタイプ 2 @outputs('作成-コロンの右側をカンマで分割')[0] 変更: 固定値から変数に変更 変更: @outputs('作成-コロンの右側をカンマで分割') 固定値から変数に変更 変更: 「変数の初期化」アクションなので プロトタイプ3で追加する 繰り返し処理の外側に移動 30
追加実装の対応(= 入力値のパターン増加への対応) 処理対象の 入力値の範囲を広げることで 入力値のパターンが増え、 フローがエラーになる場合が あります このエラーを 条件分岐の実装で対応します 次のスライドで対応例を示します 31
追加実装の対応例 このフローでは この2つの条件分岐で 対応します 32
追加実装の結果確認 エラーが回避され、期待通りの出力が得られたことを確認します 「作成-出力」アクション 33
仮置きのアクションを繰り返し処理に置き換え (ふたつめが完了) ふたつめの 置き換えが 完了しました。 繰り返し処理に 置き換え済み 繰り返し処理に 置き換え済み 34
次行程の完成形フローの作成でも置き換えを行います 次に この仮置きアクションを 繰り返し処理に 置き換えます。 繰り返し処理に 置き換え済み この置き換えが完了したら フローの完成です 繰り返し処理に 置き換え済み 35
それでは完成形のフローを作ります 「作成-入力」アクション プロトタイプ 1 プロトタイプ 2 「作成-出力」アクション 「作成-出力」アクション プロトタイプ 3 「作成-出力」アクショ ン 完成形 「作成-出力」アクション 36
プロトタイプ3 から 完成形への変化 プロトタイプ 3 完成形 @outputs('作成-改行で分割')[2] @outputs('作成-改行で分割') 37
仮置きのアクションを繰り返し処理に置き換え (みっつめが完了) これで 繰り返し処理に 置き換え済み 最後の置き換えが 完了しました 繰り返し処理に 置き換え済み 繰り返し処理に 置き換え済み 38
完成 「作成-出力」アクション 39
解説に使用したフローはGitHubで公開しています 解説内容の理解にご活用ください。このフローは下記ブログ記事で使用しています。 • 【Power Automate】【TIPS】【連載その1】フローの設計・実装における私なりのロジックの組み立て方 https://wataruf.hatenablog.com/entry/2024/09/12/000000 • 【Power Automate】【TIPS】【連載その2】フローの設計・実装における私なりのロジックの組み立て方 https://wataruf.hatenablog.com/entry/2024/09/14/000000 • 【Power Automate】【TIPS】【連載その3】フローの設計・実装における私なりのロジックの組み立て方 https://wataruf.hatenablog.com/entry/2024/09/19/000000 • 【Power Automate】【TIPS】【連載その4・最終回】フローの設計・実装における私なりのロジックの組み立て方 https://wataruf.hatenablog.com/entry/2024/09/25/000000 40
Power AutomateのフローやTIPSをブログで公開しています • 興味をもっていただけたかたは下記のURLからいらしてください https://wataruf.hatenablog.com 41
フローに関する質問を受け付けています • 匿名でのご質問も可です。 • X(旧:Twitter)にマシュマロのリンクを公開しています。 • 回答内容はブログで投稿します。 42
最後に 今回は私が普段は感覚的に行っていることを言語化してみました。 これがどなたかのお役に立てれば幸いです 「私はこの部分はこうやってます!」といった フィードバック・ご意見をいただけると とても嬉しいです。 43
44