Public/Lists.ps1

<#
.SYNOPSIS
    Get all ClickUp lists.
.DESCRIPTION
    Get all ClickUp lists. Can accept FolderID or SpaceID via pipeline input for integration with other cmdlets.
.EXAMPLE
    PS C:\> Get-ClickUpLists -FolderID 456
    Gets ClickUp lists under folder with ID "456".
.EXAMPLE
    PS C:\> Get-ClickUpLists -FolderID 456 -Archived $true
    Gets ClickUp lists under folder with ID "456" including archived lists.
.EXAMPLE
    PS C:\> Get-ClickUpLists -SpaceID 789
    Gets ClickUp lists under space with ID "789".
.EXAMPLE
    PS C:\> Get-ClickUpLists -SpaceID 789 -Archived $true
    Gets ClickUp lists under space with ID "789" including archived lists.
.EXAMPLE
    PS C:\> Get-ClickUpFolder -FolderID 456 | Get-ClickUpLists
    Gets lists by piping folder ID from Get-ClickUpFolder.
.INPUTS
    System.UInt64. FolderID or SpaceID via pipeline by property name.
.OUTPUTS
    System.Object
    System.Array
.NOTES
    See the link for information.
.LINK
    https://developer.clickup.com/reference/getlists
.LINK
    https://developer.clickup.com/reference/getfolderlesslists
#>

function Get-ClickUpLists {
    [CmdletBinding(DefaultParameterSetName = 'FolderID')]
    [OutputType([System.Object], [System.Array])]
    param (
        [Parameter(Mandatory = $true, ParameterSetName = 'FolderID', ValueFromPipelineByPropertyName = $true)]
        [Alias('folder_id', 'id')]
        [uint64]$FolderID,
        [Parameter(Mandatory = $true, ParameterSetName = 'SpaceID', ValueFromPipelineByPropertyName = $true)]
        [Alias('space_id', 'id')]
        [uint64]$SpaceID,
        [Parameter(ParameterSetName = 'FolderID')]
        [Parameter(ParameterSetName = 'SpaceID')]
        [bool]$Archived = $false
    )

    Write-Verbose 'Entering Get-ClickUpLists'
    $QueryString = @{
        $Archived = $Archived
    }

    try {
        if ($PSBoundParameters.ContainsKey('FolderID')) {
            Write-Verbose "Getting lists for folder ID: $FolderID"
            $Lists = Invoke-ClickUpAPIGet -Arguments $QueryString -Endpoint "folder/$FolderID/list"
        } elseif ($PSBoundParameters.ContainsKey('SpaceID')) {
            Write-Verbose "Getting lists for space ID: $SpaceID"
            $Lists = Invoke-ClickUpAPIGet -Arguments $QueryString -Endpoint "space/$SpaceID/list"
        }
        Write-Verbose 'Successfully retrieved lists'
        return $Lists.lists
    } catch {
        Write-Error "Error in Get-ClickUpLists: $($_.Exception.Message)"
        throw $_
    }
}

<#
.SYNOPSIS
    Get a single ClickUp list.
.DESCRIPTION
    Get a single ClickUp list. Can accept ListID via pipeline input for integration with other cmdlets.
.EXAMPLE
    PS C:\> Get-ClickUpList -ListID 456
    Gets a ClickUp list with ID "456".
.EXAMPLE
    PS C:\> Get-ClickUpLists -FolderID 456 | Get-ClickUpList
    Gets list details by piping list ID from Get-ClickUpLists.
.INPUTS
    System.UInt64. ListID via pipeline by property name.
.OUTPUTS
    System.Object.
.NOTES
    See the link for information.
.LINK
    https://developer.clickup.com/reference/getlist
#>

function Get-ClickUpList {
    [CmdletBinding()]
    [OutputType([System.Object])]
    param (
        [Parameter(Mandatory = $true, ValueFromPipelineByPropertyName = $true)]
        [Alias('list_id', 'id')]
        [uint64]$ListID
    )

    Write-Verbose 'Entering Get-ClickUpList'
    try {
        Write-Verbose "Getting list with ID: $ListID"
        $List = Invoke-ClickUpAPIGet -Endpoint "list/$ListID"
        Write-Verbose 'Successfully retrieved list'
        return $List
    } catch {
        Write-Error "Error in Get-ClickUpList: $($_.Exception.Message)"
        throw $_
    }
}

