Exchange Online 予定表 から Googleカレンダー に同期してみよう ~ 繰り返し予定 対応(?)版 ~

9.8K Views

March 18, 23

スライド概要

気ままに勉強会 #49 登壇資料です。
https://kimamani.connpass.com/event/274882/

Exchange Online 予定表から「別のモノ(今回は Googleカレンダー)」へ連携する際に、定期的なイベントの闇をお伝えしております。

profile-image

I ❤ Power Platform & HiKESHi SPiRiT (火消魂) Microsoft MVP for Business Applications 2020 - Power Apps & Power Automate

シェア

またはPlayer版

埋め込む »CMSなどでJSが使えない場合

関連スライド

各ページのテキスト
1.

Exchange Online 予定表 から Googleカレンダー に同期してみよう ~ 繰り返し予定 対応(?)版 ~ 2023/03/18(土) 気ままに勉強会 #49 山田 晃央(Yamada, Teruchika) Microsoft MVP Business Applications 2020 - @yamad365 https://qiita.com/yamad365

2.

今日お伝えしたいコト • Power Automate で M365 の予定を取り扱う場合、 「Exchange Online における予定の内部的な構造」 を知っているとイイヨ👍 • Exchange Online(以降、ExO)の “定期的なイベント”(繰り返しの予定)は🤬(自粛 • Power Automate で「予定表の連携」は完璧には無理 ⇒ 悪夢を実体験する前に現実を知ろうッ!!

3.

諸注意 1/2 • 2023 年 2 月 時点の Microsoft 365 環境における情報になります • 「そのフローが欲しいです」は対応しません。 ご自身で調べて試してください • 当方の調査結果にもとづく、 “やまさんの想定”が含まれます

4.

諸注意 2/2 • Exchange Onlie は ExO と略す場合があります。 • 説明のなかで、予定・会議・アイテムと “イベント”と用語が混在する可能性大です。 適宜、前後の文脈から脳内補完してください。

5.

自己紹介 ども、やまさんデス!

6.

◼ Microsoft MVP Business Applications Power Apps 、Power Automate ◼ お気軽に「やまさん」とお呼びください ◼ あるいは「火消魂のヒト」 ◼ 「yamad365」で検索ください https://qiita.com/yamad365 yamad365

7.

Microsoft Power Apps入門 手を動かしてわかるローコード開発の考え方 翔泳社 https://www.shoeisha.co.jp/book/detail/9784798170558 SNS で感想をおよせいただく際は、 ハッシュタグ「#JYApps本」でお願いします 小玉さんと共著です

8.

https://appsweeklynews.connpass.com 毎週 金曜日 21時30分 から YouTube Live で Power Apps ブログ更新をネタに語ってます

9.

はじめに 基本的なトコは 弊 Qiita 記事を参照願います(時間が足りない!) #気ままに勉強会

10.

やりたかったコト ※別のモノ でも可 Exchange Online 予定表 Google カレンダー

11.

前提知識は Qiita を参照ください https://qiita.com/yamad365/items/830b64954dcdfcb91fe2 https://qiita.com/yamad365/items/4765b701a9dd2c46367b https://qiita.com/yamad365/items/4e64d068e97c6cb3726b 説明するには 時間が足りぬ

12.

今日の話題はコレ特化です! Power Automate Office 365 Outlook コネクター 定期的なイベント(繰り返しの予定)あれこれ https://qiita.com/yamad365/items/ed8f37dff2a809487ada

13.

Power Automate と ExO 定期的なイベント 公式ドキュメントで欲しい情報が見つからなかったので、いろいろ試して調べてみました…。 #気ままに勉強会

14.

「トリガーの既知の問題と制限」 •公式情報は読んでおく。重要です👍 https://learn.microsoft.com/jajp/connectors/office365/?WT.mc_id=BA-MVP-5004053#knownissues-and-limitations-with-triggers

15.

トリガー設定の「分割」がオンです • 「イベントが追加、更新、削除 されたとき(V3)」の設定は 『分割』=オン 状態の情報です。 ※2023年3月時点はデフォルトで左図状態 • 参考情報 Hiro さん、大感謝!! https://mofumofupower.hatenabl og.com/entry/2020/03/17/00000 0_1

16.

定期的な イベントは 全アイテムで 発火 ※「定期的なイベント」の繰り返しされたぶん 全ての予定がトリガーされます

17.

定期的なイベントは全アイテムで発火 30回あれば 30回 発火

18.

予定の 新規作成時 フローが 2回発火する ※「定期的なイベント」だけでなく、 全ての予定で新規作成の場合に発生します

19.

予定の新規作成時 フローが2回発火する

20.

繰り返しの予定でも同現象が発生 30回あれば 30回 発火x2

21.

予定の新規作成時 フローが2回発火する 仕様デス (´・ω・`)

22.

途中の 予定削除は 認識困難 「定期的なイベント」の途中を削除した場合、 『削除』のトリガーではなくて 『更新』のトリガーで発火します😇

23.

途中の予定削除は認識困難 「歯抜け」 がわからぬ (´・ω・`)

24.

定期的な イベントを “全て”削除 した場合は 大元のみ トリガー 「定期的なイベント」の途中を削除した場合は 『更新』でしたよね? “全て”を削除した場合は・・・

25.

定期的イベント“全て”削除した場合 1個しか発火 しません (´・ω・`)

26.

定期的なイベントの内部構造イメージ

27.

まず、単体のイベント内部構造イメージ プロパティ 概要 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

28.

繰り返しの予定毎に ID が異なる 例えば、16 ~ 18日 まで毎日繰り返しの予定 実行結果より n月16日 id = xxx… n月16日 id = xx2… n月16日 id = xx3…

29.

seriesMasterId がキモ seriesMasterId で予定を取得すると、 『繰り返しのマスター予定』が取得できる! マスター予定 n月16日 id = xx3… seriesMasterId = xyz… n月16日 id = xyz… おそらく、全削除の場合は、 このマスター予定が消される n月16日 id = xx2… seriesMasterId = xyz… n月16日 id = xxx… seriesMasterId = xyz…

30.

Power Automate で ExO 予定表連携 定期的なイベントに可能な限り対応した Ver. のポイントだけ案内します #気ままに勉強会

31.

まず、予定表連携フローの設計 • 「定期的なイベント」以外の連携は既に実績があるので割愛 • 重要なのは『ID』(予定の一意Key)を連携先にも埋め込むコト • 「定期的なイベント」の対応を考える • 新規追加は“全て発火”するので単純な登録で OK だろう • 変更(部分的な削除・変更)も“全て発火する” ⇒ イチバンの問題は「部分的な削除」が検知できない ⇒ どうするか? (は後で説明しますが設計時に悩むべきかなぁ • 削除は“マスター予定”が消されるのみ ⇒ 全部の予定がトリガーされないのでどうするか?

32.

実際は、 検証用のフロー等を作成して、 前述のように大量に試しています。 事前の調査と設計は重要。

33.

フロー 全体像

34.

フロー 全体像 トリガー & 前処理 (C) 削除 (A) 追加 (B) 更新

35.

トリガー&前処理 ここは Qiita に詳細書いてあるので割愛! トリガーの「アクションの種類」(ActionType) で分岐 追加 = added 変更 = updated 削除 = deleted

36.

(A) 追加 ~連携先へ新規登録~ ここは Qiita に詳細書いてあるので割愛! [ID]と[シリーズマスターID](seriesMasterId) コレを連携先の本文に埋め込むのが超重要!!

37.

(B)更新 は深いので別けて説明します (B) 更新 (B-01) 単体予定の更新 (B-02) 定期的なイベントの更新

38.

(B) 更新 の最初 [繰り返し](recurrence) で分岐 none = 繰り返し無し

39.

(B-01)単体予定の更新 ここは Qiita に詳細書いてあるので割愛! 連携先に対象があれば「更新」 [ID]と[シリーズマスターID] (seriesMasterId) コレを連携先の本文に埋め込むの が超重要!! 連携元は「更新」だけど連携先に対象が 無い場合は「新規追加」をして補完している

40.

(B-02)定期的なイベントの更新 [シリーズマスターID](seriesMasterId)で 絞り込んで『マスター予定』を取得する 上で取得した『マスター予定』と『いま処理している予定』 が同じ = “定期的なイベントの先頭”と判断して、 連携先に登録してある「繰り返しの予定」を全削除 ※歯抜けの予定が判定できないから1回全削除しかねぇ! 予定を連携先へ追加。 これで“歯抜けの予定”も同期できる

41.

(C)削除 連携先から[ID]を本文に含んだ対象を取得 ※“定期的なイベント”が全て取得される → [シリーズマスターID](seriesMasterId) が埋め込まれてますよね!! 上記で取得した対象を全て削除する つまり、 “定期的なイベント”も全て削除される

42.

これで、 ExO 予定表 → 連携先へ同期 が実現できます。 ※“カンペキ”ではない。 ※諸注意アリ💦

43.

諸注意 #気ままに勉強会

44.

(B-02)定期的なイベントの更新 では「繰り返しの先頭のみ削除」だと破綻 上で取得した『マスター予定』と『いま処理している予定』 が同じ = “定期的なイベントの先頭”と判断する際に、 『開始時間が同一か?』で判定している。 つまり、「先頭の予定を単体削除」されると詰む。 いろいろと調べてみたけれども、 Power Automate で得られる情報では 「先頭の予定が単体削除された」場合 における回避策が現時点だと対応でき ないんです・・・;つД`)

45.

連携先の API 制限などに注意 例で紹介している連携先 = Googleカレンダー 相手側の API 制限などでコケる。 とくに定期的なイベントは連続登録に なるので、Sleep(遅延)を入れるなり、 エラー時にリトライさせるなりが必要。

46.

他にも色々と罠があるけども、 「長期の繰り返し予定」 は特に意図しない動作をします。 つまり“カンペキな同期”は無理

47.

結び #気ままに勉強会

48.

まとめ Power Automate 便利♪ でも 連携相手の仕様も重要

49.

???「Automate で予定表連携します」 ワイ「そんな気軽な考えで大丈夫か?」 出典「El Shaddai(素材)無料倉庫」http://elshaddai.jp/elshaddai_crim/freedeta.html

50.

『最適解』で頼む 「やりたいコト」が実現できるなら OK です。 ただ“連携する先”の仕様はおさえましょう。 『仕様』と『仕組み』がわかっていないと、 意図しない結果に翻弄される未来が待ってます。 出典「El Shaddai(素材)無料倉庫」http://elshaddai.jp/elshaddai_crim/freedeta.html

51.

結び 「調査と設計」が重要 「実装は最適解」で OK

52.

まず「作る」「試す」。 話はソレからだ。

53.

貴方のアイディアと、 ほんの小さな仕組みで、 未来が明るくなるかも。

54.

素晴らしい Power Platform Lifeを!

55.

ありがとうございました Thank you Merci Danke schön 고맙습니다 Obrigado Gracias