谷歌活动与会者名单在Outlook日历事件上没有更新。

问题描述 投票:0回答:1

我正在编写一个日历集成,并使用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事件的参加者现在是不同的。

google-calendar-api
1个回答
0
投票

我找到了一个变通的办法。

如果我知道出席者发生了变化,我改变了事件的描述,并向谷歌发送了一个沉默的补丁请求。

            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才能正确地保存与会者,但从好的方面来看,与会者只会收到一次更改通知。

© www.soinside.com 2019 - 2024. All rights reserved.