Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to add/modify events in Google calendar with ICS file

I'm trying to create an ICS file to add events to a Google calendar via email. In the end, the calendar will be sent to multiple users, from a desktop app. Ideally I'd like to be able to modify the calendar if the events change (just event times, I'm ignoring cancelled events)

Here is my ICS file

BEGIN:VCALENDAR
VERSION:2.0
PRODID:-//MY COMPANY//Calendar//EN
CALSCALE:GREGORIAN
METHOD:PUBLISH
BEGIN:VEVENT
UID:[email protected]
DTSTART:20180604T090000
DTEND:20180604T153000
DTSTAMP:20180519T081800
SUMMARY:Morning shfit
LOCATION:Morning Location
DESCRIPTION:Morning shift
END:VEVENT
BEGIN:VEVENT
UID:[email protected]
DTSTART:20180605T153000
DTEND:20180605T233000
DTSTAMP:20180519T081800
SUMMARY:Night shift
LOCATION:
DESCRIPTION:Night
END:VEVENT
END:VCALENDAR

When I email that file to my gmail account, I can see a "Add to Google calendar" button which I can use to add the events to my prinary calendar.

Now, say the events times changed.

Question : How can I create a new ICS file with the new times so that existing events will be modified in google calendar?

I used UIDs for events so that google does not create duplicate entries. But when I email a second ics file with modified events (with uids), the "add to google calendar" button does not appear. If I try to manually import the ics file from google calendar Import feature, then I get this error message

Could not upload your events because you do not have sufficient access on the target calendar.

If I set different UIDs each time, the import process will work but duplicate entries will be created.

I also tried using REQUEST instead of PUBLISH method

Thanks

like image 457
David Avatar asked May 19 '18 06:05

David


1 Answers

I was able to get this working with Gmail using the following:

  • METHOD: set to REQUEST
  • SEQUENCE: Set to 0 on first request and increment by 1 each time
  • ATTENDEE: Identify the Gmail user that is receiving the email by email address

Other variations would have non-desirable effects:

  • Only seeing 1 of the two events
  • Not updating existing event

Office 365 sends ICS files to Gmail that can be updated so it can be used to reference a commercial implementation. You can see the requests Outlook 365 sends by using "Show Original" in Gmail to retrieve the base64 encoded calendar body. Outlook 365 uses many other fields so it's instructive to examine.

I have a test script in Go using SparkPost so if you have any questions or would like to use it, just let me know. SparkPost has a free tier but you still need to configure your outbound sending domain to use it.

Here is an example modified request. I just increment the SEQUENCE and change the time to update the request in Gmail.

BEGIN:VCALENDAR
VERSION:2.0
PRODID:-//MY COMPANY//Calendar//EN
CALSCALE:GREGORIAN
METHOD:REQUEST
BEGIN:VEVENT
ATTENDEE;ROLE=REQ-PARTICIPANT;[email protected]:MAILTO:[email protected]
UID:[email protected]
DTSTART:20180807T010000
DTEND:20180807T020000
DTSTAMP:20180601T033455
SEQUENCE:0
SUMMARY:Morning shift
LOCATION:Morning Location
DESCRIPTION:Morning shift
END:VEVENT
BEGIN:VEVENT
ATTENDEE;ROLE=REQ-PARTICIPANT;[email protected]:MAILTO:[email protected]
UID:[email protected]
DTSTART:20180807T130000
DTEND:20180807T140000
DTSTAMP:20180601T033455
SEQUENCE:0
SUMMARY:Night shift
LOCATION:Night Location
DESCRIPTION:Night
END:VEVENT
END:VCALENDAR

Of note, when sending multiple events in a single ICS file, sometimes it takes Gmail a second or so to show both events with the correct time in my testing.

like image 107
Grokify Avatar answered Oct 30 '22 23:10

Grokify