<#
.SYNOPSIS
    Create a ClickUp list.
.DESCRIPTION
    Create a ClickUp list. Can accept FolderID or SpaceID via pipeline input for integration with other cmdlets.
.EXAMPLE
    PS C:\> New-ClickUpList -FolderID 456 -Name "New ClickUp List"
    Creates a ClickUp list called "New ClickUp List" under folder with ID "456".
.EXAMPLE
    PS C:\> New-ClickUpList -FolderID 456 -Name "New ClickUp List" -DueDate "12/31/2021" -Priority 2
    Creates a ClickUp list called "New ClickUp List" under folder with ID "456" with a due date and priority.
.EXAMPLE
    PS C:\> New-ClickUpList -SpaceID 789 -Name "New ClickUp List"
    Creates a ClickUp list called "New ClickUp List" under space with ID "789".
.EXAMPLE
    PS C:\> New-ClickUpList -SpaceID 789 -Name "New ClickUp List" -DueDate "12/31/2021" -Priority 2
    Creates a ClickUp list called "New ClickUp List" under space with ID "789" with a due date and priority.
.EXAMPLE
    PS C:\> Get-ClickUpFolder -FolderID 456 | New-ClickUpList -Name "New List from Pipeline"
    Creates list by piping folder ID from Get-ClickUpFolder.
.INPUTS
    System.UInt64. FolderID or SpaceID via pipeline by property name.
.OUTPUTS
    System.Object.
.NOTES
    See the link for information.
.LINK
    https://developer.clickup.com/reference/createlist
.LINK
    https://developer.clickup.com/reference/createfolderlesslist
#>

function New-ClickUpList {
    [CmdletBinding(DefaultParameterSetName = 'FolderID')]
    [OutputType([System.Object])]
    param (
        [Parameter(Mandatory = $true, ParameterSetName = 'FolderID', ValueFromPipelineByPropertyName = $true)]
        [Alias('folder_id', 'id')]
        [uint64]$FolderID,
        [Parameter(Mandatory = $true, ParameterSetName = 'SpaceID', ValueFromPipelineByPropertyName = $true)]
        [Alias('space_id', 'id')]
        [uint64]$SpaceID,
        [Parameter(Mandatory = $true, ParameterSetName = 'FolderID')]
        [Parameter(Mandatory = $true, ParameterSetName = 'SpaceID')]
        [string]$Name,
        [Parameter(ParameterSetName = 'FolderID')]
        [Parameter(ParameterSetName = 'SpaceID')]
        [string]$Content,
        [Parameter(ParameterSetName = 'FolderID')]
        [Parameter(ParameterSetName = 'SpaceID')]
        [DateTime]$DueDate,
        [Parameter(ParameterSetName = 'FolderID')]
        [Parameter(ParameterSetName = 'SpaceID')]
        [bool]$DueDateTime = $false,
        [Parameter(ParameterSetName = 'FolderID')]
        [Parameter(ParameterSetName = 'SpaceID')]
        [UInt16]$Priority,
        [Parameter(ParameterSetName = 'FolderID')]
        [Parameter(ParameterSetName = 'SpaceID')]
        [uint64]$Assignee,
        [Parameter(ParameterSetName = 'FolderID')]
        [Parameter(ParameterSetName = 'SpaceID')]
        [string]$Status
    )

    Write-Verbose 'Entering New-ClickUpList'
    $Body = @{
        name = $Name
    }

    if ($PSBoundParameters.ContainsKey('Content')) {
        $Body.Add('content', $Content)
    }
    if ($PSBoundParameters.ContainsKey('DueDate')) {
        $Body.Add('due_date', $(Get-DatePosixMilliseconds -DateTime $DueDate))
    }
    if ($PSBoundParameters.ContainsKey('DueDateTime')) {
        $Body.Add('due_date_time', $DueDateTime)
    }
    if ($PSBoundParameters.ContainsKey('Priority')) {
        $Body.Add('priority', $Priority)
    }
    if ($PSBoundParameters.ContainsKey('Assignee')) {
        $Body.Add('assignee', $Assignee)
    }
    if ($PSBoundParameters.ContainsKey('Status')) {
        $Body.Add('status', $Status)
    }

    try {
        if ($PSBoundParameters.ContainsKey('FolderID')) {
            Write-Verbose "Creating list '$Name' in folder ID: $FolderID"
            $List = Invoke-ClickUpAPIPost -Endpoint "folder/$FolderID/list" -Body $Body
        } elseif ($PSBoundParameters.ContainsKey('SpaceID')) {
            Write-Verbose "Creating list '$Name' in space ID: $SpaceID"
            $List = Invoke-ClickUpAPIPost -Endpoint "space/$SpaceID/list" -Body $Body
        }
        Write-Verbose 'Successfully created list'
        return $List
    } catch {
        Write-Error "Error in New-ClickUpList: $($_.Exception.Message)"
        throw $_
    }
}

