SOLVED

Programmatically "Apply label to items in this list or library"

Deleted
Not applicable

I need to be able to programmatically set the default ComplianceInfo for a document library which via the UI is Settings \ Apply label to items in this list or library (Apply Label). 

 

I can see CSOM methods for a list item via ListItemAllFields.ComplianceInfo \ SetComplianceTag but I need to act as if the user has chosen a default compliance Label for the Document Library.

 

Any ideas on what property or methods to use would be highly appreciated or perhaps a work around (other than a headless browser) would be great please.

 

I previously posted this at https://social.technet.microsoft.com/Forums/en-US/a0617140-5197-4908-8799-9e6021c8d70b/programmatica... but didn't get a real response ... surely this is possible / has been addressed by the PnP. Seems like a basic requirement.

5 Replies
best response
Solution

In the end I resorted to PowerShell:

try
{

    $listId = (Get-PnPList "Shared Documents").Id

    $ie = New-Object -com InternetExplorer.Application 

    try
    {
        $applyLabelUrl = "$($spUrl)/_layouts/15/Hold.aspx?Tag=true&List={$($listId)}"
        Write-Host $applyLabelUrl

        $ie.visible = $true
        $ie.navigate($applyLabelUrl)

        for ($i = 0; $i -lt 300; $i++)
        { 
            if ($ie.ReadyState -eq 4) { break }

            Start-Sleep 1

            if ($i -eq 299) { throw "Unable to start IE session to simulate HP RM turning off inheritence." }
        }

        Start-Sleep 2

        $complianceTagDropDown = $ie.Document.getElementByID('ctl00_PlaceHolderMain_inputFormSectionMain_ctl01_ComplianceTagDropDown')
        if ($complianceTagDropDown.id -ne "ctl00_PlaceHolderMain_inputFormSectionMain_ctl01_ComplianceTagDropDown")
        {
            throw "Didn't get assurance that I found complianceTagDropDown"
        }
        else
        {
            $isFound = $false

            for ($i = 1; $i -lt $complianceTagDropDown.options.length; $i++)
            { 
                if ($complianceTagDropDown.options[$i].text -eq $labelName)
                {
                    $complianceTagDropDown.options[$i].selected = $true
                    $isFound = $true
                    break
                }		
            }

            if ($isFound -eq $false)
            {
                throw "Unable to select '$($labelName)' in complianceTagDropDown. No such option?"
            }


            $saveButton = $ie.Document.getElementByID('ctl00_PlaceHolderMain_ctl00_RptControls_btnOK')
            if ($saveButton.id -ne "ctl00_PlaceHolderMain_ctl00_RptControls_btnOK")
            {
                throw "Didn't get assurance that I found saveButton"
            }
            else
            {
                $saveButton.click()
            }

        }

    }
    finally
    {
        $ie.Parent.Quit()
        Start-Sleep 1
    }
}
finally
{
}

This was requested on UserVoice and it looks like this was included in the March 2018 SharePoint Online CSOM update. Mikael is very active in PnP, so hopefully we'll see it added there soon....

 

 

Came back to this a whilst later. Yes it was indeed included. When I refactored I found this article useful http://www.myfatblog.co.uk/index.php/2018/05/configuring-default-office-365-labels-using-powershell/. Shame I can't see a parameter to apply to existing documents but that wasn't too hard to do using a loop.

Applying to the document library as a default:

$complianceTags = [Microsoft.SharePoint.Client.CompliancePolicy.SPPolicyStoreProxy]::GetAvailableTagsForSite($spoContext,$spoContext.Url)
$spoContext.ExecuteQuery()

$complianceTag = $complianceTags | Where-Object { $_.TagName -eq $complianceTagName }

$doclib = Get-PnPList -Identity $docLibraryName -Includes RootFolder

[Microsoft.SharePoint.Client.CompliancePolicy.SPPolicyStoreProxy]::SetListComplianceTag($spoContext, $docLib.RootFolder.ServerRelativeUrl, $complianceTagName, $complianceTag.BlockDelete, $complianceTag.BlockEdit, $complianceTag.IsEventTag)
$spoContext.ExecuteQuery()

Hi Paul,

 

Can you please advise on a way for me to apply separate tags for individual items through script. Similar to the way we generally do by navigating to the item in the library -->Selecting retention label to apply

 

Regards,

Hi,

$ie.Document.getElementByID("ctl00_PlaceHolderMain_inputFormSectionMain_ctl01_ComplianceTagDropDown")

above line is not returning any value its giving empty .

 

Please help me out if you have any solution

 

Thanks in adavance

 

1 best response

Accepted Solutions
best response
Solution

In the end I resorted to PowerShell:

try
{

    $listId = (Get-PnPList "Shared Documents").Id

    $ie = New-Object -com InternetExplorer.Application 

    try
    {
        $applyLabelUrl = "$($spUrl)/_layouts/15/Hold.aspx?Tag=true&List={$($listId)}"
        Write-Host $applyLabelUrl

        $ie.visible = $true
        $ie.navigate($applyLabelUrl)

        for ($i = 0; $i -lt 300; $i++)
        { 
            if ($ie.ReadyState -eq 4) { break }

            Start-Sleep 1

            if ($i -eq 299) { throw "Unable to start IE session to simulate HP RM turning off inheritence." }
        }

        Start-Sleep 2

        $complianceTagDropDown = $ie.Document.getElementByID('ctl00_PlaceHolderMain_inputFormSectionMain_ctl01_ComplianceTagDropDown')
        if ($complianceTagDropDown.id -ne "ctl00_PlaceHolderMain_inputFormSectionMain_ctl01_ComplianceTagDropDown")
        {
            throw "Didn't get assurance that I found complianceTagDropDown"
        }
        else
        {
            $isFound = $false

            for ($i = 1; $i -lt $complianceTagDropDown.options.length; $i++)
            { 
                if ($complianceTagDropDown.options[$i].text -eq $labelName)
                {
                    $complianceTagDropDown.options[$i].selected = $true
                    $isFound = $true
                    break
                }		
            }

            if ($isFound -eq $false)
            {
                throw "Unable to select '$($labelName)' in complianceTagDropDown. No such option?"
            }


            $saveButton = $ie.Document.getElementByID('ctl00_PlaceHolderMain_ctl00_RptControls_btnOK')
            if ($saveButton.id -ne "ctl00_PlaceHolderMain_ctl00_RptControls_btnOK")
            {
                throw "Didn't get assurance that I found saveButton"
            }
            else
            {
                $saveButton.click()
            }

        }

    }
    finally
    {
        $ie.Parent.Quit()
        Start-Sleep 1
    }
}
finally
{
}

View solution in original post