科技 · 實用指南
將 Teams 出席報告合併成一份活頁簿
合併資料夾中的英文 Teams 出席 CSV 報告,同時保留出席者姓名、會議資料、原始時長,以及每個輸入檔案的紀錄。

要合併這些報告,先取出各份報告的 Participants 表格,為每一列加上該份報告的 Summary 欄位,再將各列合併。下方的轉換工具會對資料夾中符合支援格式的英文 Teams CSV 檔案執行這些步驟,產生一份包含 Participants、Meetings 和 Files 工作表的活頁簿。
合併結果會將姓名、原始加入與離開時間、出席時長和來源檔名保留在一起。工具也會建立 audit.json,保存原始參與者與摘要欄位值,方便你將活頁簿與輸入檔案對照。你需要 Python 3.11 或更新且仍受支援的版本,以及電腦上的終端機;轉換工具會在你的電腦上處理已下載的檔案。
確認報告符合這個版面結構
以純文字開啟一份報告,或在不儲存變更的情況下檢視。這個版本要求依序出現三個分區標籤:1. Summary、2. Participants 和 3. In-Meeting Activities。此結構已與一份由獨立來源公開的原始報告核對;這是工具明確支援的輸入格式,不代表每種 Teams 匯出報告都有相同結構。
Summary 必須包含 Meeting title、Attended participants、Start time、End time、Meeting duration 和 Average attendance time。這些欄位的順序可以不同,額外的摘要欄位也會保留。Meeting title 可以留空;其餘五個必要欄位都必須有值。
Participants 表頭必須恰好包含以下七個欄位,且順序相同:Name、First Join、Last Leave、In-Meeting Duration、Email、Participant ID (UPN)、Role。Email 和 Participant ID (UPN) 可以留空。其餘必要的參與者欄位都必須有值。
Activities 表頭必須恰好包含以下六個欄位,且順序相同:Name、Join Time、Leave Time、Duration、Email、Role。轉換工具會檢查這個分區的結構,但不會將其中的時間區間列加入 Participants。工具支援帶有位元組順序標記的 UTF-8 和 UTF-16 檔案,也支援不帶此標記的 UTF-8;只要整份結構符合要求,就能使用定位字元、逗號或分號作為分隔符號。
將要合併的報告放進同一個資料夾
建立名為 Teams-Month 的工作資料夾,並在其中建立名為 reports 的子資料夾。將要合併的 CSV 檔案直接放在 reports 裡。工具不會搜尋更下層的子資料夾。請保留下載的原始檔案;用試算表應用程式開啟後另存,可能會在轉換工具讀取之前改變日期、編碼或其他欄位值。
為每一次要納入的會議選擇一份最終報告。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 套件,處理報告期間也不會發出網路請求。
閱讀活頁簿中的三張工作表
Participants 是合併後的明細表。前七欄保留原始參與者欄位。Source file 和 Source SHA256 用來識別輸入報告,後面以 Summary: 開頭的欄位則帶入該份報告的會議資料。篩選 Source file 可查看單份報告;篩選 Name 或 Email,可檢視所選報告中對應的紀錄。
Meetings 會為每份保留報告建立一列,包含來源、參與者列數、數量比較,以及 Summary 欄位值。這張表的列數代表保留的報告檔案數。當你已為每次要納入的會議選定一份報告後,它就能作為實用的會議清單。
Files 會記錄每個輸入 CSV,包括精確副本。Status 的值為 included 或 exact_duplicate_skipped;Duplicate of 會指出副本所對應的保留檔案。Participants rows 和 Activities rows excluded 可讓你查看兩個分區各自如何處理。當 Summary 的 Attended participants 值僅含十進位數字時,Count check 會將它與 Participants 的列數比較。
audit.json 會記錄相同的檔案清單、計數和活頁簿指紋,並透過 retained_reports 保存原始 Participants 列及依原順序排列的 Summary 鍵值配對。請將它與原始 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,活頁簿仍可開啟,資料也會保留,但你需要回到該份來源報告檢查差異。數量相符只表示兩個計數一致,不能證明每一列都是不同的人,也不能證明來源報告完整無缺。
保留日期、時長與重複姓名的原始脈絡
像 3/04/24 這樣的值會維持完全相同的文字。轉換工具不會猜測它代表 3 月 4 日還是 4 月 3 日。在另一份分析副本中進行日期運算之前,請先確認匯出檔案採用的日期格式,並保留含有原值的欄位。
In-Meeting Duration 會依報告原值保留。輔助程式不會用 Last Leave 減去 First Join、不會加總活動時間區間、套用出席門檻,或計算認證時數。這些都是另有假設前提的額外計算;活頁簿提供的是報告中的原始欄位。
資料列不會依姓名、電子郵件或 Participant ID (UPN) 合併。不同紀錄可能出現相同的顯示名稱,空白電子郵件也會維持空白。同一個人出現在不同場次的紀錄中,可能本來就是正確的。
Microsoft 說明了原始報告的限制,包括不會列入從未獲准由大廳進入會議的人,以及以僅檢視模式參與的出席者。合併下載的檔案,無法補回檔案中原本沒有的資料。請將活頁簿視為這些報告整理後的版本,同時保留對其限制的認知。
檔案遭拒絕時的處理方式
不支援的表頭、缺少分區、引號格式有誤的欄位、必要欄位留空,或無法讀取的檔案,都會產生指出受影響檔名的錯誤。轉換工具會先檢查整批檔案,再建立輸出;不會悄悄略過遭拒絕的 CSV,卻將剩餘資料標示為完整結果。
請將錯誤指出的檔案與前述三分區結構比對。如果檔案曾意外另存或已損壞,而你還能重新取得原始匯出檔案,請使用新的原始檔案。其他產品或不同版面結構的報告,請放在這個輸入資料夾之外。不要只為了通過驗證而替不熟悉的欄位改名,因為相似的標籤可能代表不同資料。
如果你的真實報告使用其他語言或結構,這個輔助程式就不支援。另一個選擇是針對實際版面調整 Power Query 轉換。Microsoft 的資料夾合併文件說明了如何將範例檔案的轉換套用到每個符合條件的檔案,並保留來源名稱。
輸出目錄錯誤表示需要選擇新的目的地;找不到 Python 則表示需要修正直譯器安裝。這兩種情況都不需要變更報告內容。請保留錯誤訊息與來源檔案,直到相應問題解決。
什麼情況下適合採用其他流程
Tom Riha 現有的 Power Automate 教學會在報告上傳時擷取 Participants,適合持續上傳報告的流程。獲授權的管理員也可以使用報表或稽核資料流程收集會議資訊。本文的方法則從你已備妥的報告資料夾開始,一次執行便產生合併後的活頁簿。
轉換工具依照前述格式處理,並將儲存格寫成字面文字。它使用虛構報告進行檢查,涵蓋含引號的姓名、空白身分欄位、多種編碼、重複檔案和失敗情況。這不等同於已在你的 Teams 租用戶中測試,也不保證每個試算表程式另存時都會保留每一個字串。請保留原始 CSV 和記錄原值的稽核檔案作為對照依據。
