66.7K Views
May 28, 22
スライド概要
気ままに勉強会 #17 でLTさせていだたきました。
Exchange Online と Power Automate を連携する際に利用する「Office 365 Outlook コネクタ」でハマった話です。
ODataフィルタークエリやタイムゾーンの取り扱いなどについて
https://kimamani.connpass.com/event/247418/
続編の2もあります。
https://www.docswell.com/s/fworlddocs/5RJGGZ-2022-06-18-210000
Microsoft 365 , Power Platform ( Power Apps | Power Automate )とか
Office 365 Outlook コネクタであれこれハマった話 @flali_world OData フィルタークエリ と 時間の取扱い 気ままに勉強会 #17 2022/05/28
PROFILE NAME : ふらり @ ROBO BOY Twitter : @flali_world Blog : https://flali.hatenablog.com/ Docs : https://www.docswell.com/user/fworlddocs @flali_world 2
はじめに 本資料に掲載されている内容は、 いつか人になりたいと思っている 🤖の空想上の出来事です。 内容間違っていたらごめんなさい。 @flali_world 3
なかま、なかま、5人のなかーまー “Power Rangers” @flali_world 4
Office 365 Outlook コネクタ とは? Office 365 Outlook コネクタ 今月の予定ちょうだい Exchange Online はい、これやで Office 365 Outlook - Connectors | Microsoft Docs @flali_world 5
Office 365 Outlook コネクタ トリガー : 9 アクション : 34 @flali_world 6
予定の一覧を取得するコネクタは2つある イベントの取得(V4) イベントカレンダービューの取得 @flali_world 7
OData フィルター クエリ の書き方がわからん?? まずは、「イベントの取得(V4)」を使ってみました。 あれ、期間を指定したけど、OData フィルタークエリってどうかくの? Office 365 Outlook - Connectors | Microsoft Docs @flali_world 8
コネクタはAPIをかんたんに使えるようにしたもの Office 365 Outlook コネクタ 今月の予定ちょうだい Exchange Online はい、これやで Office 365 Outlook - Connectors | Microsoft Docs @flali_world 9
コネクタの Docs を確認 🧞「おいおい、Docsとアクションの名称ちがうやないかーい」 🤖「操作IDは同じデスネ…Microsoft Graph API ガ ツカワレテイマス」 Office 365 Outlook - Connectors | Microsoft Docs @flali_world 10
Microsoft Graph API で OData フィルター クエリ を確認 GET https://graph.microsoft.com/v1.0/me/calendars/{id}/events?$filter=Subject eq 'welcome' and importance eq 'normal' GET https://graph.microsoft.com/v1.0/me/calendars/{id}/events 自分の/カレンダー/カレンダーID/イベント 取得する ?$filter=Subject eq 'welcome' and importance eq 'normal' フィルター は 件名 = ‘welcome‘ と 重要度 = 'normal' クエリ パラメーターを使用して応答をカスタマイズする - Microsoft Graph | Microsoft Docs メール、予定表、連絡先、タスク REST API (バージョン 2.0) のリソース リファレンス | Microsoft Docs イベントを一覧表示する - Microsoft Graph v1.0 | Microsoft Docs @flali_world 11
コネクタとAPIの対応 GET https://graph.microsoft.com/v1.0/me/calendars/{id}/events?$filter=Subject eq 'welcome' and importance eq 'normal' $filter : 結果(行)をフィルター $orderby : 並べ替え $top : 上からいくつ取得するか $skip : スキップする… パラメーター クエリ パラメーターを使用して応答をカスタマイズする - Microsoft Graph | Microsoft Docs メール、予定表、連絡先、タスク REST API (バージョン 2.0) のリソース リファレンス | Microsoft Docs イベントを一覧表示する - Microsoft Graph v1.0 | Microsoft Docs @flali_world 12
OData フィルター クエリ の 演算子 演算子の種類 近接演算子 関係演算子 ラムダ演算子 条件演算子 Functions オペレーター 内容 例 eq Equal 等しい subject eq 'welcome' ne Not Equal 等しくない subject ne 'welcome' not 論理否定 any内の否定はneではなくnotを利用 in 含む subject in ‘elcom' lt 未満 Less then start/dateTime lt '2022-05-28T00:00:00Z' gt より大きい start/dateTime gt '2022-05-28T00:00:00Z' le 以下 start/dateTime le '2022-05-28T00:00:00Z' ge 以上 start/dateTime ge '2022-05-28T00:00:00Z' any コレクションのすべての評価? all すべて (サポートされていない?) and および subject eq 'welcome' and importance eq 'normal' or または subject eq 'welcome’ or importance eq 'normal' startsWith 次で始まる startsWith(subject, 'wel’) endsWith 次で終わる startsWith(subject, ‘come’) contains 次を含む クエリ パラメーターを使用して応答をカスタマイズする - Microsoft Graph | Microsoft Docs @flali_world 13
Exchange Online 側の項目 プロパティ 種類 内容 start/dateTime DateTime 開始日時 start/timeZone TimeZone 開始日時 のタイムゾーン end/dateTime DateTime 終了日時 end/timeZone TimeZone 終了日時 のタイムゾーン subject String 件名 body/content String メッセージ本文 body/contentType bodyType メッセージ本文 text or html isAllDay Boolean 終日予定 ture,false sensitivity String normal, personal, private , confidential. privete は鍵付きの予定 event resource type - Microsoft Graph v1.0 | Microsoft Docs @flali_world 14
よし!今日の予定を取得しよう 🤖「OData フィルタークエリ、これでウマク イク ハズ ダ」 @flali_world 15
だめでした 🧞「09:00より前の予定がないね…。ほかの日もこれだとだめだよね」 🤖「…(ジブン デ ツクレヨ)」 Start/DateTime ge '2022-05-28 00:00:00' and Start/DateTime le '2022-05-29 00:00:00' @flali_world 16
JST と UTC UTC + 9:00 という概念が大事 日本 UTC + 9 Japan Standard Time 世界協定時 UTC Coordinated Universal Time 2022-05-26 00:00:00 2022-05-25 15:00:00 2022-05-26T15:00:00 + 9:00 2022-05-25T15:00:00Z Microsoft Power オートメーションでのタイムゾーンの変換 @flali_world 17
UTCを意識しよう! 日本時間 の 今日の00:00-09:00 09:00 UTC では 前日の15:00-00:00 00:00 00:00 5/26 5/25 この範囲の予定は 自分が取扱いたいタイムゾーン 15:00 UTCだとこの範囲 Power Automate の基本はこっち @flali_world 18
今日(現在)の日本時間を取得したい • utcNow → 現在タイムスタンプの取得(UTC) • convertTimeZone 関数 や addHours 関数 で変換できる(他にもある) utcNow() を入れるとアクション実行時点の時間 “Z” には意味がある 式関数のリファレンス ガイド - Azure Logic Apps | Microsoft Docs 標準の日時書式指定文字列 | Microsoft Docs @flali_world 19
各アクションで共通の時刻を利用したい • フロー内で共通の基準となる時刻の利用は大事 トリガーの実行時刻を利用する 「現在の時刻」アクションの利用 変数で作成しておく 式関数のリファレンス ガイド - Azure Logic Apps | Microsoft Docs 標準の日時書式指定文字列 | Microsoft Docs @flali_world 20
Power Automate の処理中はUTCを基本に • 書式を無視しても動作はするが、ルールは大事。”Z” も忘れずに 2022-05-28T21:00:00Z 日付と時刻の間はT リテラル値 “Z”はUTCを表す “Z”がなければローカル 式関数のリファレンス ガイド - Azure Logic Apps | Microsoft Docs 標準の日時書式指定文字列 | Microsoft Docs @flali_world 21
今日(現在)の日本時間の0時を取得したい addHours(utcNow(),9) UTC +9 で考えないと00:00– 09:00 の予定で痛い目見る startOfDay(addHours(utcNow(),9)) タイムスタンプに対してのその日のはじまりを取得 addHours(startOfDay(addHours(utcNow(),9)),-9) さらに-9時間しUTCのタイムゾーンで日本時間のその日の0時を取得 式関数のリファレンス ガイド - Azure Logic Apps | Microsoft Docs @flali_world 22
明日の0時を取得したい addDays(addHours(startOfDay(addHours(utcNow(), 9)), -9),1) 1日足す 式関数のリファレンス ガイド - Azure Logic Apps | Microsoft Docs @flali_world 23
おまけ:日時のフォーマットを指定できます。 日付と時刻の関数は、フォーマットを指定して取得できます。 addHours('<timestamp>', <hours>, '<format>') <format>で取得する日時のフォーマットを指定できる addHours(‘2022-05-28T12:00:00Z’, 9, ‘yyyy/MM/dd HH:mm:ss') 大文字小文字は意味がある 式関数のリファレンス ガイド - Azure Logic Apps | Microsoft Docs カスタム日時形式文字列 | Microsoft Docs @flali_world 24
よし!今日の予定を取得しよう 🤖「コレデ、ヨシ」 @flali_world 25
できました! 🤖「デキマシタ」 🧞「ちゃんとやってもらわないと困るよ」 🤖「…(オイ)」 @flali_world 26
おまけ : 並べ替え 取得するデータの順番は必ずしも順番通りではない点に注意 内容 例 asc 昇順(初期値、省略可) Start/DateTime asc desc 降順 Start/DateTime desc クエリ パラメーターを使用して応答をカスタマイズする - Microsoft Graph | Microsoft Docs @flali_world 27
実は…他にも あるんですが… 時間の関係で ここまで @flali_world 28
さいごに まとめ
まとめ OData フィルター クエリ は怖くないよ タイムゾーンを意識しよう まだまだ、ほかにも “ネタ” あるよ @flali_world 30
本日は、特別スライドでお届けしましたー(‘Д’) @flali_world 31
Thank you !