ノートや手帳などに出勤時刻と退勤時刻のメモ取ってる人とかたまにいますよね。今回はそれらのメモをPowerAutomateを使ってやってみましょう、というお話です(∩´∀`)∩
構成
今回はスマホからお手軽に時刻をメモできるように、PowerAutomateのボタンを使用してみます。PowerAutomateって何?という方は↓の記事もご覧ください。
そして時刻メモのデータはSharePointのリストにアイテムとして登録します。リストアイテムなら後から参照したり、PowerAppsや他のシステムから参照やら連携やらもしやすいかな、、と。あとお手軽ですからね(∩´∀`)∩
今回はPowerAutomateでメモる部分までで、PowerAppsで読み込んだり更新したりは作成しません。
作ってみる
それでは早速作っていきませう。
SharePoint側の作業
SharePint側の作業としては出退勤時刻や日付などを管理するためのリスト作成があります。という訳で適当なのを作りました。↓
そして列は以下の列を作成しました。
- workingDate (日付と時刻)
- start (日付と時刻)
- end (日付と時刻)
- remarks (1行テキスト)
仕事した日付、出勤時刻、退勤時刻、備考欄といった感じです。日時に関する列は日付と時刻列にしておきました。
Flow側の作業
今回はお手軽に日時を記録する目的ですので、PowerAutomateのモバイルアプリからボタンを押すと日時が記録されるような作りにします。
では早速作っていきましょう。まずはブラウザでPowerAutomateの管理画面を開き、マイフロー > +新規 > インスタント―空白から作成 を選択します。
ビルド(作成)前の設定画面が表示されるので「フロー名」に分かりやすい名前を入力し、「PowerAutomate から」を選択して「作成」ボタンを押下します。
↑のようなPowerAutomate作成画面に切り替わるので「+新しいステップ」ボタンを押下します。
「現在の時刻」などで検索し、「現在の時刻」というアクションを選択します。これは名前の通り、時刻を取得するアクションで、取得した値を出退勤の時刻として利用します。
同様にしてSharePointのリストからアイテムを取得するアクションを追加します。アクション名は「複数の項目の取得」です。
何を取得するのかというと、出勤時に登録したアイテムの情報です。アイテムが無かったらまだ出勤していないので出勤情報を登録し、アイテムがあったら退勤情報を登録する、そんな作りにします。
設定内容ですが、サイトのアドレスとリスト名には使用するサイト、リストを指定します。
フィルタークエリには以下の内容を入力してください。シングルクォーテーションで囲われた部分は動的なコンテンツの式として入力する必要があります。
Title eq 'formatDateTime(convertTimeZone(utcNow(), 'UTC', 'Tokyo Standard Time'),'yyyyMMdd')'
ここではタイトルが 現在時刻(UTC+0)を東京の時間に直してyyyyMMddの形式にしたものと等しいアイテム を取得するというフィルタをかけています。
この後の新規アイテム登録処理内でタイトルに年月日を 20190706 の形式で登録する予定ですので、それと現在時刻の日時部分が一致したら取得するという訳です。デスマーチやらで0時まわってから退勤というパターンは考慮しません。
次に制御コネクタの条件というアクションを追加します。前項で値が取得できたかどうか、このアクションでチェックして処理を分岐させます。
条件には以下の内容を入力し、次の値に等しい 0 と入力します。
length(body('複数の項目の取得')?['value'])
lengthは動的なコンテンツの 式 から入力し、body(‘複数の項目の取得’)は「アイテムの一覧」を選択します。
取得した値の長さが 0 であれば アイテムが取得できていない = 未登録状態 という訳です。
続いて条件が真だった場合と偽だった場合の処理をそれぞれ登録していきます。
真だった場合、まだアイテムが登録されていませんので新規に登録します。要するに出勤時の処理です。これにはSharePointトリガーの項目の作成アクションを使用します。
んでタイトルには以下の内容を、workingDateにはボタンを押した日付、startには現在時刻を設定しています。
formatDateTime(body('現在の時刻'),'yyyyMMdd')
いいえの場合は取得できたアイテムに退勤時刻を入れて更新します。更新は項目の更新というアクションを使います。
また、このアクションを追加してIDまで入力するとApply to eachという枠が自動で追加されます。これはIDが複数取得される場合があるため、繰り返し処理を行ってすべてのIDに対して処理を行えるようにする為です。
タイトルやworkindDate列は必須入力項目なので取得したアイテム自身の値をそのままセットしています。上の図でstartのように値を指定しない場合、その列は更新されません。
ここまでやったら保存して完成です。
実行してみる
では早速実行してみましょう。スマホのPowerAutomateアプリからボタンを押してみます。
↑実行前のリストの状態
実行したのが7月7日の0時22分です。タイトルとworkingdateが6日になっちゃってますね。しかしstartの値はちゃんと7日の0時22分になっている。。
なんでこうなってしまうのかというと、世界標準時と日本とで時差があるからなんです。
タイトルに使用している現在時刻は最初にアクションで取得した現在の時刻です。こいつはUTC+0の値が取得されるため、日本よりも9時間早い時間が取得されます。その為6日の15時くらいが取得されています。こいつをyyyyMMdd形式の文字列にしている為、前日の日付が入ってしまっています。
次にworkingDateですが、これもUTC+0の日付が取得されますので前日の日付が入っています。
ではstartは何故正しい値が入っているのでしょうか(´・ω・`)???
この項目もタイトルに使用している時間と同じ値を使用していますので、実はUTC+0の値が入っています。しかし、SharePointのサイト設定でタイムゾーンをUTC+9(東京、大阪、札幌)にしている為、気を利かせて変換した値を出してくれているのです。逆にFlow側で変換した値を登録すると時間がずれてしまということです。
という訳で、、、タイトルに使用する時刻はUTC+9に変換した値を使用するよう変更します。※単なる文字列なのでSharePoint側で変換等してくれない為
またworkingDateは日付だけではなく時刻も持った状態で渡すようにし、リスト側も時刻を持たせるように変更します。※時刻が無いと0~9時がUTC+0でも+9でも前日となってしまう為
はい、ちゃんと正しい日時が入りました。全項に日時両方入っちゃってて見にくいけど気にしたら負け(∩´∀`)∩
まとめ
割と簡単な設定で日時を記録できるフローが作成できました。
時間に関してはデータ登録する先によってタイムゾーンの変換が必要だったり不要だったりして少し分かりにくい所ではありますが、慣れてくるとなんとかなるもんです。
勤怠以外にもライフログに活用したりすることもできますので、練習がてら何か作ってみてはいかがでしょうか。
コメント