Qiita Teams that are logged in
You are not logged in to any team

Log in to Qiita Team
Community
OrganizationAdvent CalendarQiitadon (β)
Service
Qiita JobsQiita ZineQiita Blog
Help us understand the problem. What is going on with this article?

SharePoint Online DocumentLibrary List Retrive(取得) and Add(追加) Using PnP PowerShell (MFA)

YOutube 説明動画

YOutube 説明動画のリンク
image.png

概要

SharePoint Online DocumentLibrary List Retrive(取得) and Add(追加) Using PnP PowerShell (MFA)

説明

SharePoint のデータ移行や一覧作成するためのプログラム、こちらを内容に合わせて編集してください。

主な機能

ドキュメントライブラリーの一覧取得、ファイルのアップロード・ダウンロード
リストの一覧取得、添付ファイルのアップロード・ダウンロード

SharePoint イメージ

customlist1

image.png

documnt1

image.png

###################################
# 概要
# SharePoint Online  DocumentLibrary List Retrive(取得) and Add(追加) Using PnP PowerShell (MFA)
#
# 説明
# SharePoint のデータ移行や一覧作成するためのプログラム、こちらを内容に合わせて編集してください。
# 主な機能
# ドキュメントライブラリーの一覧取得、ファイルのアップロード・ダウンロード
# リストの一覧取得、添付ファイルのアップロード・ダウンロード

# ライセンス
# MIT License
#
# 作成者
# 株式会社エクシード・ワン 野呂清二
#
###################################


###################################
# モジュールの読み込み
# SharePoint PnP モジュールの読み込み
###################################
function loadMoudle($moduleName)
{
    if (-not (Get-Module -Name $moduleName)) {
        #PnPPowerShellのモジュールをインストールする
        Install-Module -Name $moduleName
    }
}

###################################
# Webログイン
# 最近MFAを利用しているSharePointが増えたので、Webログインにしています。
###################################
function login($SiteURL)
{

    #既にログインしていないか確認する
    $IsConnect =  $FALSE

    try {
        if (Get-PnPContext) {
            $IsConnect =  $TRUE
        }
    }
    catch {
    }


    #ログインしていない場合はログインする
    if($IsConnect -eq $FALSE)
    {
        #ログインしていない場合はWebログインする(MFAを回避するため)
        Connect-PnPOnline -Url $SiteURL -UseWebLogin
    }
}

###################################
# リスト一覧取得
###################################
function list_retrive($listName, $folder_date)
{
    $folder_Root_CSVFileName = $folder_date + "\list.csv"
    $hashTableCSVItems=@()

    #リスト一覧取得

    <#
    #CSV出力(A)
    $listItems= (Get-PnPListItem -List $listName -Fields $Global:selectProperties).FieldValues  
    #>


    #CSV出力(B)
    $Items= (Get-PnPListItem -List $listName -Fields "Title","detail")  
    foreach($Item in $Items){  
        #Write-Host "Title" : $listItem["Title"]  
        #Write-Host "Detail" : $listItem["detail"]  
        #Write-Host "---------------------------"  

        <#
        #CSV出力(A)
        $folder_Root_Id = $folder_date + "\" + $Item.ID + "\"
        $obj=New-Object PSObject              
        $Item.GetEnumerator() | Where-Object { $_.Key -in $Global:selectProperties }| ForEach-Object{ $obj | Add-Member Noteproperty $_.Key $_.Value}
        $hashTable+=$obj;  
        $obj=$null;  
        #>

        #CSV出力(B)
        $folder_Root_Id = $folder_date + "\" + $Item.Id + "\"
        $objCSVItem = New-Object PSObject
        $objCSVItem | Add-Member -MemberType NoteProperty -name "Id" -value $Item.Id
        $objCSVItem | Add-Member -MemberType NoteProperty -name "Title" -value $Item["Title"]
        $objCSVItem | Add-Member -MemberType NoteProperty -name "detail" -value $Item["detail"]

        #添付ファイル出力        
        New-Item -Path $folder_Root_Id -ItemType Directory
        $attachments = ForEach-Object{Get-PnPProperty -ClientObject $Item -Property "AttachmentFiles"} 
        $attachments | ForEach-Object { Get-PnPFile -Url $_.ServerRelativeUrl -FileName $_.FileName -Path $folder_Root_Id -AsFile } 


        #添付ファイルをセミコロンで、連結する(#splitで分解できるようにしておく)
        $hashTableAttachment = @()
        $attachments | ForEach-Object { $hashTableAttachment += $_.FileName} 
        $attachementsCombine = $hashTableAttachment -join ";" #splitで分解できるようにしておく
        $objCSVItem | Add-Member -MemberType NoteProperty -name "attachements" -value $attachementsCombine


        #CSV出力用にハッシュテーブルに入れる
        $hashTableCSVItems += $objCSVItem
    }  

    #CSVファイル出力 
    $hashTableCSVItems | export-csv $folder_Root_CSVFileName -NoTypeInformation  
}


###################################
# リスト書き込み(シンプル)
###################################
function list_writeItemSimple($listName, $itemTitle,$detail)
{
    $item=Add-PnPListItem -List $listName
    $newListItem = Set-PnPListItem -Identity $Item.Id -List $listName -Values @{"Title" = $itemTitle; "detail" = $detail}
}