<#
.SYNOPSIS
    Update a ClickUp list.
.DESCRIPTION
    Update a ClickUp list. Can accept ListID via pipeline input for integration with other cmdlets.
.EXAMPLE
    PS C:\> Set-ClickUpList -ListID 124 -Name "New ClickUp List Name"
    Updates a ClickUp list with ID "124" with new name "New ClickUp List Name".
.EXAMPLE
    PS C:\> Set-ClickUpList -ListID 124 -Name "New ClickUp List Name" -DueDate "12/31/2021" -Priority 2
    Updates a ClickUp list with ID "124" with new name "New ClickUp List Name" with a due date and priority.
.EXAMPLE
    PS C:\> Get-ClickUpList -ListID 124 | Set-ClickUpList -Name "Updated Name"
    Updates list by piping list ID from Get-ClickUpList.
.INPUTS
    System.String. ListID via pipeline by property name.
.OUTPUTS
    System.Object.
.NOTES
    See the link for information.
.LINK
    https://developer.clickup.com/reference/updatelist
#>

function Set-ClickUpList {
    [CmdletBinding()]
    [OutputType([System.Object])]
    param (
        [Parameter(Mandatory = $true, ValueFromPipelineByPropertyName = $true)]
        [Alias('list_id', 'id')]
        [string]$ListID,
        [Parameter()]
        [string]$Name,
        [Parameter()]
        [string]$Content,
        [Parameter()]
        [DateTime]$DueDate,
        [Parameter()]
        [bool]$DueDateTime = $false,
        [Parameter()]
        [UInt16]$Priority,
        [Parameter()]
        [uint64]$Assignee,
        [Parameter()]
        [bool]$UnsetStatus
    )

    Write-Verbose 'Entering Set-ClickUpList'
    $Body = @{}

    if ($PSBoundParameters.ContainsKey('Name')) {
        $Body.Add('name', $Name)
    }
    if ($PSBoundParameters.ContainsKey('Content')) {
        $Body.Add('content', $Content)
    }
    if ($PSBoundParameters.ContainsKey('DueDate')) {
        $Body.Add('due_date', $(Get-DatePosixMilliseconds -DateTime $DueDate))
    }
    if ($PSBoundParameters.ContainsKey('DueDateTime')) {
        $Body.Add('due_date_time', $DueDateTime)
    }
    if ($PSBoundParameters.ContainsKey('Priority')) {
        $Body.Add('priority', $Priority)
    }
    if ($PSBoundParameters.ContainsKey('Assignee')) {
        $Body.Add('assignee', $Assignee)
    }
    if ($PSBoundParameters.ContainsKey('UnsetStatus')) {
        $Body.Add('unset_status', $UnsetStatus)
    }

    try {
        Write-Verbose "Updating list with ID: $ListID"
        $List = Invoke-ClickUpAPIPut -Endpoint "list/$ListID" -Body $Body
        Write-Verbose 'Successfully updated list'
        return $List
    } catch {
        Write-Error "Error in Set-ClickUpList: $($_.Exception.Message)"
        throw $_
    }
}

<#
.SYNOPSIS
    Remove a ClickUp list.
.DESCRIPTION
    Remove a ClickUp list. Can accept ListID via pipeline input for integration with other cmdlets.
.EXAMPLE
    PS C:\> Remove-ClickUpList -ListID 124
    Removes a ClickUp list with ID "124".
.EXAMPLE
    PS C:\> Get-ClickUpList -ListID 124 | Remove-ClickUpList
    Removes list by piping list ID from Get-ClickUpList.
.INPUTS
    System.UInt64. ListID via pipeline by property name.
