テクノロジー · 実用ガイド
Teams の出席レポートを 1 つのブックにまとめる
英語の Teams 出席レポート CSV が入ったフォルダーをまとめ、出席者の名前、会議の詳細、元の出席時間、すべての入力ファイルの記録を残します。

レポートをまとめるには、各レポートの Participants テーブルに、そのレポートの Summary 項目を付け加えてから行を結合します。以下の変換ツールは、対応する英語の Teams CSV ファイルが入ったフォルダーに対してこの処理を行い、Participants、Meetings、Files の 3 つのシートを持つ 1 つのブックを作成します。
作成したブックには、名前、元の参加・退出時刻の値、出席時間、元ファイル名がまとまって残ります。また、参加者と Summary の元の値を記録した audit.json も作成するため、ブックと入力ファイルを照合できます。Python 3.11 以降のサポート対象バージョンと、パソコンのターミナルが必要です。変換ツールは、ダウンロード済みのファイルをお使いのパソコン上で処理します。
レポートがこの構成に合うか確認する
レポートを 1 つテキストとして開くか、変更を保存せずに内容を確認してください。このバージョンでは、1. Summary、2. Participants、3. In-Meeting Activities という 3 つのセクションラベルが、この順に並んでいることを前提とします。この構成は、第三者が公開した元のレポートと照合しています。対応する入力形式を定めたものであり、Teams からエクスポートしたすべてのファイルが同じ構成であることを保証するものではありません。
Summary には Meeting title、Attended participants、Start time、End time、Meeting duration、Average attendance time が必要です。これらの順序は問いません。追加の Summary 項目も保持します。Meeting title は空欄でも構いませんが、残る 5 つの必須項目には値が必要です。
Participants のヘッダーは、Name、First Join、Last Leave、In-Meeting Duration、Email、Participant ID (UPN)、Role の 7 項目が、この順に過不足なく並んでいる必要があります。Email と Participant ID (UPN) は空欄でも構いません。残る必須項目には値が必要です。
Activities のヘッダーは、Name、Join Time、Leave Time、Duration、Email、Role の 6 項目が、この順に過不足なく並んでいる必要があります。変換ツールはこのセクションの構成を確認しますが、参加・退出区間の行を Participants に追加することはありません。バイトオーダーマーク付きの UTF-8 および UTF-16 ファイルと、バイトオーダーマークなしの UTF-8 ファイルに対応しています。区切り文字はタブ、カンマ、セミコロンに対応しますが、全体の構成が一致している必要があります。
まとめたいレポートを 1 つのフォルダーに入れる
Teams-Month という作業フォルダーを作り、その中に reports というサブフォルダーを作成してください。まとめたい CSV ファイルは reports の直下に置きます。サブフォルダー内は検索しません。ダウンロードした元ファイルは保管してください。表計算ソフトで開いて保存し直すと、変換ツールが読み込む前に日付、文字コード、その他の値が変わることがあります。
対象とする各開催回について、最終版のレポートを 1 つずつ選びます。Microsoft は定期的な会議でも、開催回ごとに別のレポートを提供しています。まだファイルが必要で、開催者または共同開催者の権限がある場合は、終了した会議のチャットを開き、Attendance を選択して CSV をダウンロードしてください。月次データをまとめるときは、会議終了後のレポートを使います。
選んだファイルが今回の処理対象になります。同じ会議のレポートでも内容が異なることがあるため、ファイルのフィンガープリントが違うだけでは、別の開催回だとは判断できません。どの改訂版のレポートを残したいかを、変換ツールが判断することはありません。
変換ツールをダウンロードして実行する
必要であれば、https://www.python.org/downloads/ からサポート対象の Python 3 をインストールしてください。Windows では PowerShell、macOS ではターミナルを開きます。cd に続けて、引用符で囲んだフルパスを指定し、Teams-Month 作業フォルダーへ移動します。たとえば、Windows なら cd "C:\path\to\Teams-Month"、macOS なら cd "/path/to/Teams-Month" の例示パスを、ご自身のフォルダーのパスに置き換えてください。
先にインタープリターを確認します。Windows では python --version、macOS では python3 --version を実行してください。Python 3.11 以降と表示される必要があります。コマンドが見つからない場合は、公式のインストール手順を完了してからターミナルを開き直してください。インタープリターが見つからない問題と、レポート形式のエラーは別の問題です。
Windows では、次の PowerShell コマンドでバージョン 1 のツールをダウンロードします。このコマンドはソースファイルを保存するだけで、実行はしません。
Invoke-WebRequest -UseBasicParsing -Uri "https://watchatease.com/guide-tools/merge-teams-attendance-v1.py" -OutFile "merge-teams-attendance-v1.py"
macOS では、次のコマンドで同じファイルをダウンロードします。
curl --fail --location "https://watchatease.com/guide-tools/merge-teams-attendance-v1.py" --output "merge-teams-attendance-v1.py"
ダウンロードが完了したら、Windows では次のコマンドを実行します。reports フォルダーはあらかじめ存在している必要があり、month-output はまだ存在していてはいけません。
python "merge-teams-attendance-v1.py" "reports" --output-dir "month-output"
macOS では、次を実行します。
python3 "merge-teams-attendance-v1.py" "reports" --output-dir "month-output"
正常に完了すると、month-output 内に teams-attendance.xlsx と audit.json が作成され、参加者行の数、保持したレポート数、同一のコピーとして除外したファイル数が表示されます。ブックを開いて内容を確認してください。次回の実行時には、month-output-2 など新しい出力先名を指定します。ツールは既存のディレクトリを置き換えません。追加の Python パッケージは不要で、レポート処理中にネットワーク通信は行いません。
ブックの 3 つのシートを読む
Participants は、明細をまとめたテーブルです。先頭の 7 列には元の参加者項目を保持します。Source file と Source SHA256 で入力レポートを特定でき、その後に続く Summary: で始まる列には、そのレポートの会議情報が入ります。Source file で絞り込むと 1 つのレポートを確認できます。Name または Email で絞り込むと、選択したレポート全体から該当するエントリーを確認できます。
Meetings には、保持したレポートごとに 1 行が入り、元ファイル、参加者行の数、件数の比較、Summary の値を示します。このシートの行数は、保持したレポートファイルの数です。対象とする各開催回についてレポートを 1 つずつ選んでおくことで、会議一覧として役立ちます。
Files は、同一のコピーも含め、すべての入力 CSV を記録します。Status は included または exact_duplicate_skipped となり、コピーの場合は Duplicate of が保持されたファイルを示します。Participants rows と Activities rows excluded で、各セクションがどう扱われたかを確認できます。Count check は、Summary の Attended participants の値が通常の十進数字だけで書かれている場合、その値と Participants の行数を比較します。
audit.json には、同じファイル一覧、件数、ブックのフィンガープリントに加え、元の Participants 行と順序を保った Summary のキーと値の組を含む retained_reports が記録されます。元の CSV と一緒に保管してください。後で表計算ソフトがセルを変更したり、保存時に改行を正規化したりした場合でも、入力時の値を直接確認できる記録になります。
集計に使う前に処理対象を確認する
まず、reports 直下の CSV ファイルを数え、その数を Files シートと audit.json の input_file_count に照らし合わせます。意図したすべてのファイルに記録があることを確認してください。同一のコピーも Files には含まれますが、Participants や Meetings に行が追加されることはありません。
次に、Files を included で絞り込み、別途作成した作業用コピーで Participants rows の件数セルを数値に変換してから合計します。または、audit.json の participant_rows_written を使います。その合計は、ヘッダーを除いた Participants のデータ行数と一致するはずです。値を保持するため、ブック内のすべてのセルは、最初は文字列として書き込まれています。
included になった各元ファイルについて、Summary 項目と参加者のエントリーを元のレポートと比較してください。特に名前、In-Meeting Duration、それに対応する会議開始時刻の値を確認します。会議名が空欄の場合は空欄のままなので、Source file が識別の手がかりになります。
Count check が DIFFERS でも、ブックは開くことができ、データも保持されます。ただし、その差異は元のレポートで確認する必要があります。件数が一致して分かるのは、2 つの件数が合っているということです。各行がそれぞれ別の人物を表していることや、元のレポートに漏れがないことまで検証できるわけではありません。
日付、出席時間、繰り返し現れる名前の意味を保つ
3/04/24 のような値は、そのままの文字列として残ります。変換ツールは、それが 3 月 4 日なのか 4 月 3 日なのかを推測しません。別途作成した分析用コピーで日付の計算を行う前に、エクスポート時の日付表記の規則を確認し、元の値を持つ列も参照できるようにしておいてください。
In-Meeting Duration は、レポートに記載された値を保持します。ツールは Last Leave から First Join を引いたり、Activities の区間を合計したり、出席と見なす基準時間を適用したり、認定用の時間数を計算したりはしません。これらは、それぞれに前提を伴う追加の計算です。ブックは、その計算の基になるレポート項目を提供します。
名前、メールアドレス、Participant ID (UPN) によって行を統合することはありません。同じ表示名が別々のエントリーに現れることがあり、空のメールアドレスは空欄のままです。異なる開催回をまとめれば、同じ人物が複数回現れることは自然です。
Microsoft は、ロビーから入室を許可されなかった人や表示専用の出席者が含まれないことなど、元のレポートの制限を説明しています。ダウンロード済みファイルをまとめても、そこに存在しない情報を復元することはできません。ブックは、それらのレポートを、元の制限も引き継いで整理したものとして使ってください。
ファイルが受け付けられない場合
未対応のヘッダー、セクションの欠落、引用符で囲まれたフィールドの形式不正、必須項目の空欄、読み取れないファイルがあると、対象のファイル名を示すエラーになります。変換ツールは、出力を作成する前に処理対象全体を確認します。受け付けられない CSV を黙って飛ばし、残りのデータを完全な結果として扱うことはありません。
指摘されたファイルが、上記の 3 セクションの構成に合っているか確認してください。誤って保存し直したり破損したりした場合は、入手できるなら新たにエクスポートした元ファイルを使います。他の製品のレポートや構成が異なるレポートは、この入力フォルダーの外に置いてください。検証を通すためだけに、見慣れない列の名前を変更するのは避けてください。似た名前でも、別のデータを表すことがあります。
お使いの正式なレポートが別の言語や構成になっている場合、このツールでは対応していません。実際の構成に合わせた Power Query の変換処理が代替手段になります。Microsoft のフォルダー結合に関するドキュメントでは、サンプルファイルの変換を条件に合う各ファイルに適用し、元ファイル名を残す方法を説明しています。
出力先ディレクトリのエラーなら新しい保存先を選び、Python が見つからないエラーならインタープリターのインストールを修正します。どちらも、レポートの内容を変更する理由にはなりません。該当する問題が解決するまで、エラーと元ファイルを残しておいてください。
別の手順が適している場合
Tom Riha が公開している Power Automate の手順は、レポートのアップロード時に Participants を抽出するもので、継続的にアップロードする運用に適している場合があります。権限のある管理者は、レポートや監査データを使うワークフローで会議情報を収集することもできます。ここで紹介した方法は、すでに手元にあるレポートフォルダーを出発点とし、1 回の実行でそれらをまとめたブックを作成します。
変換ツールは、明示した形式に従い、値をそのまま文字列セルとして書き込みます。検証には架空のレポートを使い、引用符で囲まれた名前、本人識別項目の空欄、複数の文字コード、重複ファイル、失敗するケースを含めています。これは、お使いの Teams テナントでのテストを行ったことにはならず、どの表計算ソフトでも保存し直した際にすべての文字列が保たれるという保証でもありません。元の CSV と元の値を記録した監査ファイルを、照合の基準として保管してください。
