Public/Gmail/Update-GSGmailMessageLabel.ps1

function Update-GSGmailMessageLabel {
    <#
    .SYNOPSIS
    Updates Gmail label information for the specified message

    .DESCRIPTION
    Updates Gmail label information for the specified message

    .PARAMETER MessageId
    The unique Id of the message to update.

    .PARAMETER Filter
    The Gmail query to pull the list of messages to update instead of passing the MessageId directly.

    .PARAMETER AddLabel
    The label(s) to add to the message. This supports either the unique LabelId or the Display Name for the label

    .PARAMETER RemoveLabel
    The label(s) to remove from the message. This supports either the unique LabelId or the Display Name for the label

    .PARAMETER User
    The user to update message labels for

    Defaults to the AdminEmail user

    .EXAMPLE
    Set-GSGmailLabel -user user@domain.com -LabelId Label_798170282134616520 -

    Gets the Gmail labels of the AdminEmail user
    #>

    [cmdletbinding(DefaultParameterSetName = "MessageId")]
    Param
    (
        [parameter(Mandatory = $true, ValueFromPipelineByPropertyName = $true, ParameterSetName = "MessageId")]
        [Alias("Id")]
        [string[]]
        $MessageId,
        [parameter(Mandatory = $true, ParameterSetName = "Filter")]
        [Alias('Query')]
        [string]
        $Filter,
        [parameter(Mandatory = $false)]
        [string[]]
        $AddLabel,
        [parameter(Mandatory = $false)]
        [string[]]
        $RemoveLabel,
        [parameter(Mandatory = $false, ValueFromPipelineByPropertyName = $true)]
        [Alias("PrimaryEmail", "UserKey", "Mail")]
        [ValidateNotNullOrEmpty()]
        [string]
        $User = $Script:PSGSuite.AdminEmail
    )
    Process {
        if ($PSBoundParameters.Keys -notcontains 'AddLabel' -and $PSBoundParameters.Keys -notcontains 'RemoveLabel') {
            throw "You must specify a value for either AddLabel or RemoveLabel!"
        }
        if ($User -ceq 'me') {
            $User = $Script:PSGSuite.AdminEmail
        }
        elseif ($User -notlike "*@*.*") {
            $User = "$($User)@$($Script:PSGSuite.Domain)"
        }
        $serviceParams = @{
            Scope       = 'https://mail.google.com'
            ServiceType = 'Google.Apis.Gmail.v1.GmailService'
            User        = $User
        }
        $msgId = switch ($PSCmdlet.ParameterSetName) {
            MessageId {
                $MessageId
            }
            Filter {
                (Get-GSGmailMessageList -Filter $Filter -User $User).Id
            }
        }
        $service = New-GoogleService @serviceParams
        $userLabels = @{}
        Get-GSGmailLabel -User $User -Verbose:$false | ForEach-Object {
            $userLabels[$_.Name] = $_.Id
        }
        $body = New-Object 'Google.Apis.Gmail.v1.Data.ModifyMessageRequest'
        if ($PSBoundParameters.Keys -contains 'AddLabel') {
            $addLs = New-Object 'System.Collections.Generic.List[System.String]'
            foreach ($label in $AddLabel) {
                try {
                    $addLs.Add($userLabels[$label])
                }
                catch {
                    if ($ErrorActionPreference -eq 'Stop') {
                        $PSCmdlet.ThrowTerminatingError($_)
                    }
                    else {
                        Write-Error $_
                    }
                }
            }
            $body.AddLabelIds = $addLs
        }
        if ($PSBoundParameters.Keys -contains 'RemoveLabel') {
            $remLs = New-Object 'System.Collections.Generic.List[System.String]'
            foreach ($label in $RemoveLabel) {
                try {
                    $remLs.Add($userLabels[$label])
                }
                catch {
                    if ($ErrorActionPreference -eq 'Stop') {
                        $PSCmdlet.ThrowTerminatingError($_)
                    }
                    else {
                        Write-Error $_
                    }
                }
            }
            $body.RemoveLabelIds = $remLs
        }
        foreach ($message in $msgId) {
            try {
                $request = $service.Users.Messages.Modify($body, $User, $message)
                Write-Verbose "Updating Labels on Message '$message' for user '$User'"
                $request.Execute() | Add-Member -MemberType NoteProperty -Name 'User' -Value $User -PassThru
            }
            catch {
                if ($ErrorActionPreference -eq 'Stop') {
                    $PSCmdlet.ThrowTerminatingError($_)
                }
                else {
                    Write-Error $_
                }
            }
        }
    }
}