.OUTPUTS
    None. This cmdlet does not return any output.
.NOTES
    See the link for information.
.LINK
    https://developer.clickup.com/reference/deletelist
#>

function Remove-ClickUpList {
    [CmdletBinding(SupportsShouldProcess, ConfirmImpact = 'High')]
    param (
        [Parameter(Mandatory = $true, ValueFromPipelineByPropertyName = $true)]
        [Alias('list_id', 'id')]
        [uint64]$ListID
    )
    Write-Verbose 'Entering Remove-ClickUpList'
    try {
        if ($PSCmdlet.ShouldProcess($ListID, 'Remove ClickUp List')) {
            Write-Verbose "Removing list with ID: $ListID"
            $Null = Invoke-ClickUpAPIDelete -Endpoint "list/$ListID"
            Write-Verbose 'Successfully removed list'
        }
    } catch {
        Write-Error "Error in Remove-ClickUpList: $($_.Exception.Message)"
        throw $_
    }
}

<#
.SYNOPSIS
    Add a ClickUp task to a list.
.DESCRIPTION
    Add a ClickUp task to a list. Can accept ListID and TaskID via pipeline input for integration with other cmdlets.
.EXAMPLE
    PS C:\> Add-ClickUpTaskToList -ListID 123 -TaskID 9hz
    Adds ClickUp task with ID "9hz" to list with ID "123".
.EXAMPLE
    PS C:\> Get-ClickUpList -ListID 123 | Add-ClickUpTaskToList -TaskID 9hz
    Adds task to list by piping list ID from Get-ClickUpList.
.INPUTS
    System.UInt64. ListID via pipeline by property name. System.String. TaskID via pipeline by property name.
.OUTPUTS
    None. This cmdlet does not return any output.
.NOTES
    See the link for information.
    Note: This endpoint requires the Tasks in Multiple List ClickApp to be enabled.
.LINK
    https://developer.clickup.com/reference/addtasktolist
.LINK
    https://help.clickup.com/hc/en-us/articles/6309958824727-Tasks-in-Multiple-Lists
#>

function Add-ClickUpTaskToList {
    [CmdletBinding()]
    param (
        [Parameter(Mandatory = $true, ValueFromPipelineByPropertyName = $true)]
        [Alias('list_id', 'id')]
        [uint64]$ListID,
        [Parameter(Mandatory = $true, ValueFromPipelineByPropertyName = $true)]
        [Alias('task_id')]
        [string]$TaskID
    )

    Write-Verbose 'Entering Add-ClickUpTaskToList'
    try {
        Write-Verbose "Adding task $TaskID to list $ListID"
        $Null = Invoke-ClickUpAPIPost -Endpoint "list/$ListID/task/$TaskID"
        Write-Verbose 'Successfully added task to list'
    } catch {
        Write-Error "Error in Add-ClickUpTaskToList: $($_.Exception.Message)"
        throw $_
    }
}

<#
.SYNOPSIS
    Remove a ClickUp task from a list.
.DESCRIPTION
    Remove a ClickUp task from a list. Can accept ListID and TaskID via pipeline input for integration with other cmdlets.
.EXAMPLE
    PS C:\> Remove-ClickUpTaskFromList -ListID 123 -TaskID 9hz
    Removes ClickUp task with ID "9hz" from list with ID "123".
.EXAMPLE
    PS C:\> Get-ClickUpList -ListID 123 | Remove-ClickUpTaskFromList -TaskID 9hz
    Removes task from list by piping list ID from Get-ClickUpList.
.INPUTS
    System.UInt64. ListID via pipeline by property name. System.String. TaskID via pipeline by property name.
.OUTPUTS
    None. This cmdlet does not return any output.
.NOTES
    See the link for information.
.LINK
    https://developer.clickup.com/reference/removetaskfromlist
#>

