Outlook アプリの予定通知機能が雑なので Microsoft Power Automate で直近の予定を賢くスマホにプッシュ通知する
2020年12月24日 木曜日
CONTENTS
【IIJ 2020 TECHアドベントカレンダー 12/24(木)の記事です】
こんにちは。Power Automate エバンジェリスト(自称)の古賀です。
みなさん、Outlook の予定の通知に満足していますか?
- アプリから通知されるけど、ちょっと早すぎる / 遅すぎる
- 「今じゃない」というときに通知してきて鬱陶しい
こんな風に感じたことはありませんか?
予定の通知は Microsoft の Outlook アプリに実装されています。されているのですが、実装が雑なのです。設定可能な通知が、予定開始前の 5、15、30分といった感じで粗いし、一番困るのは予定でリマインドを「なし」にしていても、夜中に通知してくるのです。これは鬱陶しい。
そこで自分用にカスタマイズした通知を実現するために Outlook 側の通知は全て切り、Power Automate を使ってスマホに通知することにしました。
設定手順
1. Microsoft Power Automate にサインインする
やはり自動化は正義である
2. マイフロー → 新規 →「自動─一から作成」
どうでもいいのですが、この微妙な「─」と「一」の違いは、左の「─」がただの罫線で、右の「一」は漢数字の 1 のようです。
3. トリガーに「予定しているイベントが間もなく開始されるとき」を選ぶ
Microsoft Power Automate (Flow) で Outlook の予定表を自動承諾するでお馴染み、Outlook.com という似たコネクタがあるので注意です。Microsoft 365 を利用している場合は、”Office 365 Outlook” 側を選択します。
4. 通知対象のカレンダーとどれくらい前に通知して欲しいかを入力
- ルックアヘッドタイムの単位は分です。これは予定の 4分前に通知する設定例です。
- 秒単位で仕事をこなすハイパービジネスマンは「分」だと粗すぎるので、ルックアヘッドタイムは 0 にしておき、このステップのあとに スケジュール → 待ち時間 を入れて、好みの秒数を指定することもできます。
ここですぐにスマホへの通知アクションを入れても良いのですが、常に家族のことを第一に考えている私は、うっかり家庭の予定を忘れて妻にキレられないように、土日の予定は備忘録的に入れているだけです。これは別に通知して欲しいわけではありません。
なので、土日は通知しないように条件分岐を入れることにします。
ついでに、リマインド「なし」に設定されているイベントも、ここで分岐させて鳴らさないようにします。
5. コントロール → 条件 (土日かリマインドなしは通知しない)
土日か、「リマインド: なし」を条件に追加します。
入力する詳細な条件は以下の通りです。
値の選択 (左辺) | 次の値に等しい | 値の選択 (右辺) | |
---|---|---|---|
ま た は |
dayOfWeek(addHours(utcNow(),9)) | 次の値に等しい | 0 |
dayOfWeek(addHours(utcNow(),9)) | 次の値に等しい | 6 | |
アラーム | 次の値に等しい | null |
- dayOfWeek 関数は、日曜日を 0、月曜日を 1 という形で返します。Power Automate 内の時計は UTC なので、日本時間に合うように 9時間足しています。
- null は「動的なコンテンツ」→「式」にある null を選択します。直接 null と入力すると、「null」という文字列として評価されるので注意してください。
ここで「いいえ」に分岐したら通知したいところですが、もう一つ、私は「To-Do」のようなタスクや、時間は決まっていないけどその日に終わらせる予定の仕事を終日で入れることがありました。これも Outlook アプリだと、律儀に 5分前の 23:55 に通知してきて私の快眠を阻害するのです(※1)。これは断じて許されない。
そこで、終日イベントだったら通知しない条件分岐を追加することにします。
6. 「いいえ」側に、コントロール → 条件 (終日イベントは通知しない)
- 左辺は「動的なコンテンツ」に「終日イベント」があるので、それを選択します。
- 右辺は「式」に「true」があるので、それを選択し、条件式は「次の値に等しい」を選びます。
もう一つ思い出しました。深夜や早朝にイベントが入っているときに、うっかり「ピコン!!」と鳴って驚いて起きてしまうことがあるのです。ほとんどの場合、このイベントもただの備忘録ですが、世界のどこかは昼だし、世界のどこかは夜です。しかしインターネットに夜はない。誰かが働いているから私は眠れるのですが、動物の三大欲求の一つである睡眠を阻害するのは、すべて悪だ。
イベントが指定時間内の場合は鳴らないようにしましょう。
7. 「いいえ」側に、コントロール → 条件 (早朝深夜は通知しない)
入力内容は以下の通りです。
値の選択 (左辺) | 次の値に等しい | 値の選択 (右辺) | |
---|---|---|---|
ま た は |
int(addHours(utcNow(), 9), ‘HH’)
|
次の値以上 | 21 |
int(addHours(utcNow(), 9), ‘HH’)
|
次の値以下 | 8 |
- 上記の例は 21:00 〜 翌 08:00 の範囲を指定する例です。
- 時刻の数字が返ってくるので数値型であることを期待しますが、文字列型なので int にキャストしています。
8. 最後に通知内容を入力
- はいの場合
- アクションの追加 → コントロール → 終了、で成功を返すようにします。
- このアクションはなくても良いのですが、実行結果を見たときに、条件分岐でどちらに分岐したか、後で見たときに分かりやすくなります。
- 同様に他の「はい」の条件にも「成功」終了を返すようにしておくと、デバッグに便利です。
- いいえの場合
- アクションの追加 → Notifications → Send me a mobile notification
- Text に通知したい内容を入力します。
- ここで 動的なコンテンツ → 件名 を入れておくと、予定のタイトルも通知されるし、メンバー一覧や会議室の場所が欲しかったら、それも入れられます。
完成形
完成形したフローは以下の通り。4K ディスプレイがあれば、余裕で表示できる。
最後に保存ボタンを押して、フローを保存します。
スマホへの通知例
これで私の仕事は捗り、家庭内平和は守られ、安眠も確保することができるようになりました。
応用 1: スコープを活用する
「4K なら余裕で表示できる」などとドヤ顔で書きましたが、プログラミングのセンスを全く感じられません。条件式をもっとまとめられます。
また、Power Automate には「スコープ」という、処理のまとまりを作れるものがあります。これはフローの中でも特殊なアクションで、実行に影響はなく、見栄えや見通しを良くするものです。上記で紹介してきた通知したくない条件を一つでまとめると、次のようになります。(※2)
コントロール → スコープ
Power Automate のアクションはドラッグ&ドロップで移動できます。追加したスコープの中に条件式を持ってきて、「追加」ボタンを押し、OR 条件を追加していきます。スコープを使うと、スコープごとドラッグ&ドロップできるのも便利なポイントです。(ただし、フローは上から順に実行されますので、参照しているアクションや変数の位置関係に注意してください)
だいぶスッキリしましたね。4K ディスプレイは不要でした。
応用 2: 日本の休日・祝日を判定する
このリマインダでだいぶ満足できたのですが、じつは日本の休日判定ができていないため、祝日に入ったイベントが通知されてしまいます。繰り返しで設定されているイベントにありがちです。これはイケていない。
そこで予定の入っている日が、日本の休日だったら通知しない設定を入れることにします。
事前準備として Outlook 側に「日本の休日」カレンダーを追加
Outlook には共通のカレンダーとして世界の休日カレンダーが利用でき、日本も含まれています。これを予め Outlook 側で追加しておきます。
Power Automate の編集画面を開いているときは、一旦保存して開き直してください。これで、Outlook 側で追加したカレンダーが利用できるようになります。
変数 → 変数の初期化
フローの先頭のほうに「休日数」という変数を整数型、初期値 0 で定義しておきます。
なぜ、これが必要になるかは、このあとすぐ説明します。
Office 365 Outlook → イベントのカレンダー ビューの取得
先ほど紹介した「スコープ」を早速使いましょう。
「イベントのカレンダー ビューの取得」で、「日本の休日」カレンダーに指定期間中に入っているイベントを取得します。祝日は「終日」で入っていますので、開始時刻と終了時刻は同じで構いません。その日の最初の時刻を取得する startOfDay 関数を使います。
startOfDay(addHours(utcNow(), 9), 'o')
そして、その直後に「コントロール」→「Apply to each」でイベントの数だけ、先ほど定義した「休日数」変数をインクリメント(+1)して、「日本の休日」カレンダーに入っているイベント数を数えます。これが 1 以上なら、その日は祝日と判定できるわけです。インクリメントするには、「変数」 →「変数の値を増やす」を使います。
「以前の手順から出力を選択」は、日本の休日カレンダーの出力(一覧)を入れますが、「動的なコンテンツ」のタブから選択できます。
休日かどうか判定する
もし、1 以上なら終了させて鳴らさないようにします。
なお、企業によっては「会社の休日」、例えば「創立記念日」や「お盆休暇」などを共有メールボックスで管理しているケースもあるでしょう。これも同様の手順で、このスコープに組み込めば、同じように休日判定として利用できます。
応用 3: 特定のイベント名は通知から除外する
ここまできて、だいぶカスタマイズ性が増した通知機能になりました。
予定表に「リマインド」の項目があり、これを「なし」とすれば通知されませんが、もうちょっと簡単に「リマインドなし」を実現したくなったとします。例えば、予定の名前の先頭に「★」が付いていたら、通知から除外したいとします。これもとても簡単です。
フローの先頭に除外したい文字列を定義
条件式に除外文字列を追加
通知除外に定義した文字から始まる件名(予定表の名前)だったら通知しないようになります。
ところで、本記事では「通知しない」条件を元にフローを組んでいましたが、例えば Outlook アプリには実装されていないような、
- たくさん予定を入れられてカオスなので、特定の人が入れた予定だけを通知する
- 上司が入れた予定は重要だから Teams にも通知する
- 他人が入れる予定と自分専用の予定表を作り、それぞれで通知時刻を変える
といったフローを組むこともできます。また、キライな人が入れた予定はあえて通知せず、すっぽかす、などといった方法も考えられますが、ここでは紹介しないことにします。
フロー完成形
完成したフローは次の通りです。スコープを使ったので、スッキリしています。
ちなみに全て展開すると、こんな感じです。
やっぱり、4K ディスプレイは必要でしたね。
今宵はクリスマス・イブ。
みなさんも自由にフローを組んで、充実したプライベートをお過ごしください。
注釈
- Outlook の最新版では改善されていて、終日イベントは 09:00 に鳴らせる(または鳴らさない)オプションが最近追加されています。[↑]
- フローはスッキリしますが、一方でデバッグの難易度は上がります。これは Power Automate のイケてないところの一つですが、エラーメッセージが極めて分かりにくいのです。IIJ-II 山本の記事「プログラマとしてPower Automateでローコード開発した所感」でも語られています。[↑]