前回紹介しましたPower AutomateによるTeamsのリアクションのカウント方法ですが、アクセス権のあるTeamsのチームとチャネルを指定した上でメッセージに対してのリアクション情報の取得に限定されています。また、対象となるメッセージやリアクション数多くなると、Apply to Eachでの処理速度が難点となります。今回はこれらの欠点を補うべくPowerShellで同様にTeamsのリアクションをカウントする方法を紹介します。
Teamsへの投稿
前回同様に一般的なチームの投稿の他にプライベートチーム、プライベートチャネルを用意してそこでメッセージを投稿してリアクションを付けています。
さらに、管理者がメンバーになっていないチームも用意して、メッセージを投稿してリアクションを付けています。
コード全体
全体としてはこのようなコードになります。
        
            
            
        
        
            1:
            $Account = "<アカウント>"
        
        
            2:
            $Password = ConvertTo-SecureString 'パスワード' -AsPlainText -Force
        
        
            3:
            $Credential = New-Object System.Management.Automation.PSCredential $Account, $Password
        
        
            4:
            
        
        
            5:
            Install-Module MSOnline -Force
        
        
            6:
            Install-Module -Name MicrosoftTeams -Force
        
        
            7:
            Install-Module Microsoft.Graph -Force
        
        
            8:
            
        
        
            9:
            Connect-MsolService -Credential $Credential
        
        
            10:
            Connect-MicrosoftTeams -Credential $Credential
        
        
            11:
            
        
        
            12:
            Select-MgProfile -Name "beta"
        
        
            13:
            $Scopes = @(
        
        
            14:
            Group.ReadWrite.All,
        
        
            15:
            GroupMember.ReadWrite.All,
        
        
            16:
            TeamsApp.ReadWrite.All,
        
        
            17:
            TeamsAppInstallation.ReadWriteForTeam,
        
        
            18:
            TeamsAppInstallation.ReadWriteSelfForTeam,
        
        
            19:
            TeamSettings.ReadWrite.All,
        
        
            20:
            TeamsTab.ReadWrite.All,
        
        
            21:
            TeamMember.ReadWrite.All,
        
        
            22:
            ChannelSettings.Read.All, 
        
        
            23:
            Channel.ReadBasic.All, 
        
        
            24:
            ChannelSettings.ReadWrite.All
        
        
            25:
            )
        
        
            26:
            Connect-MgGraph -Scopes $Scopes
        
        
            27:
            
        
        
            28:
            $Datas = @()
        
        
            29:
            $Users = Get-MsolUser
        
        
            30:
            $TargetTeams = Get-Team | ? {($_.DisplayName -eq "test202206") -Or ($_.DisplayName -eq "プライベートチーム202206") -Or ($_.DisplayName -eq "佐藤のチーム")}
        
        
            31:
            $TargetTeams | % {
        
        
            32:
                 $TeamId = $_.GroupId
        
        
            33:
                 Get-MgTeamChannel -TeamId $_.GroupId | % {
        
        
            34:
                      $ChannelId = $_.Id
        
        
            35:
                      $ChannelName = $_.DisplayName
        
        
            36:
                      $MembershipType = $_.MembershipType    
        
        
            37:
                      Get-MgTeamChannelMessage -TeamId $TeamId -ChannelId $ChannelId -Top 1000 | ? {$_.LastModifiedDateTime -ge "2022/6/1"}  | % {
        
        
            38:
                            $MessageSubject = $_.Subject
        
        
            39:
                            $MessageTime = $_.LastModifiedDateTime
        
        
            40:
                            $From = $_.From.User.DisplayName
        
        
            41:
                            $_.Reactions | % {
        
        
            42:
                                 $UserId = ($_.User).User.Id
        
        
            43:
                                 $UserName = ($Users | ? {$_.ObjectId -eq $UserId}).DisplayName
        
        
            44:
                                 $ReactionTime = $_.CreatedDateTime
        
        
            45:
                                 $Reaction = $_.ReactionType                 
        
        
            46:
                                 $objPs = New-Object PSCustomObject | Select ChannelName, MembershipType, MessageSubject, MessageTime, From, Name, ReactionTime, Reaction
        
        
            47:
                                 $objPs.ChannelName = $ChannelName
        
        
            48:
                                 $objPs.MembershipType = $MembershipType
        
        
            49:
                                 $objPs.MessageSubject = $MessageSubject
        
        
            50:
                                 $objPs.MessageTime = $MessageTime
        
        
            51:
                                 $objPs.From = $From
        
        
            52:
                                 $objPs.Name = $UserName
        
        
            53:
                                 $objPs.ReactionTime = $ReactionTime
        
        
            54:
                                 $objPs.Reaction = $Reaction
        
        
            55:
                                 $Datas += $objPs
        
        
            56:
                            }     
        
        
            57:
                      }
        
        
            58:
                 }
        
        
            59:
            }
        
        
            60:
            
        
        
            61:
            $Datas | Export-Csv -NoTypeInformation "C:\Data\TeamsReactions.csv" -Encoding UTF8
        
    
PowerShellでリアクション情報を取得
では早速コードを書いてゆきましょう。最初に資格情報です。Microsoft365の管理者アカウントとパスワードを指定します。
        
            
            
        
        
            1:
            $Account = "<アカウント>"
        
        
            2:
            $Password = ConvertTo-SecureString 'パスワード' -AsPlainText -Force
        
        
            3:
            $Credential = New-Object System.Management.Automation.PSCredential $Account, $Password
        
    
今回はMicrosoft365、TeamsとGraphのモジュールを利用するので、それぞれ読み込みます。MSOnlineモジュールはMicrosoft365全般についての情報取得に役立ちます。今回ユーザー一覧を取得するために利用します。MicrosoftTeamsモジュールはチーム一覧など基本的なTeamsの操作や情報取得のコマンドを提供しています。Microsoft.GraphモジュールはMicrosoft365などのクラウドサービスのAPIを簡単に利用できるサービスで、PowerShjellからでも利用できるようにモジュールが提供されています。Teamsのコマンドで足りないところはこちらで補います。
        
            
            
        
        
            5:
            Install-Module MSOnline -Force
        
        
            6:
            Install-Module -Name MicrosoftTeams -Force
        
        
            7:
            Install-Module Microsoft.Graph -Force
        
    
こちらはMicrosoft.Graphを使って、PowerShellからアイテム分析情報を利用するためのおまじないです。アイテム分析情報コマンドはベータ版でのみ使用可能となるため、これを呼び出す前にベータ版プロフィールに切り替えます。
        
            
            
        
        
            12:
            Select-MgProfile -Name "beta"
        
    
Microsoft.Graphを使ってリソースにアクセスする範囲と権限を指定します。これによって全てのチームやチャネルの投稿から情報を取得することができるようになります。
        
            
            
        
        
            13:
            $Scopes = @(
        
        
            14:
            Group.ReadWrite.All,
        
        
            15:
            GroupMember.ReadWrite.All,
        
        
            16:
            TeamsApp.ReadWrite.All,
        
        
            17:
            TeamsAppInstallation.ReadWriteForTeam,
        
        
            18:
            TeamsAppInstallation.ReadWriteSelfForTeam,
        
        
            19:
            TeamSettings.ReadWrite.All,
        
        
            20:
            TeamsTab.ReadWrite.All,
        
        
            21:
            TeamMember.ReadWrite.All,
        
        
            22:
            ChannelSettings.Read.All, 
        
        
            23:
            Channel.ReadBasic.All, 
        
        
            24:
            ChannelSettings.ReadWrite.All
        
        
            25:
            )
        
        
            26:
            Connect-MgGraph -Scopes $Scopes
        
    
リアクション情報からユーザーIDが取得できるので、ユーザー名を参照するために、Get-MsolUserコマンドでユーザー一覧情報を取得しておきます。
        
            
            
        
        
            29:
            $Users = Get-MsolUser
        
    
Get-Teamコマンドでは全てのチームを取得できますが、情報を収集する体調チームを絞ることもできます。今回は3つのチームに限定しています。
        
            
            
        
        
            30:
            $TargetTeams = Get-Team | ? {($_.DisplayName -eq "test202206") -Or ($_.DisplayName -eq "プライベートチーム202206") -Or ($_.DisplayName -eq "佐藤のチーム")}
        
    
いくつかForEachがありますので、それぞれ見てゆきましょう。
        
            
            
        
        
            31:
            $TargetTeams | % {
        
        
            32:
                 $TeamId = $_.GroupId
        
        
            33:
                 Get-MgTeamChannel -TeamId $_.GroupId | % {
        
        
            34:
                      $ChannelId = $_.Id
        
        
            35:
                      $ChannelName = $_.DisplayName
        
        
            36:
                      $MembershipType = $_.MembershipType    
        
        
            37:
                      Get-MgTeamChannelMessage -TeamId $TeamId -ChannelId $ChannelId -Top 1000 | ? {$_.LastModifiedDateTime -ge "2022/6/1"}  | % {
        
        
            38:
                            $MessageSubject = $_.Subject
        
        
            39:
                            $MessageTime = $_.LastModifiedDateTime
        
        
            40:
                            $From = $_.From.User.DisplayName
        
        
            41:
                            $_.Reactions | % {
        
        
             
             
        
        
             
            ~中略~
        
        
             
             
        
        
        
            56:
                            }     
        
        
            57:
                      }
        
        
            58:
                 }
        
        
            59:
            }
        
    
31行目 メッセージを取得する対象のチームすべてに対して実行します。33行目 各チーム内の全てのチャネルに対して実行します。37行目 チャネル内のメッセージを取得します。               -Top オプションを指定しない場合は既定で20投稿まで取得します。日付を指定してフィルタすることも可能です。41行目 リアクション情報を取得します。複数のリアクションとなるのでこちらもForEachで全て取得します。
事前に Get-MsolUser コマンドで取得したユーザーリストからユーザーIDをキーとしてユーザー名を抽出しています。
        
            
            
        
        
            43:
            $UserName = ($Users | ? {$_.ObjectId -eq $UserId}).DisplayName
        
    
PSCustomObject を作成してリアクションをカウントするために必要な情報を格納します。
        
            
            
        
        
            46:
            $objPs = New-Object PSCustomObject | Select ChannelName, MembershipType, MessageSubject, MessageTime, From, Name, ReactionTime, Reaction
        
    
リアクション情報を配列変数に格納します。
        
            
            
        
        
            55:
            $Datas += $objPs
        
    
最後に配列をcsvに出力します。
        
            
            
        
        
            61:
            $Datas | Export-Csv -NoTypeInformation "C:\Data\TeamsReactions.csv" -Encoding UTF8
        
    
実行結果
実行してみましょう。csvファイルとして、リアクションの情報が出力されました。
 以上が、PowerShellによるTeamsのリアクションカウント方法となります。取得したデータはリアクションの集計だけではなく、「承認の代わり」にしたり、重要な投稿を「誰がまだ未読か」などデータとして取得・集計することで色々と活用方法がありそうです。
実行してみると分かると思いますが、前回のPower Automateで同様のフローを作成しましたが、メンバーではないチームの投稿や、プライベートチャネルの投稿についても情報が取得できています。また、実行速度も明らかにPowerShellで処理した方が速いのも確認できると思います。
 Power Automateは手軽に開発できる簡易版のツールとしては最適です。一方大量のデータに対しての情報処理などはやはりPowerShellなどプログラミングアプローチが圧倒的に優位となります。利用シーンに合わせて、どちらでも対応できるスキルを身に着けておくと活躍の場が広がりそうです。