This article describes how to configure the SharePoint|sapiens Event Management app for Office 365 to create events with multiple sessions.
Please note that this only works if you use the classic SharePoint experience.
In this article:There are a few things you have to configure, but first I would like to show you how it looks like in the end. This can be used for example to create conferences or other events with multiple sessions or slots like blood testing or other health check programs.
A possible solution
Create a main event
In the new event form, enable the ‘Is Main Event’ column.
Create a session
In the new event form, select the main event in the Main Event column. Only main events are available in this drop down.
To create multiple events you can use a template in the Event Catalog and use schedule an event, the Copy Event action in the event’s ribbon to copy existing events or the quick edit view to enter multiple events or even copy them from an Excel Spreadsheet. This also allows you to prepare all the events in Excel including Main Event, Enrollment Deadline, Min Enrollments, Max Enrollment, etc. and copy and paste them from Excel to a quick edit view in SharePoint.
Enroll in the main event
I customized all the views that are visible to participants to only display main events and no sessions. This means that users always have to enroll in the main event first.
Enroll in sessions
After users enroll in the main event, they can then view all the included sessions.
You can also change the invitation template and include the link to view sessions in the email invitation.
If users click on ‘View Sessions’ or ‘View Sessions in Calendar’, they can view all sessions and enroll.
Users will also receive an e-mail invitation for all sessions they enroll in.
How to configure it
To be able to create main events and sessions, there are a few columns we need.
New columns in the Scheduled Events list
- Is Main Event: Yes/No column that allows organizers to define main events
- Main Event Title: Calculated column that displays the event title if the event is marked as a ‘main event’
- Main Event: Lookup column that refers to the same list (Scheduled Events) and users the ‘Main Event Title’ as the lookup field
- View Sessions: Calculated column that displays Yes if the event is marked as a ‘main event’. The column rendering will be modified using JSLink.
- View Sessions in Calendar: Calculated column that displays Yes if the event is marked as a ‘main event’. The column rendering will be modified using JSLink.
New columns in the Enrollment list
- Is Main Event: Yes/No column that allows organizers to define main events. This column should not be displayed in the enrollment form. This column is synchronized with the value from the connected event.
- Main Event Title: Calculated column that displays the event title if the connected event is marked as a ‘main event’
- Main Event: Lookup column that refers to the Scheduled Events list and users the ‘Main Event Title’ as the lookup field. This column should not be displayed in the enrollment form. This column is synchronized with the value from the connected event.
- View Sessions: Calculated column that displays Yes if the connected event is marked as a ‘main event’. The column rendering will be modified using JSLink.
- View Sessions in Calendar: Calculated column that displays Yes if the connected event is marked as a ‘main event’. The column rendering will be modified using JSLink.
Also we need two additional views in the Scheduled Events list that we use to display sessions per events.
New views in the Scheduled Events list
- Calendar Sub Events
- Sub Events
To help you with the configuration I decided to share a SharePoint PowerShell script that creates the columns and views for you.
SharePoint PowerShell to create the columns and views
To connect to SharePoint you first have to register the SharePoint Client DLLs. You can download and install the SharePoint Client SDK and load them from the c:\Program Files\Common Files\microsoft shared\Web Server Extensions\16\ISAPI folder …
# Connect to SharePoint online # option 1 register the SharePoint Client DLLS from 16 HIVE: https://www.microsoft.com/en-us/download/details.aspx?id=51679 Add-Type -Path "c:\Program Files\Common Files\microsoft shared\Web Server Extensions\16\ISAPI\Microsoft.SharePoint.Client.dll" Add-Type -Path "c:\Program Files\Common Files\microsoft shared\Web Server Extensions\16\ISAPI\Microsoft.SharePoint.Client.Runtime.dll"
# Connect to SharePoint online # option 1 register the SharePoint Client DLLS from 16 HIVE: https://www.microsoft.com/en-us/download/details.aspx?id=51679 Add-Type -Path "c:\Program Files\Common Files\microsoft shared\Web Server Extensions\16\ISAPI\Microsoft.SharePoint.Client.dll" Add-Type -Path "c:\Program Files\Common Files\microsoft shared\Web Server Extensions\16\ISAPI\Microsoft.SharePoint.Client.Runtime.dll"
… or if you are on a SharePoint on premise server load them directly from the Global Assembly Cache.
# option 2 register the SharePoint Client DLLS from GAC or local folder [System.Reflection.Assembly]::LoadWithPartialName("Microsoft.SharePoint.Client") | Out-Null [System.Reflection.Assembly]::LoadWithPartialName("Microsoft.SharePoint.Client.Runtime") | Out-Null
# option 2 register the SharePoint Client DLLS from GAC or local folder [System.Reflection.Assembly]::LoadWithPartialName("Microsoft.SharePoint.Client") | Out-Null [System.Reflection.Assembly]::LoadWithPartialName("Microsoft.SharePoint.Client.Runtime") | Out-Null
Now create the SharePoint context:
$webUrl = Read-Host -Prompt "Enter the web site URL" $username = Read-Host -Prompt "Enter Site collection administrator’s full O365 email" $password = Read-Host -Prompt "Password for $username" -AsSecureString [Microsoft.SharePoint.Client.ClientContext]$clientContext = New-Object Microsoft.SharePoint.Client.ClientContext($webUrl) $clientContext.Credentials = New-Object Microsoft.SharePoint.Client.SharePointOnlineCredentials($username, $password)
$webUrl = Read-Host -Prompt "Enter the web site URL" $username = Read-Host -Prompt "Enter Site collection administrator’s full O365 email" $password = Read-Host -Prompt "Password for $username" -AsSecureString [Microsoft.SharePoint.Client.ClientContext]$clientContext = New-Object Microsoft.SharePoint.Client.ClientContext($webUrl) $clientContext.Credentials = New-Object Microsoft.SharePoint.Client.SharePointOnlineCredentials($username, $password)
Get the Scheduled Events and the Enrollment list:
# load web and lists $clientContext.Load($clientContext.Web); $listEvents = $clientContext.Web.Lists.GetByTitle("Scheduled Events"); $listEnrollments = $clientContext.Web.Lists.GetByTitle("Enrollments in Topics and Events"); $clientContext.Load($listEvents) $clientContext.Load($listEnrollments) $clientContext.ExecuteQuery()
# load web and lists $clientContext.Load($clientContext.Web); $listEvents = $clientContext.Web.Lists.GetByTitle("Scheduled Events"); $listEnrollments = $clientContext.Web.Lists.GetByTitle("Enrollments in Topics and Events"); $clientContext.Load($listEvents) $clientContext.Load($listEnrollments) $clientContext.ExecuteQuery()
Create the columns:
# event list id $eventListID = $listEvents.Id; # field definietions $fieldIsMainEvent = '<Field Type="Boolean" DisplayName="IsMainEvent" ID="{4c867f2a-f209-4e02-b905-ddb684c9fd09}" Name="IsMainEvent" ><Default>0</Default></Field>' $fieldViewSessions = '<Field Type="Calculated" DisplayName="ViewSubEvents" ResultType="Boolean" ReadOnly="TRUE" ID="{8a8a37f9-ae65-491a-8084-de4132cd5f5c}" Name="ViewSubEvents" JSLink="~site/siteassets/evm/js/sapiens.evm.clienttemplatesessions.min.js"><Formula>=[Is Main Event]</Formula><FieldRefs><FieldRef Name="IsMainEvent" /></FieldRefs></Field>' $fieldViewSessionsCalendar = '<Field Type="Calculated" DisplayName="ViewSubEventsCalendar" ResultType="Boolean" ReadOnly="TRUE" ID="{d582f62c-6c35-4649-8be0-3efedf238728}" Name="ViewSubEventsCalendar" JSLink="~site/siteassets/evm/js/sapiens.evm.clienttemplatesessions.min.js"><Formula>=[Is Main Event]</Formula><FieldRefs><FieldRef Name="IsMainEvent" /></FieldRefs></Field>' $fieldMainEventTitle = '<Field Type="Calculated" DisplayName="MainEventTitle" ResultType="Text" ReadOnly="TRUE" ID="{a0b29a8f-3b89-45a8-afe2-64b0836fc1d6}" Name="MainEventTitle" ><Formula>=IF([Is Main Event],[Title],"")</Formula><FieldRefs><FieldRef Name="Title" /><FieldRef Name="IsMainEvent" /></FieldRefs></Field>' $fieldMainEvent = '<Field Type="Lookup" DisplayName="MainEvent" List="' + $eventListID + '" ShowField="MainEventTitle" ID="{de108430-4cea-48a6-905e-138d463272e4}" Name="MainEvent" />' # add columns to Scheduled Events $f = $listEvents.Fields.AddFieldAsXml($fieldIsMainEvent, $false, [Microsoft.SharePoint.Client.AddFieldOptions]::AddToAllContentTypes) $f.Title = "Is Main Event" $f.Update() $clientContext.ExecuteQuery() $f = $listEvents.Fields.AddFieldAsXml($fieldMainEventTitle, $false, [Microsoft.SharePoint.Client.AddFieldOptions]::AddToNoContentType) $f.Title = "Main Event Title" $f.Update() $clientContext.ExecuteQuery() $f = $listEvents.Fields.AddFieldAsXml($fieldMainEvent, $false, [Microsoft.SharePoint.Client.AddFieldOptions]::AddToAllContentTypes) $f.Title = "Main Event" $f.Update() $clientContext.ExecuteQuery() $f = $listEvents.Fields.AddFieldAsXml($fieldViewSessions, $false, [Microsoft.SharePoint.Client.AddFieldOptions]::AddToNoContentType) $f.Title = "View Sessions" $f.Update() $clientContext.ExecuteQuery() $f = $listEvents.Fields.AddFieldAsXml($fieldViewSessionsCalendar, $false, [Microsoft.SharePoint.Client.AddFieldOptions]::AddToNoContentType) $f.Title = "View Sessions in Calendar" $f.Update() $clientContext.ExecuteQuery() # add columns to Enrollments $f = $listEnrollments.Fields.AddFieldAsXml($fieldIsMainEvent, $false, [Microsoft.SharePoint.Client.AddFieldOptions]::AddToNoContentType) $f.Title = "Is Main Event" $f.Update() $clientContext.ExecuteQuery() $f = $listEnrollments.Fields.AddFieldAsXml($fieldMainEventTitle, $false, [Microsoft.SharePoint.Client.AddFieldOptions]::AddToNoContentType) $f.Title = "Main Event Title" $f.Update() $clientContext.ExecuteQuery() $f = $listEnrollments.Fields.AddFieldAsXml($fieldMainEvent, $false, [Microsoft.SharePoint.Client.AddFieldOptions]::AddToNoContentType) $f.Title = "Main Event" $f.Update() $clientContext.ExecuteQuery() $f = $listEnrollments.Fields.AddFieldAsXml($fieldViewSessions, $false, [Microsoft.SharePoint.Client.AddFieldOptions]::AddToAllContentTypes) $f.Title = "View Sessions" $f.Update() $clientContext.ExecuteQuery() $f = $listEnrollments.Fields.AddFieldAsXml($fieldViewSessionsCalendar, $false, [Microsoft.SharePoint.Client.AddFieldOptions]::AddToAllContentTypes) $f.Title = "View Sessions in Calendar" $f.Update() $clientContext.ExecuteQuery()
# event list id $eventListID = $listEvents.Id; # field definietions $fieldIsMainEvent = '<Field Type="Boolean" DisplayName="IsMainEvent" ID="{4c867f2a-f209-4e02-b905-ddb684c9fd09}" Name="IsMainEvent" ><Default>0</Default></Field>' $fieldViewSessions = '<Field Type="Calculated" DisplayName="ViewSubEvents" ResultType="Boolean" ReadOnly="TRUE" ID="{8a8a37f9-ae65-491a-8084-de4132cd5f5c}" Name="ViewSubEvents" JSLink="~site/siteassets/evm/js/sapiens.evm.clienttemplatesessions.min.js"><Formula>=[Is Main Event]</Formula><FieldRefs><FieldRef Name="IsMainEvent" /></FieldRefs></Field>' $fieldViewSessionsCalendar = '<Field Type="Calculated" DisplayName="ViewSubEventsCalendar" ResultType="Boolean" ReadOnly="TRUE" ID="{d582f62c-6c35-4649-8be0-3efedf238728}" Name="ViewSubEventsCalendar" JSLink="~site/siteassets/evm/js/sapiens.evm.clienttemplatesessions.min.js"><Formula>=[Is Main Event]</Formula><FieldRefs><FieldRef Name="IsMainEvent" /></FieldRefs></Field>' $fieldMainEventTitle = '<Field Type="Calculated" DisplayName="MainEventTitle" ResultType="Text" ReadOnly="TRUE" ID="{a0b29a8f-3b89-45a8-afe2-64b0836fc1d6}" Name="MainEventTitle" ><Formula>=IF([Is Main Event],[Title],"")</Formula><FieldRefs><FieldRef Name="Title" /><FieldRef Name="IsMainEvent" /></FieldRefs></Field>' $fieldMainEvent = '<Field Type="Lookup" DisplayName="MainEvent" List="' + $eventListID + '" ShowField="MainEventTitle" ID="{de108430-4cea-48a6-905e-138d463272e4}" Name="MainEvent" />' # add columns to Scheduled Events $f = $listEvents.Fields.AddFieldAsXml($fieldIsMainEvent, $false, [Microsoft.SharePoint.Client.AddFieldOptions]::AddToAllContentTypes) $f.Title = "Is Main Event" $f.Update() $clientContext.ExecuteQuery() $f = $listEvents.Fields.AddFieldAsXml($fieldMainEventTitle, $false, [Microsoft.SharePoint.Client.AddFieldOptions]::AddToNoContentType) $f.Title = "Main Event Title" $f.Update() $clientContext.ExecuteQuery() $f = $listEvents.Fields.AddFieldAsXml($fieldMainEvent, $false, [Microsoft.SharePoint.Client.AddFieldOptions]::AddToAllContentTypes) $f.Title = "Main Event" $f.Update() $clientContext.ExecuteQuery() $f = $listEvents.Fields.AddFieldAsXml($fieldViewSessions, $false, [Microsoft.SharePoint.Client.AddFieldOptions]::AddToNoContentType) $f.Title = "View Sessions" $f.Update() $clientContext.ExecuteQuery() $f = $listEvents.Fields.AddFieldAsXml($fieldViewSessionsCalendar, $false, [Microsoft.SharePoint.Client.AddFieldOptions]::AddToNoContentType) $f.Title = "View Sessions in Calendar" $f.Update() $clientContext.ExecuteQuery() # add columns to Enrollments $f = $listEnrollments.Fields.AddFieldAsXml($fieldIsMainEvent, $false, [Microsoft.SharePoint.Client.AddFieldOptions]::AddToNoContentType) $f.Title = "Is Main Event" $f.Update() $clientContext.ExecuteQuery() $f = $listEnrollments.Fields.AddFieldAsXml($fieldMainEventTitle, $false, [Microsoft.SharePoint.Client.AddFieldOptions]::AddToNoContentType) $f.Title = "Main Event Title" $f.Update() $clientContext.ExecuteQuery() $f = $listEnrollments.Fields.AddFieldAsXml($fieldMainEvent, $false, [Microsoft.SharePoint.Client.AddFieldOptions]::AddToNoContentType) $f.Title = "Main Event" $f.Update() $clientContext.ExecuteQuery() $f = $listEnrollments.Fields.AddFieldAsXml($fieldViewSessions, $false, [Microsoft.SharePoint.Client.AddFieldOptions]::AddToAllContentTypes) $f.Title = "View Sessions" $f.Update() $clientContext.ExecuteQuery() $f = $listEnrollments.Fields.AddFieldAsXml($fieldViewSessionsCalendar, $false, [Microsoft.SharePoint.Client.AddFieldOptions]::AddToAllContentTypes) $f.Title = "View Sessions in Calendar" $f.Update() $clientContext.ExecuteQuery()
Create the views:
# create Views $clientContext.Load($listEvents.Views); $clientContext.ExecuteQuery() # Calendar Sub Events $viewInfo = New-Object Microsoft.SharePoint.Client.ViewCreationInformation $viewInfo.Title = "CalendarSubEvents"; $viewInfo.ViewFields = "Title", "Location", "EventDate", "EndDate" $viewInfo.Query = "<Where><DateRangesOverlap><FieldRef Name='EventDate' /><FieldRef Name='EndDate' /><FieldRef Name='RecurrenceID' /><Value Type='DateTime'><Month /></Value></DateRangesOverlap></Where>" $viewInfo.viewTypeKind = [Microsoft.SharePoint.Client.ViewType]::Calendar $view = $listEvents.Views.Add($viewInfo); $view.Title = "Calendar Sub Events" $view.ViewData = '<FieldRef Name="Title" Type="CalendarMonthTitle" /><FieldRef Name="Title" Type="CalendarWeekTitle" /><FieldRef Name="Location" Type="CalendarWeekLocation" /><FieldRef Name="Title" Type="CalendarDayTitle" /><FieldRef Name="Location" Type="CalendarDayLocation" />' $view.Update() $clientContext.ExecuteQuery() # Sub Events $viewInfo = New-Object Microsoft.SharePoint.Client.ViewCreationInformation $viewInfo.Title = "SubEvents"; $viewInfo.ViewFields = "Title", "Location", "EventDate", "EndDate" $viewInfo.Query = "<OrderBy><FieldRef Name='EventDate'/></OrderBy>" $viewInfo.viewTypeKind = [Microsoft.SharePoint.Client.ViewType]::Html $view = $listEvents.Views.Add($viewInfo); $view.Title = "Sub Events" $view.Update() $clientContext.ExecuteQuery()
# create Views $clientContext.Load($listEvents.Views); $clientContext.ExecuteQuery() # Calendar Sub Events $viewInfo = New-Object Microsoft.SharePoint.Client.ViewCreationInformation $viewInfo.Title = "CalendarSubEvents"; $viewInfo.ViewFields = "Title", "Location", "EventDate", "EndDate" $viewInfo.Query = "<Where><DateRangesOverlap><FieldRef Name='EventDate' /><FieldRef Name='EndDate' /><FieldRef Name='RecurrenceID' /><Value Type='DateTime'><Month /></Value></DateRangesOverlap></Where>" $viewInfo.viewTypeKind = [Microsoft.SharePoint.Client.ViewType]::Calendar $view = $listEvents.Views.Add($viewInfo); $view.Title = "Calendar Sub Events" $view.ViewData = '<FieldRef Name="Title" Type="CalendarMonthTitle" /><FieldRef Name="Title" Type="CalendarWeekTitle" /><FieldRef Name="Location" Type="CalendarWeekLocation" /><FieldRef Name="Title" Type="CalendarDayTitle" /><FieldRef Name="Location" Type="CalendarDayLocation" />' $view.Update() $clientContext.ExecuteQuery() # Sub Events $viewInfo = New-Object Microsoft.SharePoint.Client.ViewCreationInformation $viewInfo.Title = "SubEvents"; $viewInfo.ViewFields = "Title", "Location", "EventDate", "EndDate" $viewInfo.Query = "<OrderBy><FieldRef Name='EventDate'/></OrderBy>" $viewInfo.viewTypeKind = [Microsoft.SharePoint.Client.ViewType]::Html $view = $listEvents.Views.Add($viewInfo); $view.Title = "Sub Events" $view.Update() $clientContext.ExecuteQuery()
Now you just have to make sure that the columns in the Scheduled Events list are added to the content type and are in the correct order and also you may have to create or change your views to include the columns you need or also use filters if you only want to display main events (Is Main Event is equal to Yes) or sessions (Is Main Event is equal to No) in specific views.