GoogleCalendarAPI接受/拒绝事件

时间:2016-01-07 04:33:49

标签: google-api google-calendar-api

我正在使用 GoogleCalendar API 并使用 node.js 作为构建我的应用程序的平台。 我能够使用身份验证过程创建事件,并使用身份验证时生成的访问令牌创建日历事件。

我的问题是假设我们在活动中有任何与会者并且我想使用参与者方面的日历API接受/拒绝活动,我们该怎么做?

我尝试获取与会者的日历事件,并将其与最初创建的事件的 iCalUID 进行匹配,然后使用与会者日历上的更新事件修改事件。

6 个答案:

答案 0 :(得分:2)

活动创建者或所有者无法修改与会者的回复。只有与会者才能修改其状态。

要更新用户侧的状态,您可以使用Event.update API并为'attendees.responseStatus'提供值。与会者的回复状态有4(四)个可能值(如下所述)。

'needsAction' - 尚未回应邀请。 '谢绝' - 拒绝了邀请。 '暂定' - 暂时接受了邀请 '接受' - 接受了邀请。

除此之外,您还可以使用“primary”作为日历ID的值来表示当前登录的用户

  

CalendarId:日历标识符。要检索日历ID,请调用calendarList.list方法。如果要访问当前登录用户的主日历,请使用“primary”关键字。 (字符串)。

对于id,您需要使用Events.list API返回的“id”而不是“iCalUID”。这两者与here所描述的不同。

您需要提供的其他字段是(与会者),startdate和enddate的电子邮件。

有关详细信息,请查看官方文档,链接如下: https://developers.google.com/google-apps/calendar/v3/reference/events

答案 1 :(得分:1)

以下是使用PATCH的java中的示例。使用您想要更改的信息创建一个事件对象,在这种情况下是与会者和响应状态。此代码作为与会者运行。

final Event event = new Event()
    .setAttendees(Arrays.asList(new EventAttendee().setEmail(email)
    .setResponseStatus("declined")));
try 
    getCalendarService(googleAccountCredential).events()
       .patch(CALENDAR_PRIMARY, calendarEventId, event)
       .setSendNotifications(true)
       .setOauthToken(googleAccountCredential.getToken()).execute();
    return true;
} catch (final Exception ex) {
...
    return false;
}

            }

答案 2 :(得分:1)

让我们假设您已经具有带有参与者键的事件有效负载,那么您需要获取所创建事件的ID:

created_event = gcal_service.events().insert(
    calendarId='primary', body=event_payload
).execute()

然后将与会者复制到新对象中

accepted_attendees = {}
accepted_attendees['attendees'] = event_payload['attendees'].copy()

现在,您需要做的是根据 event_id 向与会者日历提交补丁,如下所示:

for attendee in event_payload['attendees']:
    attendee_pos = accepted_attendees['attendees'].index(attendee)
    accepted_attendees['attendees'].pop(attendee_pos)
    accepted_attendees['attendees'].append({
        'email': attendee['email'],
        'self': True,
        'responseStatus': 'accepted',
        'additionalGuests': 0,
    })
    gcal_service.events().patch(
        calendarId='primary',
        eventId=created_event['id'],
        body=accepted_attendees
    )

仅此而已,所有其他与会者现在都接受了该活动,希望对您有所帮助。

答案 3 :(得分:0)

要回复,您需要从与会者日历中获取具有相同事件ID的事件,然后执行修补程序或更新操作,将此与会者的response status从needsAction更改为已接受/已拒绝

有关如何在与会者和组织者之间复制事件的一些文档: https://developers.google.com/google-apps/calendar/concepts/sharing

答案 4 :(得分:0)

以下是Google Calendar Api v3的python示例。您可以使用更新或补丁。他们两个都在工作。

all_attendees = event['attendees']
event['attendees'] = [{
    'email': 'you@example.com',
    'self': True,
    'responseStatus': 'accepted',
    'additionalGuests': 0,
}]
updated_event = service.events().patch(calendarId=calendar_id, eventId=event_id, body=event).execute()

玩得开心

答案 5 :(得分:0)

就像讨论的Android发烧友一样,只有与会者才能从与会者那边更新其日历。您还应该按照他的建议检查文档。以下答案是node.js和python的有效示例

要更新事件,您需要具有eventId和用户电子邮件。从日历中获取事件(带有eventID), 遍历所有与会者,更改responseStatus为 该特定参与者,然后更新Google日历

对于使用Google API的节点js


const { google } = require('googleapis');

const calendar = google.calendar({ version: 'v3', auth: 'YOUR-API-KEY-HERE' });

#get the event to be updated
let theEvent = calendar.events.get({ calendarId: 'primary', eventId: eventId })

#loop through the whole attendee
for (let i = 0, i < theEvent['atendees'].length; i++){
    if (theEvent['atendees'][i]['email'] === userEmail){
        theEvent['atendees'][i]['responseStatus'] = 'accepted'
    }
}
#update the google event
calendar.events.update({ calendarId: 'primary', eventId: theEventId, body: theEvent}, function(err, event) {
  if (err) {
    console.log('there was an error');
    return;
  }
  console.log('Event updated');
});

对于使用googleapiclient的python

from googleapiclient.discovery import build

calendar = build('calendar', 'v3', credentials=credential)

event = calendar.events().get(calendarId='primary', eventId='eventId').execute()

For attendee in  event['atendees']:
    if atendee['email'] == user_email:
        attendee['responseStatus'] = 'accepted'
        break
#update the google event
udated_event = calendar.events().update(calendarId='primary', eventId=eventId, body=event).execute()