MikeVaughan
MikeVaughan

Reputation: 1501

Python Google Calendar sort by date

I've got a script that grabs every event off of a Google Claendar, and the searches through those events, and prints the ones that contain a search term to a file.

The problem I'm having is that I need them to be put in order by date, and this doesn't seem to do that.

while True:
    events = calendar_acc.events().list(calendarId='myCal',pageToken=page_token).execute()
    for event in events['items']:
        if 'Search Term' in event['summary']: 
        #assign names to hit, and date
        find = event['summary']
        date = event['start'][u'dateTime']

    #only print the first ten digits of the date.

    month = date[5:7]
    day = date[8:10]
    year = date[0:4]
    formatted_date = month+"/"+day+"/"+year
    #write a line
    messy.write(formatted_date+" "+event['summary']+"\n\n")

I think there is a way to do this with the time module maybe, but I'm not sure. Any help is appreciated.

Upvotes: 0

Views: 644

Answers (2)

You can return a sorted list (by date ascending) from the API by using the "orderBy" parameter and setting it to "updated".

page_token = None
while True:
    events = service.events().list(calendarId=myID, orderBy='updated', pageToken=page_token).execute()
    for event in events['items']:
        print(event)
        page_token = events.get('nextPageToken')
    if not page_token:
        break

For more information see: https://developers.google.com/calendar/v3/reference/events/list

Hope this helps.

Upvotes: 0

MikeVaughan
MikeVaughan

Reputation: 1501

Just in case anyone else needs to do this. With the help of jedwards.

I ended up creating an empty list: hits
And then appending the ['start']['dateTime'] as an datetime.datetime object, and ['summary'] to the list for each event that contained my "Search Term". Like so:

hits = []
while True:
    events = calendar_acc.events().list(calendarId='My_Calendar_ID', pageToken=page_token).execute()
    for event in events['items']:
        if "Search Term" in event['summary']: 
           hits.append((dateutil.parser.parse(event['start']['dateTime']), event['summary']))

    page_token = events.get('nextPageToken')
    if not page_token:
        break

The you just sort the list, and in my case, I cut the datetime object down to just be the date. And then wrote the whole line to a file. But this code just prints it to the console.

hits.sort()

for x in hits:
    d = x[0]
    date = "%d/%d/%d"%(getattr(d,'month'),getattr(d,'day'), getattr(d,'year'))
    final = str(date)+"\t\t"+str(x[1])

    print final

Thanks again to jedwards in the comments!

Upvotes: 1

Related Questions