我正在编写一个日历集成,并使用Google Calendar api和Outlook Graph api来同步日历事件。当对事件进行更改时,我收到了webhooks,因此在不同的日历提供者之间,事件是相同的,这一点很重要。
然而,当我更新 Google 事件上的事件出席者时,事件更新不会发送到 Outlook 出席者。结果是Outlook与会者没有准确的与会者列表。
如果我更改TitleDescriptionTime,Google就会发送事件更新,Google和Outlook事件就会同步(Outlook事件更新了正确的出席者名单)。
我曾试过更新用户看不到的字段(如:序列,扩展属性),希望更改后能触发Google的事件更新,但似乎不起作用。
有谁找到了一种方法来触发谷歌事件更新时,与会者被添加或删除?
更新:对于Outlook用户,我为每个用户的日历创建了一个订阅(使用图形SDK)。
var graphClient = await MicrosoftAuthenticationProvider.GetGraphClient(CALENDAR_CLIENT_ID, CALENDAR_CLIENT_SECRET, CALENDAR_REDIRECT_URI, CALENDAR_ACCESS_SCOPES, RefreshToken).ConfigureAwait(false);
var tmpSubscription = new Subscription
{
ChangeType = WEBHOOK_SUBSCRIPTION_CHANGETYPE,
NotificationUrl = WEBHOOK_NOTIFICATION_ENDPOINT,
Resource = WEBHOOK_EVENT_RESOURCE_NAME,
ExpirationDateTime = maxSubscriptionLength,
ClientState = clientState
};
var subscription = await graphClient.Subscriptions
.Request()
.AddAsync(tmpSubscription)
.ConfigureAwait(false);
当Outlook事件更新时,我的webhook通知端点会收到来自Outlook的通知。当我在Google中编辑事件的摘要、描述、开始或结束时,这种情况会成功发生。当我添加或删除与会者时,不会发生这种情况。
要复制:在Google中创建一个事件,该事件的与会者使用Outlook。您将在Outlook中看到该事件。将另一个与会者添加到Google事件中。谷歌不会向Outlook发送更新电子邮件(如果titletimedescription发生变化,它的方式)。谷歌和Outlook事件的参加者现在是不同的。
我找到了一个变通的办法。
如果我知道出席者发生了变化,我改变了事件的描述,并向谷歌发送了一个沉默的补丁请求。
var tmpEvent = new Google.Apis.Calendar.v3.Data.Event
{
Description = Event.Description + "---attendees updated---",
};
//don't send the notification to anyone
//all attendees will get the notification when we resave the event with the original description
var patchRequest = service.Events.Patch(tmpEvent, GOOGLE_PRIMARY_CALENDARID, ExternalID);
patchRequest.SendUpdates = EventsResource.PatchRequest.SendUpdatesEnum.None;
await patchRequest.ExecuteAsync().ConfigureAwait(false);
对于这个补丁,将SendUpdates设置为None意味着与会者不会收到关于更改的通知,所以所有的日历事件将被默默更新。
最后,我保存整个事件(有适当的描述和与会者),并将更新发送给所有与会者。
var tmpEvent = new Google.Apis.Calendar.v3.Data.Event
{
Id = ExternalID == null ? Convert.ToString(Event.ID) : ExternalID,
Start = new EventDateTime
{
DateTime = Event.StartDate,
TimeZone = GetGoogleTimeZoneFromSystemTimeZone(timeZoneInfo.Id)
},
End = new EventDateTime
{
DateTime = Event.EndDate,
TimeZone = GetGoogleTimeZoneFromSystemTimeZone(timeZoneInfo.Id)
},
Summary = Event.Title,
Description = Event.Description,
Attendees = attendees.Select(a => new EventAttendee
{
Email = a.Value,
ResponseStatus = "accepted"
}).ToList(),
GuestsCanInviteOthers = false,
Location = Event.Location
};
var updateRequest = service.Events.Update(tmpEvent, GOOGLE_PRIMARY_CALENDARID, ExternalID);
updateRequest.SendUpdates = EventsResource.UpdateRequest.SendUpdatesEnum.All;
savedEvent = await updateRequest.ExecuteAsync().ConfigureAwait(false);
这并不理想,因为它需要两次调用谷歌的API才能正确地保存与会者,但从好的方面来看,与会者只会收到一次更改通知。