13.4K Views
March 18, 23
スライド概要
気ままに勉強会 #49 登壇資料です。
https://kimamani.connpass.com/event/274882/
Exchange Online 予定表から「別のモノ(今回は Googleカレンダー)」へ連携する際に、定期的なイベントの闇をお伝えしております。
Exchange Online 予定表 から Googleカレンダー に同期してみよう ~ 繰り返し予定 対応(?)版 ~ 2023/03/18(土) 気ままに勉強会 #49 山田 晃央(Yamada, Teruchika) Microsoft MVP Business Applications 2020 - @yamad365 https://qiita.com/yamad365
今日お伝えしたいコト • Power Automate で M365 の予定を取り扱う場合、 「Exchange Online における予定の内部的な構造」 を知っているとイイヨ👍 • Exchange Online(以降、ExO)の “定期的なイベント”(繰り返しの予定)は🤬(自粛 • Power Automate で「予定表の連携」は完璧には無理 ⇒ 悪夢を実体験する前に現実を知ろうッ!!
諸注意 1/2 • 2023 年 2 月 時点の Microsoft 365 環境における情報になります • 「そのフローが欲しいです」は対応しません。 ご自身で調べて試してください • 当方の調査結果にもとづく、 “やまさんの想定”が含まれます
諸注意 2/2 • Exchange Onlie は ExO と略す場合があります。 • 説明のなかで、予定・会議・アイテムと “イベント”と用語が混在する可能性大です。 適宜、前後の文脈から脳内補完してください。
自己紹介 ども、やまさんデス!
◼ Microsoft MVP Business Applications Power Apps 、Power Automate ◼ お気軽に「やまさん」とお呼びください ◼ あるいは「火消魂のヒト」 ◼ 「yamad365」で検索ください https://qiita.com/yamad365 yamad365
Microsoft Power Apps入門 手を動かしてわかるローコード開発の考え方 翔泳社 https://www.shoeisha.co.jp/book/detail/9784798170558 SNS で感想をおよせいただく際は、 ハッシュタグ「#JYApps本」でお願いします 小玉さんと共著です
https://appsweeklynews.connpass.com 毎週 金曜日 21時30分 から YouTube Live で Power Apps ブログ更新をネタに語ってます
はじめに 基本的なトコは 弊 Qiita 記事を参照願います(時間が足りない!) #気ままに勉強会
やりたかったコト ※別のモノ でも可 Exchange Online 予定表 Google カレンダー
前提知識は Qiita を参照ください https://qiita.com/yamad365/items/830b64954dcdfcb91fe2 https://qiita.com/yamad365/items/4765b701a9dd2c46367b https://qiita.com/yamad365/items/4e64d068e97c6cb3726b 説明するには 時間が足りぬ
今日の話題はコレ特化です! Power Automate Office 365 Outlook コネクター 定期的なイベント(繰り返しの予定)あれこれ https://qiita.com/yamad365/items/ed8f37dff2a809487ada
Power Automate と ExO 定期的なイベント 公式ドキュメントで欲しい情報が見つからなかったので、いろいろ試して調べてみました…。 #気ままに勉強会
「トリガーの既知の問題と制限」 •公式情報は読んでおく。重要です👍 https://learn.microsoft.com/jajp/connectors/office365/?WT.mc_id=BA-MVP-5004053#knownissues-and-limitations-with-triggers
トリガー設定の「分割」がオンです • 「イベントが追加、更新、削除 されたとき(V3)」の設定は 『分割』=オン 状態の情報です。 ※2023年3月時点はデフォルトで左図状態 • 参考情報 Hiro さん、大感謝!! https://mofumofupower.hatenabl og.com/entry/2020/03/17/00000 0_1
定期的な イベントは 全アイテムで 発火 ※「定期的なイベント」の繰り返しされたぶん 全ての予定がトリガーされます
定期的なイベントは全アイテムで発火 30回あれば 30回 発火
予定の 新規作成時 フローが 2回発火する ※「定期的なイベント」だけでなく、 全ての予定で新規作成の場合に発生します
予定の新規作成時 フローが2回発火する
繰り返しの予定でも同現象が発生 30回あれば 30回 発火x2
予定の新規作成時 フローが2回発火する 仕様デス (´・ω・`)
途中の 予定削除は 認識困難 「定期的なイベント」の途中を削除した場合、 『削除』のトリガーではなくて 『更新』のトリガーで発火します😇
途中の予定削除は認識困難 「歯抜け」 がわからぬ (´・ω・`)
定期的な イベントを “全て”削除 した場合は 大元のみ トリガー 「定期的なイベント」の途中を削除した場合は 『更新』でしたよね? “全て”を削除した場合は・・・
定期的イベント“全て”削除した場合 1個しか発火 しません (´・ω・`)
定期的なイベントの内部構造イメージ
まず、単体のイベント内部構造イメージ プロパティ 概要 ID 予定アイテムの一意のKey Start 予定の開始時間(UTC) : : seriesMasterId 定期イベントの大元 ID : : Graph API や Exchange Web Services (EWS) で予定表からデータを取得してみると内部情報が確認できます。 Power Automate でも実行結果や「作成」アクションなどで中身を確認できます。 https://learn.microsoft.com/ja-jp/graph/api/resources/event?view=graph-rest-1.0&WT.mc_id=BA-MVP-5004053#properties
繰り返しの予定毎に ID が異なる 例えば、16 ~ 18日 まで毎日繰り返しの予定 実行結果より n月16日 id = xxx… n月16日 id = xx2… n月16日 id = xx3…
seriesMasterId がキモ seriesMasterId で予定を取得すると、 『繰り返しのマスター予定』が取得できる! マスター予定 n月16日 id = xx3… seriesMasterId = xyz… n月16日 id = xyz… おそらく、全削除の場合は、 このマスター予定が消される n月16日 id = xx2… seriesMasterId = xyz… n月16日 id = xxx… seriesMasterId = xyz…
Power Automate で ExO 予定表連携 定期的なイベントに可能な限り対応した Ver. のポイントだけ案内します #気ままに勉強会
まず、予定表連携フローの設計 • 「定期的なイベント」以外の連携は既に実績があるので割愛 • 重要なのは『ID』(予定の一意Key)を連携先にも埋め込むコト • 「定期的なイベント」の対応を考える • 新規追加は“全て発火”するので単純な登録で OK だろう • 変更(部分的な削除・変更)も“全て発火する” ⇒ イチバンの問題は「部分的な削除」が検知できない ⇒ どうするか? (は後で説明しますが設計時に悩むべきかなぁ • 削除は“マスター予定”が消されるのみ ⇒ 全部の予定がトリガーされないのでどうするか?
実際は、 検証用のフロー等を作成して、 前述のように大量に試しています。 事前の調査と設計は重要。
フロー 全体像
フロー 全体像 トリガー & 前処理 (C) 削除 (A) 追加 (B) 更新
トリガー&前処理 ここは Qiita に詳細書いてあるので割愛! トリガーの「アクションの種類」(ActionType) で分岐 追加 = added 変更 = updated 削除 = deleted
(A) 追加 ~連携先へ新規登録~ ここは Qiita に詳細書いてあるので割愛! [ID]と[シリーズマスターID](seriesMasterId) コレを連携先の本文に埋め込むのが超重要!!
(B)更新 は深いので別けて説明します (B) 更新 (B-01) 単体予定の更新 (B-02) 定期的なイベントの更新
(B) 更新 の最初 [繰り返し](recurrence) で分岐 none = 繰り返し無し
(B-01)単体予定の更新 ここは Qiita に詳細書いてあるので割愛! 連携先に対象があれば「更新」 [ID]と[シリーズマスターID] (seriesMasterId) コレを連携先の本文に埋め込むの が超重要!! 連携元は「更新」だけど連携先に対象が 無い場合は「新規追加」をして補完している
(B-02)定期的なイベントの更新 [シリーズマスターID](seriesMasterId)で 絞り込んで『マスター予定』を取得する 上で取得した『マスター予定』と『いま処理している予定』 が同じ = “定期的なイベントの先頭”と判断して、 連携先に登録してある「繰り返しの予定」を全削除 ※歯抜けの予定が判定できないから1回全削除しかねぇ! 予定を連携先へ追加。 これで“歯抜けの予定”も同期できる
(C)削除 連携先から[ID]を本文に含んだ対象を取得 ※“定期的なイベント”が全て取得される → [シリーズマスターID](seriesMasterId) が埋め込まれてますよね!! 上記で取得した対象を全て削除する つまり、 “定期的なイベント”も全て削除される
これで、 ExO 予定表 → 連携先へ同期 が実現できます。 ※“カンペキ”ではない。 ※諸注意アリ💦
諸注意 #気ままに勉強会
(B-02)定期的なイベントの更新 では「繰り返しの先頭のみ削除」だと破綻 上で取得した『マスター予定』と『いま処理している予定』 が同じ = “定期的なイベントの先頭”と判断する際に、 『開始時間が同一か?』で判定している。 つまり、「先頭の予定を単体削除」されると詰む。 いろいろと調べてみたけれども、 Power Automate で得られる情報では 「先頭の予定が単体削除された」場合 における回避策が現時点だと対応でき ないんです・・・;つД`)
連携先の API 制限などに注意 例で紹介している連携先 = Googleカレンダー 相手側の API 制限などでコケる。 とくに定期的なイベントは連続登録に なるので、Sleep(遅延)を入れるなり、 エラー時にリトライさせるなりが必要。
他にも色々と罠があるけども、 「長期の繰り返し予定」 は特に意図しない動作をします。 つまり“カンペキな同期”は無理
結び #気ままに勉強会
まとめ Power Automate 便利♪ でも 連携相手の仕様も重要
???「Automate で予定表連携します」 ワイ「そんな気軽な考えで大丈夫か?」 出典「El Shaddai(素材)無料倉庫」http://elshaddai.jp/elshaddai_crim/freedeta.html
『最適解』で頼む 「やりたいコト」が実現できるなら OK です。 ただ“連携する先”の仕様はおさえましょう。 『仕様』と『仕組み』がわかっていないと、 意図しない結果に翻弄される未来が待ってます。 出典「El Shaddai(素材)無料倉庫」http://elshaddai.jp/elshaddai_crim/freedeta.html
結び 「調査と設計」が重要 「実装は最適解」で OK
まず「作る」「試す」。 話はソレからだ。
貴方のアイディアと、 ほんの小さな仕組みで、 未来が明るくなるかも。
素晴らしい Power Platform Lifeを!
ありがとうございました Thank you Merci Danke schön 고맙습니다 Obrigado Gracias