Skip to content

Instantly share code, notes, and snippets.

@douglascayers
Last active October 9, 2024 11:37
Show Gist options
  • Save douglascayers/ada5a2a1708099f6ed7e to your computer and use it in GitHub Desktop.
Save douglascayers/ada5a2a1708099f6ed7e to your computer and use it in GitHub Desktop.
Create .ics Calendar Event in Visualforce
<!--
Simple proof-of-concept to create a .ics calendar event with visualforce.
Inspired by Natalie Regier @gnatrae
This example uses url parameters to set the details of event.
You could create a custom button that invokes this page, like:
https://<your-salesforce-domain>/apex/vCalendarPage?start={!TEXT(Obj.StartDate__c)}&end={!TEXT(Obj.EndDate__c)}&subject=Event from Visualforce&description=This .ics event created with visualforce&location=The Cloud
An example with literal values you can copy & paste in your browser:
https://<your-salesforce-domain>/apex/vCalendarPage?start=20140524T140000&end=20140524T153000&subject=Event from Visualforce&description=This .ics event created with visualforce&location=The Cloud
-->
<apex:page title="event.ics" contentType="text/calendar" cache="false">
BEGIN:VCALENDAR
VERSION:2.0
PRODID::-//hacksw/handcal//NONSGML v1.0//EN
BEGIN:VEVENT
DTSTAMP;TZID=GMT:<apex:outputText value="{!SUBSTITUTE(SUBSTITUTE(SUBSTITUTE($CurrentPage.parameters.start,':',''),'-',''),' ','T')}"/>
UID:<apex:outputText value="{!SUBSTITUTE(SUBSTITUTE(SUBSTITUTE($CurrentPage.parameters.start,':',''),'-',''),' ','')}"/>[email protected]
DTSTART;TZID=GMT:<apex:outputText value="{!SUBSTITUTE(SUBSTITUTE(SUBSTITUTE($CurrentPage.parameters.start,':',''),'-',''),' ','T')}"/>
DTEND;TZID=GMT:<apex:outputText value="{!SUBSTITUTE(SUBSTITUTE(SUBSTITUTE($CurrentPage.parameters.end,':',''),'-',''),' ','T')}"/>
SUMMARY:<apex:outputText value="{!$CurrentPage.parameters.subject}"/>
DESCRIPTION:<apex:outputText value="{!$CurrentPage.parameters.description}"/>
LOCATION:<apex:outputText value="{!$CurrentPage.parameters.location}"/>
END:VEVENT
END:VCALENDAR
</apex:page>
@AvelinoOktana
Copy link

Hi Douglas, great post.
Maybe you could help me a little bit.
I'm sending from an Apex class an Messaging.SingleEmailMessage, and I need to attach an ICS file.
I already have created your page.
I have this piece of code.

Messaging.SingleEmailMessage email = new Messaging.SingleEmailMessage();
email.setToAddresses(addresses);
email.setSubject(text);
email.setPlainTextBody(text);
email.setFileAttachments(.........)

So my question is, how do I attach your page to my email???
Should I set the PageReference on email.setFileAttachments(.........)????

Thank you very much

@amazingjoe
Copy link

Avelino, I think this is addressed in the link above provided by Douglas. https://douglascayers.com/2015/01/09/salesforce-send-calendar-invites-in-visualforce-email-templates/

In the solution section on the referenced link it says:
"Configure the email template like normal (subject, recipient, relatedTo, body) then at the bottom add <messaging:attachment filename=”reminder.ics”> and closing tag </messaging:attachment>. Between the two attachment tags, include the iCal markup to define your event as shown in this gist. "

@new84js
Copy link

new84js commented Dec 14, 2018

Thanks for this code.

When i am sending this invite to GMAIL, on mobile app, i am unable to see the description in calendar.

you can check, and let me know, if it is working for you.

many thanks,
Himanshu

@ajhare
Copy link

ajhare commented Jun 21, 2019

Thank you for the above!
I am also experiencing the same issue as new84js, in regards to the body of the event(description) is being dropped. I've tried tweaking it and was able to get the body to show the expected values but the formatting was dropped. It displays in html and I can't seem to get passed that.
If you or anyone has any thoughts or tips I'd appreciate it!

Thanks

@douglascayers
Copy link
Author

Check out my new blog post for a solution that does not require Visualforce or attachments, https://douglascayers.com/2019/06/22/how-to-send-google-and-outlook-calendar-invite-links-in-email-templates/

@johndturn
Copy link

@douglascayers Following up on this, it appears that the link that you posted above is broken. Do you happen to have that article somewhere? I'm very interested in learning how you did it.

@gauravg-metacube
Copy link

@douglascayers Can we provide the latest link as existing link is not working.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment