アルパカのメモ

繰り返しの予定

はじめに

この記事のVBA版はこちら

Outlookの予定、タスクに設定できる「繰り返し」について。

概要

参照:RecurrencePattern object (Outlook) | Microsoft Docs

AppointmentItem または TaskItem で設定できる。 上記2つには IsRecurring(Boolean) プロパティがあり、まずこれで繰り返しのアイテムかどうか確認できる。 繰り返しの詳細は、GetRecurrencePattern メソッドで取得できる。 GetRecurrencePattern または ClearRecurrencePattern メソッドを呼び出すと、IsRecurring プロパティが自動的に変更される。 つまり、何も気にせず GetRecurrencePattern を呼び出すと、IsRecurring が勝手に true になるので注意。

繰り返しの予定の参照

例えば 2020/10/1 12:00~13:00 に作った予定「test昼休み」を繰り返しの予定にしたとする。

  • 開始日 - 2020/10/1
  • 終了日 - 2020/10/31
  • 繰り返しのパターン - 毎日
  • 間隔 - 1日ごと

これに対して、10/01~10/31すべての予定を取りたい場合は、以下のサンプルのように検索する。

$OlDefaultFolders = [Microsoft.Office.Interop.Outlook.OlDefaultFolders]

$namespace = $outlook.GetNamespace("MAPI")
$folder = $namespace.GetDefaultFolder($OlDefaultFolders::olFolderCalendar)

$allItems = $folder.Items
$allItems.Sort("[Start]")
$allItems.IncludeRecurrences = $true

$filter = "[Start] >= '2020/10/01 00:00'"
$filter = $filter + " AND [Start] <= '2020/11/01 00:00'"
$filter = $filter + " AND [Subject] = 'test昼休み'"

$items = $allItems.Restrict($filter)

Filter や Restrict を使う前に、Items を Start の昇順で並べ替えてから IncludeRecurrences プロパティを true にする。 もし Items に終了日のない繰り返しの予定があるときに IncludeRecurrences をtrueにすると、Items.Count の値がundefinedになるので注意。

参考:Items.IncludeRecurrences property (Outlook) | Microsoft Docs

GetOccurrence メソッド

AppointmentItem.RecurrencePattern().GetOccurrence(DateTime) メソッドを使うと、 繰り返しの予定のうち、指定した日付の AppointmentItem を取得できる。 指定した日に予定がない場合はエラーになる。

この定期的なアイテムの 1 回分に変更を加えたので、この回はもう存在しません。開いているアイテムをすべて閉じて、再度実行してください。
発生場所 C:\xxxtest.ps1:39 文字:17
+ ...             $newItem = $item.GetRecurrencePattern().GetOccurrence($dt ...
+                 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : OperationStopped: (:) [], COMException
    + FullyQualifiedErrorId : System.Runtime.InteropServices.COMException

引数に指定する日付は、予定の開始時刻と同時刻でなければいけない 。「test昼休み」の場合、単純に「2020/10/08」と日付だけ指定している下記のサンプルではエラーになる。

# $item は「test昼休み」のAppointmentItem
[DateTime]$dt = "2020/10/08"
$item2 = $item.GetRecurrencePattern().GetOccurrence($dt)

正しくは、「test昼休み」が始まる12:00も指定しなくてはいけない。

# $item は「test昼休み」のAppointmentItem
[DateTime]$dt = "2020/10/08 12:00"
$item2 = $item.GetRecurrencePattern().GetOccurrence($dt)

参考:vb.net - GetOccurrence always throws exception - Stack Overflow

検索したい全ての日付について GetOccurrence メソッドで総当たりすれば、繰り返しの予定が全て取得できる。