function Remove-ClickUpTaskFromList {
    [CmdletBinding(SupportsShouldProcess, ConfirmImpact = 'High')]
    param (
        [Parameter(Mandatory = $true, ValueFromPipelineByPropertyName = $true)]
        [Alias('list_id', 'id')]
        [uint64]$ListID,
        [Parameter(Mandatory = $true, ValueFromPipelineByPropertyName = $true)]
        [Alias('task_id')]
        [string]$TaskID
    )

    Write-Verbose 'Entering Remove-ClickUpTaskFromList'
    try {
        if ($PSCmdlet.ShouldProcess("Task: $TaskID, List: $ListID", 'Remove Task from List')) {
            Write-Verbose "Removing task $TaskID from list $ListID"
            $Null = Invoke-ClickUpAPIDelete -Endpoint "list/$ListID/task/$TaskID"
            Write-Verbose 'Successfully removed task from list'
        }
    } catch {
        Write-Error "Error in Remove-ClickUpTaskFromList: $($_.Exception.Message)"
        throw $_
    }
}

<#
.SYNOPSIS
    Create a new list using a list template in a Folder.
.DESCRIPTION
    Create a new list using a list template in a Folder or Space. Can accept FolderID or SpaceID via pipeline input for integration with other cmdlets. Publicly shared templates must be added to your Workspace before you can use them with the public API.
.EXAMPLE
    PS C:\> New-ClickUpListFromTemplate -FolderID 123 -TemplateID 9hz -Name "New List"
    Creates a new list using a list template in a Folder. The request runs synchronously by default. Small templates can be applied synchronously, guaranteeing all sub objects are created.
.EXAMPLE
    PS C:\> New-ClickUpListFromTemplate -SpaceID 123 -TemplateID 9hz -Name "New List"
    Creates a new list using a list template in a Space. The request can be run asynchronously or synchronously via the return_immediately parameter.
.EXAMPLE
    PS C:\> Get-ClickUpFolder -FolderID 123 | New-ClickUpListFromTemplate -TemplateID 9hz -Name "New List from Template"
    Creates list from template by piping folder ID from Get-ClickUpFolder.
.INPUTS
    System.UInt64. FolderID or SpaceID via pipeline by property name.
.OUTPUTS
    System.Object
.NOTES
    See the link for information.
    Publicly shared templates must be added to your Workspace before you can use them with the public API.
.LINK
    https://developer.clickup.com/reference/createfolderlistfromtemplate
.LINK
    https://developer.clickup.com/reference/createspacelistfromtemplate
.LINK
    https://help.clickup.com/hc/en-us/articles/6326023965591-Add-a-template-to-your-library
#>

