I wanted to create some crm activities based on data in a spreadsheet. Looping thorough the csv file would be easy, the challenge came when I wanted to create new activities in Microsoft CRM 2011, specifically appointments. Below is a PowerShell function that I pieced together to create a new activity if you know GUIDs of the contacts for the regarding, required fields. This is a more fleshed out function compared to this
FUNCTION JBM-CRM-CreateActivityODATA { PARAM([string][parameter(Mandatory=$true)][ValidateSet("Email", "PhoneCall", "Appointment")]$EntityType, [string][ValidateSet("crmserver.company.com", "dev-crmserver.company.com")]$ServerName="crmserver.company.com", [string][ValidateSet("CRMOrganizationName")]$OrganizationName="CRMOrganizationName", [string][parameter(Mandatory=$true)][ValidateScript({ $_ -match("^(\{){0,1}[0-9a-fA-F]{8}\-[0-9a-fA-F]{4}\-[0-9a-fA-F]{4}\-[0-9a-fA-F]{4}\-[0-9a-fA-F]{12}(\}){0,1}$")})]$OwnerGUID, [string][ValidateScript({ $_ -match("^(\{){0,1}[0-9a-fA-F]{8}\-[0-9a-fA-F]{4}\-[0-9a-fA-F]{4}\-[0-9a-fA-F]{4}\-[0-9a-fA-F]{12}(\}){0,1}$")})]$RegardingGUID, [ValidateScript({-not @( $_ | where {$_ -notmatch("^(\{){0,1}[0-9a-fA-F]{8}\-[0-9a-fA-F]{4}\-[0-9a-fA-F]{4}\-[0-9a-fA-F]{4}\-[0-9a-fA-F]{12}(\}){0,1}$") }).Count})]$ReqiredGUIDs, [string]$Subject,[string]$Description,[datetime]$ScheduledStart,[datetime]$ScheduledEnd,[string]$Location ) Function CreateActivityParty{ PARAM($ActivityId,$ParticipationTypeMask,$EntityType,$GUIDs) foreach ($Id in $GUIDs){ $activityParty = @{} write-host $Id $activityParty.Add("PartyId", @{Id= $Id;LogicalName= "contact"}) $activityParty.Add("ActivityId", @{Id= $ActivityId;LogicalName= "$($EntityType.ToLower())"}) $activityParty.Add("ParticipationTypeMask" , @{ Value=$ParticipationTypeMask }) $json=new-object System.Web.Script.Serialization.JavaScriptSerializer $activityPartyData=$json.Serialize($activityParty) $activityPartyData $url="http://$ServerName/$($OrganizationName)/xrmservices/2011/OrganizationData.svc/ActivityPartySet" $http_request = New-Object -ComObject Msxml2.XMLHTTP $http_request.open('POST', $url, $false) $http_request.setRequestHeader("Accept", "application/json") $http_request.setRequestHeader("Content-Type", "application/json; charset=utf-8") $http_request.send($activityPartyData) $http_request.statusText $results=$http_request } } $assembly = [Reflection.Assembly]::LoadWithPartialName("System.Web.Extensions") $activityObject = @{ ActivityTypeCode=$EntityType Subject=$Subject Description=$Description ScheduledStart=$($ScheduledStart.ToUniversalTime().ToString("yyyy-MM-ddTHH:mm:ssZ")) ScheduledEnd=$($ScheduledEnd.ToUniversalTime().ToString("yyyy-MM-ddTHH:mm:ssZ")) Location=$Location RegardingObjectId=@{ Id= $RegardingGUID LogicalName= "contact" } } $json = new-object System.Web.Script.Serialization.JavaScriptSerializer $activityData=$json.Serialize($activityObject) $url="http://$ServerName/$($OrganizationName)/xrmservices/2011/OrganizationData.svc/$($EntityType)Set" $http_request = New-Object -ComObject Msxml2.XMLHTTP $http_request.open('POST', $url, $false) $http_request.setRequestHeader("Accept", "application/json") $http_request.setRequestHeader("Content-Type", "application/json; charset=utf-8") $http_request.send($activityData) $results=$http_request $ActivityId=$($json.DeserializeObject($results.responseText)).d.ActivityId # Set Required Attendees CreateActivityParty -ActivityId $ActivityId -ParticipationTypeMask 5 -EntityType $EntityType -GUID $ReqiredGUIDs # Set Orgaizer CreateActivityParty -ActivityId $ActivityId -ParticipationTypeMask 7 -EntityType $EntityType -GUID $OwnerGUID }