当前位置:网站首页 > 更多 > 玩电脑 > 正文

[玩转系统] SharePoint Online:使用 PowerShell 从 CSV 文件批量更新元数据属性

作者:精品下载站 日期:2024-12-15 00:03:04 浏览:13 分类:玩电脑

SharePoint Online:使用 PowerShell 从 CSV 文件批量更新元数据属性


要求:从 SharePoint Online 中的 CSV 批量更新多个文档的元数据。

SharePoint Online:PowerShell 从 CSV 文件批量编辑元数据属性

SharePoint Online 文件中的元数据有助于更有效地分类、分类和管理文件。我们有一个文档库,其中几个子文件夹中包含数百个文档,并且希望批量更新所有这些文档的元数据。相比之下,快速编辑是一种选择,但浏览每个文件夹并更新每个文档的属性很麻烦。

我们找到的解决方案是准备一个 CSV 文件,其中包含要更新的文件列表,并使用所需的元数据填充 CSV,并使用 PowerShell 脚本批量编辑 CSV 文件中所有文档的元数据。

PowerShell 将文档库中的所有文件转换为 CSV

让我们从给定 SharePoint Online 文档库的所有文件夹和子文件夹生成文档清单:


#Parameters
$SiteURL = "https://crescent.sharepoint.com/sites/marketing"
$ListName= "Branding"
$CSVOutput = "C:\Temp\DocInventory.csv"

#Connect to SharePoint Online site
Connect-PnPOnline $SiteURL -Interactive
 
#Get all Files from the document library
$ListItems = Get-PnPListItem -List $ListName -PageSize 2000 -Fields "FileLeafRef" | Where {$_.FileSystemObjectType -eq "File"}

#Iterate through each item
$DocumentsList = @()
Foreach ($Item in $ListItems) 
{
    #Extract File Name and URL
    $DocumentsList += New-Object PSObject -Property ([ordered]@{
        FileName          = $Item.FieldValues.FileLeafRef
        ServerRelativeURL = $Item.FieldValues.FileRef
    })
}
#Export the results
$DocumentsList | Export-Csv -Path $CSVOutput -NoTypeInformation

此脚本生成一个 CSV 文件,其中包含给定文档库中所有文件的“FileName”和“ServerRelativeURL”列。

PowerShell 用于批量更新 SharePoint Online 中的元数据

准备好文件列表后,使用相关元数据填充 CSV 文件并使用此脚本进行更新。该脚本使用“ServerRelativePath”作为获取文件和更新的密钥。这是我的 CSV 文件:

[玩转系统] SharePoint Online:使用 PowerShell 从 CSV 文件批量更新元数据属性

您可以从以下位置下载 CSV:


#Parameters
$SiteURL = "https://crescent.sharepoint.com/sites/marketing"
$ListName= "Branding"
$CSVFile = "C:\Temp\DocMetadata.csv"

#Function to get Lookup ID from Lookup Value
Function Get-LookupID($ListName, $LookupFieldName, $LookupValue)
{
    #Get Parent Lookup List and Field from Child Lookup Field's Schema XML
    $LookupField =  Get-PnPField -List $ListName -Identity $LookupFieldName
    [Xml]$Schema = $LookupField.SchemaXml
    $ParentListID = $Schema.Field.Attributes["List"].'#text'
    $ParentField  = $Schema.field.Attributes["ShowField"].'#text'
    $ParentLookupItem  = Get-PnPListItem -List $ParentListID -Fields $ParentField | Where {$_[$ParentField] -eq $LookupValue} | Select -First 1 
    If($ParentLookupItem -ne $Null)  { Return $ParentLookupItem["ID"] }  Else  { Return $Null }
}

Try {
    #Connect to SharePoint Online site
    Connect-PnPOnline $SiteURL -Interactive

    #Get the data from CSV file
    $CSVData = Import-CSV $CSVFile

    #Get fields to Update from the List - Skip Read-only, hidden fields and content type
    $ListFields = Get-PnPField -List $ListName | Where { (-Not ($_.ReadOnlyField)) -and (-Not ($_.Hidden)) -and ($_.InternalName -ne  "ContentType") }

    #Loop through each Row in the CSV file and update metadata
    ForEach($Row in $CSVData)
    {
        #Get All columns from CSV - Exclude "FileName" and "ServerRelativeURL" Columns
        $CSVFields = $Row | Get-Member -MemberType NoteProperty | Select -ExpandProperty Name | Where {$_.Name -notin ("FileName","ServerRelativeURL")}

        #Get the File to update
        $File = Get-PnPFile -Url $Row.ServerRelativeURL -AsListItem -ErrorAction SilentlyContinue
        If($File -ne $Null)
        {
            #Frame the Metadata to update
            $ItemValue = @{}

            #Map each field from CSV to target list
            Foreach($CSVField in $CSVFields)
            {
                $MappedField = $ListFields | Where {$_.InternalName -eq $CSVField}
                If($MappedField -ne $Null)
                {
                    $FieldName = $MappedField.InternalName
                    #Check if the Field value is not Null
                    If($Row.$CSVField -ne $Null)
                    {
                        #Handle Special Fields
                        $FieldType  = $MappedField.TypeAsString 
                        If($FieldType -eq "User" -or $FieldType -eq "UserMulti") #People Picker Field
                        {
                            $PeoplePickerValues = $Row.$FieldName.Split(",")
                            $ItemValue.add($FieldName,$PeoplePickerValues)
                        }
                        ElseIf($FieldType -eq "Lookup" -or $FieldType -eq "LookupMulti") #Lookup Field
                        {
                            $LookupIDs = $Row.$FieldName.Split(",") | ForEach-Object { Get-LookupID -ListName $ListName -LookupFieldName $FieldName -LookupValue $_ }                
                            $ItemValue.Add($FieldName,$LookupIDs)
                        }
                        Else
                        {
                            #Get Source Field Value and add to Hashtable
                            $ItemValue.Add($FieldName,$Row.$FieldName)
                        }
                    }
                }
            }
            #Update document properties
            Write-host "Updating Metadata of the File '$($Row.FileName)' at '$($Row.ServerRelativeURL)' with values:"
            $ItemValue | Format-Table
            Set-PnPListItem -List $ListName -Identity $File.Id -Values $ItemValue | Out-Null
        }
        Else
        {
            Write-Host "Could not find File at $($Row.ServerRelativeURL)' , Skipped!" -f Yellow
        }
    }
}
Catch {
    write-host "Error: $($_.Exception.Message)" -foregroundcolor Red
}

确保您的 CSV 列标题与文档库中元数据列的内部名称(而不是显示名称!)相匹配。此外,请验证一次 CSV 文件中输入的元数据格式。 (例如,如果您提供无效的元数据,则更新将不会发生 - 显然!)例如,对于 MMS 字段,格式应为 TermGroup|TermSet|Term

结论

总之,在 SharePoint Online 中批量更新元数据有助于更有效地组织和管理文件。通过同时更改多个文件的元数据,您可以节省时间并简化工作流程。尽管您可以使用多种第三方工具来批量更新 SharePoint Online 中的元数据,但我们使用了 CSV 和 PowerShell 脚本的内置功能来更新多个文件的元数据。通过遵循本指南中概述的步骤,您可以批量更新文件的元数据并提高整体工作效率。

您需要 登录账户 后才能发表评论

取消回复欢迎 发表评论:

关灯