nad
nad

Reputation: 2850

Google Calendar API how to find attendee list

I need to find attendee list for a meeting using Google Calendar API. To extract attendee email, I have below code:

eventsResult = service.events().list(calendarId='primary',timeMin=tmin,timeMax=tmax,singleEvents=True,orderBy='startTime').execute()
    events = eventsResult.get('items', [])

for event in events:
            start = event['start'].get('dateTime', event['start'].get('date'))
            end = event['end'].get('dateTime', event['end'].get('date'))
            attendees = event['attendees'].get('email', event['attendees'].get('email'))
            print(attendees)

But getting error

attendees = event['attendees'].get('email', event['attendees'].get('email'))
AttributeError: 'list' object has no attribute 'get'

What am I missing? Any suggestion on how to do it?

Upvotes: 1

Views: 2747

Answers (2)

Linh Nguyễn Ngọc
Linh Nguyễn Ngọc

Reputation: 182

I hope this i solution, this function to get attendee by email or calendar ID of attendee, result list event of attendees email

def get_events_by_attendee(service, calendarId, attendee_email):
    now = datetime.utcnow().isoformat() + 'Z'  # 'Z' indicates UTC time
    timeMin = datetime.utcnow() - timedelta(days=3) #you can change
    timeMax = datetime.utcnow()+ timedelta(days=3)#you can change
    print(timeMin, now)
    timeMin = timeMin.isoformat() + 'Z'
    timeMax = timeMax.isoformat() + 'Z'
    print(timeMin)

    events_result = service.events().list(calendarId=calendarId,
                                          timeMin=timeMin,
                                          timeMax = timeMax,
                                          singleEvents=True,
                                          orderBy='startTime').execute()
    events = events_result.get('items', [])

    if not events:
        print('No upcoming events found.')
    list_events = []
    for event1 in events:
        element_list = []
        eventId = event1['id']
        event = service.events().get(calendarId=calendarId, eventId=eventId).execute() #check this event have attendee or not
        try:

            if event['attendees']:
                for attendee in event['attendees']:
                    if (attendee['email']==attendee_email)and(attendee['responseStatus']=='accepted'): #responseStatus 'accept' mean attendee accept your invitation
                        print(event['attendees'])
                        element_list.append(eventId)
                        htmlLink = event['htmlLink']
                        element_list.append(htmlLink)
                        summary = event['summary']
                        element_list.append(summary)
                        try: #this code belong to my sytems, you can pass it
                            description = event['description']
                            description = description.replace('\n', '<br>')
                            description = description.split('####', 1)
                            if description == []:
                                description = event['description']
                        except Exception as e:
                            description = 'Không có mô tả####'
                            description = description.split('####', 1)
                        element_list.append(description)
                        created = event['created']
                        created = dateutil.parser.parse(created) + timedelta(hours=7) #change the timezone
                        created = datetime(created.year, created.month, created.day, created.hour, created.minute)
                        element_list.append(created)
                        updated = event['updated']
                        updated = dateutil.parser.parse(updated) + timedelta(hours=7)#change the timezone
                        updated = datetime(updated.year, updated.month, updated.day, updated.hour, updated.minute)
                        element_list.append(updated)
                        start = event['start'].get('dateTime', event['start'].get('date'))
                        start = dateutil.parser.parse(start) + timedelta(hours=7)#change the timezone
                        start = datetime(start.year, start.month, start.day, start.hour, start.minute)
                        element_list.append(start)
                        end = event['end'].get('dateTime', event['end'].get('date'))
                        end = dateutil.parser.parse(end) + timedelta(hours=7)
                        end = datetime(end.year, end.month, end.day, end.hour, end.minute)
                        element_list.append(end)
                        status = event['status']
                        element_list.append(status)
                        attendees = event['attendees']
                        element_list.append(attendees)
                        list_events.append(element_list)
                    else:
                        pass
        except Exception as e:
            pass
    return list_events

Upvotes: 0

Tanaike
Tanaike

Reputation: 201338

If you are looking for the solution yet, how about this? The structure of attendees is as follows.

{
  "items": [
    {
      "attendees": [
        {
          "email": "### email ###",
          "displayName": "### name ###",
          "responseStatus": "#####"
        }
      ]
    }
  ]
}

So how about this modification?

From :

for event in events:
            start = event['start'].get('dateTime', event['start'].get('date'))
            end = event['end'].get('dateTime', event['end'].get('date'))
            attendees = event['attendees'].get('email', event['attendees'].get('email'))
            print(attendees)

To :

for event in events:
    start = event['start'].get('dateTime', event['start'].get('date'))
    end = event['end'].get('dateTime', event['end'].get('date'))
    print("{0}, {1}".format(start, end))
    for attendee in event['attendees']:
        attendees = attendee.get('email', attendee.get('email'))
        print(attendees)

If I misunderstand your question and you already have the solution, I'm sorry.

Upvotes: 2

Related Questions