Share via


EWS で定期的な予定アイテムを取得する際に終日フラグが True で返される現象について

今回は EWS (EWS Managed API も含む) で定期的な予定アイテムを取得する際に終日フラグが意図せずに True で返される現象についてご紹介いたします。

EWS の CalendarItemType.IsAllDayEvent や EWS Managed API の Appointment.IsAllDayEvent property は予定アイテムが終日のイベントであるかどうかを示すプロパティとなります。
この値は対象アイテムの MAPI プロパティである PidLidAppointmentSubType から取得するため、PidLidAppointmentSubType が True に設定されている場合には IsAllDayEvent も True が返される結果になります。

CalendarItemType.IsAllDayEvent property
https://msdn.microsoft.com/en-us/library/office/exchangewebservices.calendaritemtype.isalldayevent(v=exchg.150).aspx

Appointment.IsAllDayEvent property
https://msdn.microsoft.com/en-us/library/microsoft.exchange.webservices.data.appointment.isalldayevent(v=exchg.80).aspx

ここで Outlook 2003 / 2007 から定期的な予定アイテムを作成した場合、開始時刻と終了時刻を明示的に指定しているにも関わらず該当アイテムの PidLidAppointmentSubType が True で登録されることが確認されております。
このため、Outlook 2003 / 2007 で登録された定期的な予定アイテムを EWS で取得すると IsAllDayEvent が True として返される現象が発生いたします。

本動作に関しては設定などで回避することが残念ながらできないものとなりますので、Outlook 2003 / 2007 で登録された定期的な予定アイテムに関して EWS で終日のイベントかどうかを判断する場合には IsAllDayEvent 以外の要素からも確認して算出していただく必要がございます。
以下は一例にはなりますが、開始時刻と期間を利用して終日の予定かどうかを判断する EWS Managed API のサンプルとなります。

public static bool IsAllDayEvent(Appointment app){    // IsAllDayEvent が False の場合は詳細を確認しない    if (!app.IsAllDayEvent)    {        return app.IsAllDayEvent;    }    // 開始時刻がその日の 0:00:00 では無い場合は終日とは見なさない    if ((app.Start - app.Start.Date).TotalMinutes > 0)    {        return false;    }    // 期間が 1440 分 (1 日) の倍数では無い場合は終日とは見なさない    if (app.Duration.TotalMinutes % 1440 > 0)    {        return false;    }    return true;}

EWS で予定アイテムを取得して終日フラグである IsAllDayEvent も利用するアプリケーションを導入されている場合にはご注意ください。

- 補足
Outlook 2010 / 2013 や Outlook Web App (OWA) から開始時刻と終了時刻を指定して定期的な予定アイテムを作成した際には PidLidAppointmentSubType は False で登録されますので、上記で記載した問題は発生いたしません。