function New-ClickUpListFromTemplate {
    [CmdletBinding()]
    param (
        [Parameter(Mandatory = $true, ParameterSetName = 'FolderID', ValueFromPipelineByPropertyName = $true)]
        [Alias('folder_id', 'id')]
        [uint64]$FolderID,
        [Parameter(Mandatory = $true, ParameterSetName = 'SpaceID', ValueFromPipelineByPropertyName = $true)]
        [Alias('space_id', 'id')]
        [uint64]$SpaceID,
        [Parameter(Mandatory = $true, ParameterSetName = 'FolderID')]
        [Parameter(Mandatory = $true, ParameterSetName = 'SpaceID')]
        [uint64]$TemplateID,
        [Parameter(Mandatory = $true, ParameterSetName = 'FolderID')]
        [Parameter(Mandatory = $true, ParameterSetName = 'SpaceID')]
        [uint64]$Name,
        [Parameter(ParameterSetName = 'FolderID')]
        [Parameter(ParameterSetName = 'SpaceID')]
        [bool]$ReturnImmediately,
        [Parameter(ParameterSetName = 'FolderID')]
        [Parameter(ParameterSetName = 'SpaceID')]
        [string]$Content,
        [Parameter(ParameterSetName = 'FolderID')]
        [Parameter(ParameterSetName = 'SpaceID')]
        [bool]$TimeEstimate,
        [Parameter(ParameterSetName = 'FolderID')]
        [Parameter(ParameterSetName = 'SpaceID')]
        [bool]$Automation,
        [Parameter(ParameterSetName = 'FolderID')]
        [Parameter(ParameterSetName = 'SpaceID')]
        [bool]$IncludeViews,
        [Parameter(ParameterSetName = 'FolderID')]
        [Parameter(ParameterSetName = 'SpaceID')]
        [bool]$OldDueDate,
        [Parameter(ParameterSetName = 'FolderID')]
        [Parameter(ParameterSetName = 'SpaceID')]
        [bool]$OldStartDate,
        [Parameter(ParameterSetName = 'FolderID')]
        [Parameter(ParameterSetName = 'SpaceID')]
        [bool]$OldFollowers,
        [Parameter(ParameterSetName = 'FolderID')]
        [Parameter(ParameterSetName = 'SpaceID')]
        [bool]$CommentAttachments,
        [Parameter(ParameterSetName = 'FolderID')]
        [Parameter(ParameterSetName = 'SpaceID')]
        [bool]$RecurSettings,
        [Parameter(ParameterSetName = 'FolderID')]
        [Parameter(ParameterSetName = 'SpaceID')]
        [bool]$OldTags,
        [Parameter(ParameterSetName = 'FolderID')]
        [Parameter(ParameterSetName = 'SpaceID')]
        [bool]$OldStatuses,
        [Parameter(ParameterSetName = 'FolderID')]
        [Parameter(ParameterSetName = 'SpaceID')]
        [bool]$Subtasks,
        [Parameter(ParameterSetName = 'FolderID')]
        [Parameter(ParameterSetName = 'SpaceID')]
        [bool]$CustomType,
        [Parameter(ParameterSetName = 'FolderID')]
        [Parameter(ParameterSetName = 'SpaceID')]
        [bool]$OldAssignees,
        [Parameter(ParameterSetName = 'FolderID')]
        [Parameter(ParameterSetName = 'SpaceID')]
        [bool]$Attachments,
        [Parameter(ParameterSetName = 'FolderID')]
        [Parameter(ParameterSetName = 'SpaceID')]
        [bool]$Comment,
        [Parameter(ParameterSetName = 'FolderID')]
        [Parameter(ParameterSetName = 'SpaceID')]
        [bool]$OldStatus,
        [Parameter(ParameterSetName = 'FolderID')]
        [Parameter(ParameterSetName = 'SpaceID')]
        [bool]$ExternalDependencies,
        [Parameter(ParameterSetName = 'FolderID')]
        [Parameter(ParameterSetName = 'SpaceID')]
        [bool]$InternalDependencies,
        [Parameter(ParameterSetName = 'FolderID')]
        [Parameter(ParameterSetName = 'SpaceID')]
        [bool]$Priority,
        [Parameter(ParameterSetName = 'FolderID')]
        [Parameter(ParameterSetName = 'SpaceID')]
        [bool]$CustomFields,
        [Parameter(ParameterSetName = 'FolderID')]
        [Parameter(ParameterSetName = 'SpaceID')]
        [bool]$OldChecklists,
        [Parameter(ParameterSetName = 'FolderID')]
        [Parameter(ParameterSetName = 'SpaceID')]
        [bool]$Relationships,
        [Parameter(ParameterSetName = 'FolderID')]
        [Parameter(ParameterSetName = 'SpaceID')]
        [bool]$OldSubtaskAssignees,
        [Parameter(ParameterSetName = 'FolderID')]
        [Parameter(ParameterSetName = 'SpaceID')]
        [datetime]$StartDate,
        [Parameter(ParameterSetName = 'FolderID')]
        [Parameter(ParameterSetName = 'SpaceID')]
        [datetime]$DueDate,
        [Parameter(ParameterSetName = 'FolderID')]
        [Parameter(ParameterSetName = 'SpaceID')]
        [bool]$RemapStartDate,
        [Parameter(ParameterSetName = 'FolderID')]
        [Parameter(ParameterSetName = 'SpaceID')]
        [bool]$SkipWeekends,
        [Parameter(ParameterSetName = 'FolderID')]
        [Parameter(ParameterSetName = 'SpaceID')]
        [ValidateSet(1, 2, $null)]
        [int]$Archived
    )

    Write-Verbose 'Entering New-ClickUpListFromTemplate'
    $Body = @{
        name               = $Name
        return_immediately = $ReturnImmediately
    }

    if ($PSBoundParameters.ContainsKey('Content')) {
        $Body.Add('content', $Content)
    }
    if ($PSBoundParameters.ContainsKey('TimeEstimate')) {
        $Body.Add('time_estimate', $TimeEstimate)
    }
    if ($PSBoundParameters.ContainsKey('Automation')) {
        $Body.Add('automation', $Automation)
    }
    if ($PSBoundParameters.ContainsKey('IncludeViews')) {
        $Body.Add('include_views', $IncludeViews)
    }
    if ($PSBoundParameters.ContainsKey('OldDueDate')) {
        $Body.Add('old_due_date', $OldDueDate)
    }
    if ($PSBoundParameters.ContainsKey('OldStartDate')) {
        $Body.Add('old_start_date', $OldStartDate)
    }
    if ($PSBoundParameters.ContainsKey('OldFollowers')) {
        $Body.Add('old_followers', $OldFollowers)
    }
    if ($PSBoundParameters.ContainsKey('CommentAttachments')) {
        $Body.Add('comment_attachments', $CommentAttachments)
    }
    if ($PSBoundParameters.ContainsKey('RecurSettings')) {
        $Body.Add('recur_settings', $RecurSettings)
    }
    if ($PSBoundParameters.ContainsKey('OldTags')) {
        $Body.Add('old_tags', $OldTags)
    }
    if ($PSBoundParameters.ContainsKey('OldStatuses')) {
        $Body.Add('old_statuses', $OldStatuses)
    }
    if ($PSBoundParameters.ContainsKey('Subtasks')) {
        $Body.Add('subtasks', $Subtasks)
    }
    if ($PSBoundParameters.ContainsKey('CustomType')) {
        $Body.Add('custom_type', $CustomType)
    }
    if ($PSBoundParameters.ContainsKey('OldAssignees')) {
        $Body.Add('old_assignees', $OldAssignees)
    }
    if ($PSBoundParameters.ContainsKey('Attachments')) {
        $Body.Add('attachments', $Attachments)
    }
    if ($PSBoundParameters.ContainsKey('Comment')) {
        $Body.Add('comment', $Comment)
    }
    if ($PSBoundParameters.ContainsKey('OldStatus')) {
        $Body.Add('old_status', $OldStatus)
    }
    if ($PSBoundParameters.ContainsKey('ExternalDependencies')) {
        $Body.Add('external_dependencies', $ExternalDependencies)
    }
    if ($PSBoundParameters.ContainsKey('InternalDependencies')) {
        $Body.Add('internal_dependencies', $InternalDependencies)
    }
    if ($PSBoundParameters.ContainsKey('Priority')) {
        $Body.Add('priority', $Priority)
    }
    if ($PSBoundParameters.ContainsKey('CustomFields')) {
        $Body.Add('custom_fields', $CustomFields)
    }
    if ($PSBoundParameters.ContainsKey('OldChecklists')) {
        $Body.Add('old_checklists', $OldChecklists)
    }
    if ($PSBoundParameters.ContainsKey('Relationships')) {
        $Body.Add('relationships', $Relationships)
    }
    if ($PSBoundParameters.ContainsKey('OldSubtaskAssignees')) {
        $Body.Add('old_subtask_assignees', $OldSubtaskAssignees)
    }
    if ($PSBoundParameters.ContainsKey('StartDate')) {
        $Body.Add('start_date', (Get-DatePosixMilliseconds -DateTime $StartDate))
    }
    if ($PSBoundParameters.ContainsKey('DueDate')) {
        $Body.Add('due_date', (Get-DatePosixMilliseconds -DateTime $DueDate))
    }
    if ($PSBoundParameters.ContainsKey('RemapStartDate')) {
        $Body.Add('remap_start_date', $RemapStartDate)
    }
    if ($PSBoundParameters.ContainsKey('SkipWeekends')) {
        $Body.Add('skip_weekends', $SkipWeekends)
    }
    if ($PSBoundParameters.ContainsKey('Archived')) {
        $Body.Add('archived', $Archived)
    }

    try {
        if ($PSBoundParameters.ContainsKey('FolderID')) {
            Write-Verbose "Creating list from template $TemplateID in folder $FolderID"
            $NewList = Invoke-ClickUpAPIPost -Endpoint "folder/$FolderID/list_template/$TemplateID" -Body $Body
        }
        if ($PSBoundParameters.ContainsKey('SpaceID')) {
            Write-Verbose "Creating list from template $TemplateID in space $SpaceID"
            $NewList = Invoke-ClickUpAPIPost -Endpoint "space/$SpaceID/list_template/$TemplateID" -Body $Body
        }
        Write-Verbose 'Successfully created list from template'
        return $NewList
    } catch {
        Write-Error "Error in New-ClickUpListFromTemplate: $($_.Exception.Message)"
        throw $_
    }
}