Forum Discussion
Programmatically "Apply label to items in this list or library"
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/programmatically-apply-label-to-items-in-this-list-or-library?forum=onlineservicessharepoint but didn't get a real response ... surely this is possible / has been addressed by the PnP. Seems like a basic requirement.
- DeletedFeb 14, 2018
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 { }
- Deleted
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 { }
- manidevelopment12345Copper Contributor
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
- geraint jamesBrass Contributor
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....
- Deleted
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()- MSTestCopper Contributor
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,