Functions/Public/Set-CT365SPDistinctNumber.ps1

<#
.SYNOPSIS
    Replaces specified numbers in an Excel worksheet, excluding certain columns.

.DESCRIPTION
    The Set-CT365SPDistinctNumber function opens an Excel file and replaces occurrences of a specified number in a given worksheet.
    It excludes specific columns ("Template" and "TimeZone") from this operation.
    The primary reason for this is to be able to create new Sharepoint Team sites while the others are deleting.

.PARAMETER FilePath
    The path to the Excel file that contains the worksheet to be modified.

.PARAMETER WorksheetName
    The name of the worksheet within the Excel file where the replacements will be made.

.PARAMETER FindNumber
    The number to find in the worksheet. This number will be replaced wherever it is found, except in the excluded columns.

.PARAMETER ReplaceNumber
    The number that will replace the FindNumber in the worksheet.

.EXAMPLE
    Set-CT365SPDistinctNumber -FilePath "C:\Documents\example.xlsx" -WorksheetName "Sheet1" -FindNumber "36" -ReplaceNumber "37"

    This command replaces all occurrences of the number 36 with 37 in the worksheet named "Sheet1" of the Excel file located at "C:\Documents\example.xlsx", excluding the "Template" and "TimeZone" columns.

.INPUTS
    None. You cannot pipe objects to Set-CT365SPDistinctNumber.

.OUTPUTS
    None. This function does not generate any output.

.NOTES
    This function requires the ImportExcel module to be installed.

.LINK
    https://github.com/dfinke/ImportExcel - The ImportExcel PowerShell module

#>

function Set-CT365SPDistinctNumber {
    [CmdletBinding()]
    param (
        [Parameter(Mandatory)]
        [string]$FilePath,

        [Parameter(Mandatory)]
        [string]$WorksheetName,

        [Parameter(Mandatory)]
        [string]$FindNumber,

        [Parameter(Mandatory)]
        [string]$ReplaceNumber
    )

    # Import the ImportExcel module
    Import-Module ImportExcel

    # Open the Excel package
    $excelPackage = Open-ExcelPackage -Path $FilePath

    try {
        $worksheet = $excelPackage.Workbook.Worksheets[$WorksheetName]
        if ($null -eq $worksheet) {
            throw "Worksheet '$WorksheetName' not found."
        }

        # Get the indices of the columns to exclude
        $excludedColumns = @("Template", "TimeZone").ForEach({
            $worksheet.Dimension.Start.Column..$worksheet.Dimension.End.Column |
            Where-Object { $worksheet.Cells[1, $_].Text -eq $_ } | 
            ForEach-Object { [OfficeOpenXml.ExcelCellAddress]::GetColumnLetter($_) }
        })

        # Initialize a counter for replacements
        $replacementCount = 0

        # Find and replace the numbers, skipping the excluded columns
        $worksheet.Cells.Where({
            $_.Value -like "*$FindNumber*" -and 
            -not ($excludedColumns -contains [OfficeOpenXml.ExcelCellAddress]::GetColumnLetter($_.Start.Column))
        }).ForEach({
            if ($_ -ne $null -and $null -ne $_.Value -and $_.Value -like "*$FindNumber*") {
                $_.Value = $_.Value -replace $FindNumber, $ReplaceNumber
                $replacementCount++
            }
        })

        # Check if the number of replacements is as expected
        if ($replacementCount -eq 0) {
            throw "No replacements were made for the number '$FindNumber'."
        } elseif ($replacementCount -ne 12) {
            Write-PSFMessage -Message "Unexpected number of replacements: $replacementCount. Expected 12." -Level Error
        } else {
            Write-PSFMessage -Message "Exactly 12 replacements were made for the number '$FindNumber'." -Level Host
        }

        # Save and close the Excel package
        Close-ExcelPackage $excelPackage
    }
    catch {
        $excelPackage.Dispose()
        throw
    }
}