###################################
# リスト書き込み(添付ファイル)
###################################
function list_writeItemAttachment($listName, $itemTitle,$detail,$attachments)
{
    $item=Add-PnPListItem -List $listName
    $newListItem = Set-PnPListItem -Identity $Item.Id -List $listName -Values @{"Title" = $itemTitle; "detail" = $detail}

    for ($a=0; $a -lt $attachments.length; $a++) {
        #Write-host " " $attachments[$a]
        list_writeAttachmentSub -item $item -fileWithPath  $attachments[$a]
    }
}

#書き込み(添付ファイルサブ)
function list_writeAttachmentSub($item, $fileWithPath)
{
    $ctx=Get-PnPContext
    $memoryStream = New-Object IO.FileStream($fileWithPath,[System.IO.FileMode]::Open)
    $fileName = Split-Path $fileWithPath -Leaf
    $attachInfo = New-Object -TypeName Microsoft.SharePoint.Client.AttachmentCreationInformation
    $attachInfo.FileName = $fileName
    $attachInfo.ContentStream = $memoryStream
    $attFile = $item.attachmentFiles.add($attachInfo)
    $ctx.load($attFile)
    $ctx.ExecuteQuery()
}


###################################
# ドキュメントライブラリ一覧取得
###################################
function doclib_retrive($documentName, $folder_date)
{
    $folder_Root_CSVFileName = $folder_date + "\document.csv"
    $hashTableCSVItems=@()

    $folder_Root_files = $folder_date + "\files\"
    New-Item -Path $folder_Root_files -ItemType Directory


    $Items = Get-PnPListItem -List $documentName -Fields "FileRef", "File_x0020_Type", "FileLeafRef"

    foreach($Item in $Items){  
        $hashTableCSVItems += New-Object PSObject -Property @{
            Path          = $Item["FileRef"]
            FileName      = $Item["FileLeafRef"]
            FileExtension = $Item["File_x0020_Type"]
        }

        #ファイル出力
        Get-PnPFile -Url $Item["FileRef"] -Path $folder_Root_files -FileName $Item["FileLeafRef"] -AsFile  
    }
    $hashTableCSVItems | Export-Csv -Path $folder_Root_CSVFileName -NoTypeInformation
}


###################################
# ドキュメントライブラリー書き込み
###################################
function doclib_writeItem($documentName, $attachments)
{
    #コンテキストを読み込む
    $ctx = Get-PnPContext
    $ctx.load($ctx.web)
    $ctx.executequery()

    #対象リストを探す
    $lists = $ctx.web.lists
    $ctx.load($lists)
    $ctx.executequery()
    $myList = $lists | Where-Object{$_.Title -match $documentName}


    ForEach ($attachment in $attachments) {
        #ローカルファイルパスからファイル名を取り出す
        $splits = $attachment.split("\")
        $length=$splits.length;  
        $newFileName = $splits[$length-1]; 

        #ファイルを準備する
        $newFile = new-object Microsoft.SharePoint.Client.fileCreationInformation
        $newFile.Url = $ctx.web.url + "/document1/" + $newFileName
        $newFile.Content = [System.IO.File]::ReadAllBytes($attachment)

        #アップロードする
        $addFile = $myList.RootFolder.Files.Add($newFile)
        $ctx.load($addFile)
        $ctx.executequery()
    }
}



###################################
###################################
# メインルーチン
###################################
###################################
 try {
    ######### モジュール読み込み、Webログイン ######### 
    loadMoudle -moduleName "SharePointPnPPowerShellOnline"
    login  -SiteURL  "https://exceedone.sharepoint.com/sites/dev-snoro-communication"


    $folder = "C:\temp"
    $folder_date = $folder + "\" + ([System.DateTime]::Now).ToString("yyyyMMdd_HHmmss")
    New-Item -Path $folder_date -ItemType Directory

    $files=@("C:\temp\c.txt","C:\temp\d.txt")



    ######### リスト 開始 #########     
    $listName = "customlist1"

    #リスト一覧取得
    list_retrive -listName $listName  -folder_date $folder_date

    #リスト書き込み(シンプル)
    list_writeItemSimple -listName $listName -itemTitle "tilte2" -detail "detail2"


    #リスト書き込み(添付ファイル)
    list_writeItemAttachment -listName $listName -itemTitle "title3" -detail "detail3" -attachments $files  
    ######### リスト 終了 ######### 

    ######### ドキュメントライブラリー 開始 ######### 
    $documentName = "document1"

    #ドキュメントライブラリー一覧取得
    doclib_retrive -documentName $documentName -folder_date $folder_date

    #ドキュメントライブラリー書き込み
    doclib_writeItem -documentName $documentName -attachments $files  
    ######### ドキュメントライブラリー 終了 ######### 
 }
 catch {
    $e = $_.Exception
    $line = $_.InvocationInfo.ScriptLineNumber
    $msg = $e.Message 
    Write-Host "Error: $e at $line" -foregroundcolor black -backgroundcolor Red
 }
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away