見出し画像

【Power Automate】【Workflows】SharePointのリストの特定フィールド(列)値の変更時、同じアイテム内のほかのフィールドの値などに応じたアクションを実行する

今回もくだらない?かもしれない目的のためにWorkflowsを組んでみた。くだらなくてもなんとか形にできるのがいいところ。
ほとんど参考にしたサイトとこれまでやってきたことを基にできてしまったので特に目新しいことはございません。リストのデータ型の解明が少し面倒だったかな。。

やりたかったこと

SharePoint上のリスト(Lists)の特定フィールド(=列)の値が別の値に変更あるいは削除された場合に、それおよび同じアイテム内のほかのフィールド値またはその有無によって条件分けを行い、Teamsのチャットを送信する。フィールド値の一つは日時であり、その日時にチャットをスケジューリングして送信する場合を含む。

できたこと

当初やりたかったことはできた。しかし、使用してみると改善点もいくつか出てきた。特に、一度スケジューリングしたアクションをキャンセルするアクションが欲しい。
→これは新たな条件を加えることで解決した

背景

とあるシステムのアカウント(複数)を組織内で共用しており、重複ログインを避けるため共有エクセルの予約表に必要事項を記入し、使用終了したら記入事項を削除する、という方法をとっていた。
記入事項の消し忘れが頻繁に発生し、使用中か都度確認するという手間が発生していた。これを解決したかった。
Outlookにそのアカウント用の予定表を作るだけだとログイン時に必要なそのアカウントのIDやパスワードを参照できず、Microsoft Bookingsもしかりだし想定するアクションを実行できない。
よって本来のデータベースとしての使用用途とは異なるが、柔軟性のあるShare Pointのリストを用いることとした。

解決方法の概要

条件分けの内容を示してもあまり参考にならないだろうし見づらくなるのでまとめてしまうと下図のように非常にシンプルです。

トリガーがアイテム変更時で、最初のアクションで変更したアイテムの内容を取得します。その後取得したアイテムの内容に応じたアクションを行います。
なお、今回対象としたリストの内容は下図のような感じです。

ID、パスワード、ユーザー、終了予定時刻、次回予約者、コメント
から成ります。(ID、パスワードは参照用なので本当は編集不可にしたいところ。。)
それぞれのアイコンが示すようにユーザー、終了予定時刻、次回予約者はそれぞれ適当な(?笑)データ型での入力となっています。なんと表現すればいいのかわからない。。。テキスト型ではないということ。。。リスト使っている方ならわかりますよね!


解決方法の詳細

①トリガー:「アイテムが作成または変更されたとき」

SharePointのトリガーのひとつです。

②アイテムやファイルの変更を取得する

IDには「ID」を設定。おそらく変更されたアイテムの識別子かな?
「以降」で「ウィンドウの開始のトークントリガー」を入力。

③条件分けとアクションの繰り返し

ここからは私の用途のための設定になりますのでほとんどの方の参考にはならないでしょう。
条件分けは下記の通り行いました。

条件1 「終了予定時刻」が変更されている:はい
 L 条件2「ユーザー」が存在しない
  L はい
   L条件3「次回予約者」がいる
    L はい → 「次回予約者」にチャット送信
  L いいえ → 「終了予定時刻」に「ユーザー」にチャット送信

条件1「終了予定時刻」が変更されている:はい

動的コンテンツ「列が変更されています。終了予定時刻」で示されるプール値を基準にしました。今回は時刻が変更されていない場合は通知の必要な変更以外の変更が行われたと判断できるので、時刻の変更があった場合(=「はい」)の処置を連ねていきました。


条件2「ユーザー」が存在しない

動的コンテンツを対象に、その有無で判断させます。
データ型がユーザー型(??)だとコンテンツのタイプに「Claims」「DisplayName」「Email」など色々ありますがここでは特にどれでも構わなかったです。

この条件に対して「いいえ」、つまり「ユーザー」が存在する場合には終了予定時刻に「ユーザー」に対してチャットを飛ばしたいので下記のようなアクションを追加しました。

