Microsoft Graphを使ってクラウド上のカレンダーの操作を行うための方法を説明します。ここではカレンダーのイベントの一覧を更新・削除する処理をユーティリティー的に使えるように静的メソッドとして実装した例をお示ししています。
なお、UWPアプリにおけるユーザー認証については以下の記事をご覧ください。
動作確認環境
- Microsoft.Graph 3.28.0
イベントを更新する
UpdateEventAsyncメソッドを作成する
UpdateEventAsyncメソッド (CalendarHelperクラス)
public static async Task<Event> UpdateEventAsync(Event modifiedEvent, string calendarId = null)
{
Event updatedEvent = null;
try
{
var graphClient = await AuthenticationHelper.GetAuthenticatedClientAsync();
if (calendarId == null)
{
updatedEvent = await graphClient.Me.Events[modifiedEvent.Id].Request().UpdateAsync(modifiedEvent);
}
else
{
updatedEvent = await graphClient.Me.Calendars[calendarId].Events[modifiedEvent.Id].Request().UpdateAsync(modifiedEvent);
}
}
catch (Exception e)
{
Debug.WriteLine(e.ToString());
}
return updatedEvent;
}
AuthenticationHelperについては以下の記事をご覧ください。
※ APIのアクセス許可スコープに「Calendars.ReadWrite」を追加しておく必要があります。
まず、7行目でユーザー認証を行いGraphServiceClientインスタンスを取得しています。ここで、カレンダーIDが指定されている場合はそのカレンダーに対して、指定されていない場合はデフォルトカレンダーのイベントを更新するので、カレンダーIDの指定の有無で場合分けして考えてみましょう(9-16行目)。
カレンダーIDを指定していない場合はデフォルトカレンダーのイベントを更新するので、11行目でMe、Calendar、Eventsの3つのRequestBuilderからリクエストを構築し、Requestメソッドで完成させましょう(IEventRequest)。この時EventsにはインデクサにイベントIDを指定して、更新するイベントを指定します。リクエストのUpdateAsyncメソッドの引数にカレンダーに更新後のEvent型のインスタンスを指定して、そのイベントを更新します。
await graphClient.Me.Events[modifiedEvent.Id].Request().UpdateAsync(modifiedEvent);
カレンダーIDをしてしている場合は、15行目でMe、Calendars、Eventsの3つのRequestBuilderからリクエストを構築します。この時、CalendarsとEventsにはインデクサで、それぞれカレンダーIDとイベントIDを指定しましょう。あとはカレンダーIDを指定してない場合と同様です。
await graphClient.Me.Calendars[calendarId].Events[modifiedEvent.Id].Request().UpdateAsync(modifiedEvent);
例:イベントを更新する
それではこのUpdateEventAsyncメソッドを用いて、カレンダー上のイベントのイベント名を変更してみましょう。例として、イベント名に「(更新済み)」という文字列を追加してみます。
List<Event> events = await CalendarHelper.GetEventsAsync(DateTime.Today, DateTime.Today.AddDays(1));
Event modifiedEvent = events[0];
modifiedEvent.Subject = modifiedEvent.Subject + "(更新済み)";
Event updatedEvent = await CalendarHelper.UpdateEventAsync(modifiedEvent);
まず、1行目で以下の記事で説明したGetEventsAsyncメソッドを用いて本日のイベントのリストを取得します。
そして、2行目で1番最初のイベントをmodifiedEventとし、3行目でそのイベント名を更新します。最後にそのインスタンスを4行目のUpdateEventAsyncメソッドの引数に指定して、カレンダー上で更新しています。
イベントを削除する
DeleteEventAsyncメソッドを作成する
DeleteEventAsyncメソッド (CalendarHelperクラス)
public static async Task<bool> DeleteEventAsync(string eventId, string calendarId = null)
{
bool isDeleted = false;
try
{
GraphServiceClient graphClient = await AuthenticationHelper.GetAuthenticatedClientAsync();
if (calendarId == null)
{
await graphClient.Me.Calendar.Events[eventId].Request().DeleteAsync();
isDeleted = true;
}
else
{
await graphClient.Me.Calendars[calendarId].Events[eventId].Request().DeleteAsync();
isDeleted = true;
}
}
catch (ServiceException e)
{
Debug.WriteLine(e.Error.Message);
}
return isDeleted;
}
AuthenticationHelperについては以下の記事をご覧ください。
※ APIのアクセス許可スコープに「Calendars.ReadWrite」を追加しておく必要があります。
まず、7行目でユーザー認証を行いGraphServiceClientインスタンスを取得しています。ここで、カレンダーIDが指定されている場合はそのカレンダーのイベントを、指定されていない場合はデフォルトカレンダーのイベントを削除するので、カレンダーIDの指定の有無で場合分けして考えてみましょう(9-18行目)。
カレンダーIDを指定していない場合はデフォルトカレンダーからイベントを削除するので、11行目でMe、Calendar、Eventsの3つのRequestBuilderからリクエストを構築し、Requestメソッドで完成させましょう(IEventRequest)。この時EventsにはインデクサにイベントIDを指定して、削除するイベントを指定します。最後にリクエストのDeleteAsyncメソッドを実行することでRequestで指定したイベントを削除できます。
await graphClient.Me.Calendar.Events[eventId].Request().DeleteAsync();
カレンダーIDをしてしている場合は、15行目でMe、Calendars、Eventsの3つのRequestBuilderからリクエストを構築します。この時、CalendarsとEventsにはインデクサで、それぞれカレンダーIDとイベントIDを指定しましょう。あとはカレンダーIDを指定してない場合と同様です。
await graphClient.Me.Calendars[calendarId].Events[eventId].Request().DeleteAsync();
例:イベントを削除する
それではこのDeleteEventAsyncメソッドを用いて、例として本日のイベントの一番最初のものを削除してみましょう。
List<Event> events = await CalendarHelper.GetEventsAsync(DateTime.Today, DateTime.Today.AddDays(1));
bool result = await CalendarHelper.DeleteEventAsync(events[0].Id);
まず、1行目で以下の記事で説明したGetEventsAsyncメソッドを用いて本日のイベントのリストを取得します。
そして、2行目でその一番最初のイベントのイベントIDをDeleteEventAsyncメソッドの引数に指定して、それを削除します。
コメント