Forum Discussion

AP_TC_ECASD's avatar
AP_TC_ECASD
Brass Contributor
Sep 30, 2025

New-MgBookingBusinessService | Customer Information Questions

I'm trying to turn off the stock Customer Information questions except for the customer email using PowerShell and New-MgBookingBusinessService and cannot seem to figure it out.  Any assistance is much appreciated!

 

# Prompt for Booking Business ID
$bookingBusinessId = Read-Host "Enter the Booking Business ID (e.g., email address removed for privacy reasons)"

# Prompt for default duration in minutes
$defaultDurationMinutes = Read-Host "Enter default appointment duration in minutes (e.g., 15)"
$defaultDuration = [TimeSpan]::FromMinutes([double]$defaultDurationMinutes)

# Post-buffer stays at 5 minutes
$postBuffer = [TimeSpan]::FromMinutes(5)

# Hardcoded Excel file path
$excelFilePath = "C:\Users\apettit\OneDrive - Eau Claire Area School District\Downloads\adamtestconferencedata.xlsx"

# Prompt for worksheet/tab name
$sheetName = Read-Host "Enter the worksheet/tab name to read data from"

# Import Excel data using Import-Excel (requires ImportExcel module)
if (-not (Get-Module -ListAvailable -Name ImportExcel)) {
    Install-Module -Name ImportExcel -Scope CurrentUser -Force
}
Import-Module ImportExcel

$staffEmails = Import-Excel -Path $excelFilePath -WorksheetName $sheetName

# Retrieve all staff members for the booking business
Write-Host "Fetching all staff members for booking business ID: $bookingBusinessId"
$allStaff = Get-MgBookingBusinessStaffMember -BookingBusinessId $bookingBusinessId

if (-not $allStaff) {
    Write-Error "No staff members found for the booking business ID: $bookingBusinessId"
    return
}

# Retrieve all custom questions
Write-Host "Fetching all custom questions for booking business ID: $bookingBusinessId"
$allCustomQuestions = Get-MgBookingBusinessCustomQuestion -BookingBusinessId $bookingBusinessId

if (-not $allCustomQuestions) {
    Write-Error "No custom questions found for the booking business ID: $bookingBusinessId"
    return
}

# Loop through each staff member from Excel automatically
Write-Host "Creating individual booking services for each staff member..."
foreach ($row in $staffEmails) {
    $email = $row.emailAddress.Trim().ToLower()

    # Automatically match staff from Booking Business
    $matchingStaff = $allStaff | Where-Object {
        $_.AdditionalProperties["emailAddress"] -and ($_.AdditionalProperties["emailAddress"].Trim().ToLower() -eq $email)
    }

    if ($matchingStaff) {
        $staffId = $matchingStaff.Id
        $displayName = $matchingStaff.AdditionalProperties["displayName"]
        Write-Host "Automatically creating service for: ${displayName} ($email)" -ForegroundColor Cyan

        try {
            # Prepare custom questions
            $customQuestions = $allCustomQuestions | ForEach-Object -Begin { $isLast = $false } -Process {
                $isLast = ($_.Id -eq $allCustomQuestions[-1].Id)
                $questionAssignment = New-Object Microsoft.Graph.PowerShell.Models.MicrosoftGraphBookingQuestionAssignment
                $questionAssignment.QuestionId = $_.Id
                $questionAssignment.IsRequired = if ($isLast) { $false } else { $true }
                $questionAssignment
            }

            # Prepare the reminder
            $defaultReminder = New-Object Microsoft.Graph.PowerShell.Models.MicrosoftGraphBookingReminder
            $defaultReminder.Message = "Don't forget! Family Teacher Conferences are tomorrow, and we are excited to visit with you! If you wish to change the meeting type (virtual, in-person, hybrid, or phone), please let the teacher know as soon as possible!"
            $defaultReminder.Offset = [TimeSpan]::FromDays(1)
            $defaultReminder.Recipients = @("customer")

            # Prepare service parameters
            $serviceParams = @{
                BookingBusinessId = $bookingBusinessId
                DisplayName = "${displayName} Family Conference"
                Description = "Family Teacher Conference with ${displayName}"
                StaffMemberIds = @($staffId)           # Assign specific staff member
                DefaultDuration = $defaultDuration
                DefaultPrice = 0.00
                DefaultPriceType = "free"
                CustomQuestions = $customQuestions
                PostBuffer = $postBuffer
                IsLocationOnline = $true
                IsCustomerAllowedToManageBooking = $true
                DefaultReminder = $defaultReminder
                AdditionalInformation = @"
Please arrive on time for your conferences as we will be sticking to a tight schedule.
If you wish to change the meeting type (virtual, in-person, hybrid, or phone), please let the teacher know as soon as possible.
If you require a translator, please submit a request at this form: https://forms.office.com/r/XWwBFWP7XD
"@  # Appears in the customer confirmation email
                AdditionalProperties = @{
                    customerEmail = @{ isRequired = $true }  # Only email field remains
                }
            }

            # Log service parameters
            Write-Host "Service Parameters for ${displayName}:" -ForegroundColor Blue
            $serviceParams.GetEnumerator() | ForEach-Object { Write-Host "$($_.Key): $($_.Value)" }

            # Create the booking service
            New-MgBookingBusinessService @serviceParams
            Write-Host "Booking service successfully created for ${displayName}!" -ForegroundColor Green
        } catch {
            Write-Error "Failed to create booking service for ${displayName}: $_"
        }
    } else {
        Write-Warning "No match found for email: $email"
    }
}

 

No RepliesBe the first to reply

Resources