「延長期限」を使って、「終了予定時刻」にアクションが起こるようにします。
(※「メモ」に記載の通り、ここのFLOWは若干の差異修正しました)

しかし!ここで落とし穴が!!
リストから取得されたタイムスタンプの認識されるタイムゾーンと、Workflowsが動くタイムゾーンが異なっているため、「終了予定時刻」をそのまま「延長期限」に入れ込んでも意図した時刻にアクションは起こりません!
(ナニイッテルノ?)

簡単なフローを組んでそれぞれのタイムゾーンを確認してみたところ、私の場合は
リストから取得される「終了予定時刻」は日本時間で記入していてもWorkflowsで取得されるときには「日本時間+7h」に変換されており
一方Workflowsが動くタイムゾーンは「日本時間-9h」なんですね。
(ナニイッテルノ?)

したがって「延長期限」に入力するためにはまず
①「日本時間+7h」に変換された「終了予定時刻」から7時間引く
②Workflowsのタイムゾーンに合わせてさらに9時間引く
必要があります。
つまり「終了予定時刻」から合計16時間引いたタイムスタンプにします。
(アクション「タイムゾーンの変換」よりも簡単。)
よってここでは関数「addHours」の変数部分に「終了予定時刻」、数字として「-16」を入れ込んでおきました。
(※SharePointのサイト管理者であればSharePointのタイムゾーンの変更ができるので予め確認して対応しておくとよさそう)

さて、アクションを指定時刻に実行するための準備が整いましたので、あとはアクションの内容を整えるだけです。

今回は「ユーザー」に「終了予定時刻」になったらチャットを飛ばします。
設定は図の通りで、「Recipient」には取得済みの「ユーザー Email」を指定します。(他は知りませんが私のところのUPNはメールアドレスでした。)
次に使いたい人がいる場合はさっさと使用をやめてほしいのでこんな文面にしてあります。
ITEMを探す手間を省く意図でアイテムへのハイパーリンクを貼っています。

ここまで、「終了予定時刻」の変更があり、「ユーザー」が存在した場合、つまり新規の予約もしくは予約時間の変更を行った場合のアクションの説明を行いました。
ここからは「終了予定時刻」の変更があったけど「ユーザー」が存在しない場合=使用が終了したときのアクションになります。

条件3「次回予約者」がいない

「終了予定時刻」の変更があったけど「ユーザー」が存在しない場合=使用が終了したとき、「次回予約者」がいた場合にはチャットを飛ばします。

条件はコンテンツの有無であり、ここでは「次回予約者」が「いない」(=null)で判別しています。
なぜかここでは、「いない」と「等しくない」かどうか、を判別する式になっています。。なんとなくでしょうね。

"「いない」と等しくない"に対して「はい」=「次回予約者」がいる場合のアクションです。

ここでも「Recipient」にはアイテムから取得される「次回予約者 Email」を設定し、本文にはリストへのハイパーリンクを貼っています。

以上が今回のフローの全容になります!お疲れさまでした!

コメント

・リストのアイテムのフィールドとしてアカウントIDとパスワードを入れているのだが、コピペするためなので編集不可にしたいが妥当な方法がない。
一度「終了予定時刻」を変更した場合は必ずチャットが飛ぶようになってしまう。終了予定時刻前に記載を削除した場合や、延長した場合などには当初の終了予定時刻にはチャットが飛ばないように=元のアクションがキャンセルされるようにしたいが難しそう。
→「延長期限」のアクションとして、「終了予定時刻」になったらその時点での「終了予定時刻」を取得し、当初取得していた「終了予定時刻」と同じだったらチャットを飛ばすように変更して解決!
・リストをこんな使い方するだなんて。。。
・タイムゾーンのずれにはびっくり。→そもそもリストで日付を入力する際に表示されるカレンダーの「今日の日付」がズレてることに気がついた笑。所属組織のSharePointのタイムゾーンの設定ゆえんのよう。管理者でなければそこは変更できない。。

参考にしたサイト:



この記事が気に入ったらサポートをしてみませんか?