如何由 CSV 建立組織圖

如何把一份 HRIS 的 CSV 匯出檔變成一張匯報線的圖:把 employee_id 與 manager_id 解析成列號、把主管欄所指的方向掉轉,並處理孤兒列與循環。

一份 HRIS 匯出檔是以一個指標儲存層級的——每一列指名自己的主管,而沒有一列指名自己的下屬——所以把它轉成一張圖,就是一次由識別碼到列號的查找,加上一次方向的反轉。

簡而言之

  • employee_id 與 manager_id 是識別碼;「連線至」取的是以 1 起計的列號。轉換就是一次查找。
  • manager_id 沿樹往上指,「連線至」沿流程往下指——把它掉轉,否則每一條箭嘴都反了方向。
  • 一個沒有相符 employee_id 的 manager_id,代表這份匯出檔被篩選過,不代表那個人沒有上司。
  • 兩列互相指名對方就是一個循環:往上走永遠不會終止。在檔案裡找它,不要在畫布上找。
  • 匯報線上的深度對應「橫向泳道」欄,所以每一級權限都有自己的一條泳道。

一個 manager_id 欄實際給了你甚麼

一份 HRIS 匯出檔是一個純文字檔,一個人一列:employee_id、manager_id、一個姓名、一個職銜、一個成本中心,通常還有一兩個欄描述那個人獲准批准甚麼。層級確實在裡面,但它是以一個指標儲存的。每一列指名自己的主管,而沒有一列指名自己的下屬——這是在一張表裡保存一棵樹的正確做法,也正是這個檔案不會靠貼上就變成一張圖的原因。

人們講「由 CSV 做組織圖」時,其實指的是兩張不同的圖。一張是那棵樹:一個人一個方框,主管在下屬上面,用來回答誰向誰匯報。QueryChart 有一個專門的組織圖編輯器處理這個形狀,而那是更適合它的工具。另一張是把匯報線當成一條路線——一份申請由提出的人一路往上爬到有權簽署的人所走的路徑——而那是一張流程圖,也正是這一頁要講的。

轉換是在匯出檔上做兩個操作。第一個是查找:「連線至」欄取的是以 1 起計的列號而不是識別碼,所以一個坐在儲存格裡的 E1042 甚麼都連不到。第二個是反轉:manager_id 沿樹往上指,由子指向父,而「連線至」沿流程往下指,由一列指向它所通往的那幾列。把檔案整理成經得起貼上的樣子,在 /yue/guides/流程圖csv檔案結構 有交代,而同一批資料的純父子版本在 /yue/templates/csv父子層級。

下面的示例是一條由這種匯出檔建成的審批鏈。它帶著令真實 HRIS 資料棘手的三樣東西:一列沒有主管、一道防止申請人坐在自己審批鏈之內的守衛,以及一位放假中而在自己那一列指名了代理人的審批人。打開下面的試算表面板,挨著畫布讀「連線至」欄。

一條當成路線而不是樹的匯報線

由一份 HRIS 匯出檔建成的審批鏈的四個完成度階段。打開試算表面板,看看填好了哪些欄。

  1. 讀那一列,檢查有沒有主管

    頭幾列除了讀這個檔案以外甚麼都不做:「針對一個成本中心提出申請」,然後「由 HRIS 匯出檔讀取申請人那一列」,然後菱形「這一列有沒有指名一位主管?」。它的否路線去到「請人力資源團隊更正匯報線」,因為一個空白的 manager_id 是一個資料問題,然後才是一個路由問題。這個階段只填好了「形狀」欄,所以那些列仍然是一份清單。

  2. 沿 manager_id 往上走這個檔案

    「沿 manager_id 往上走,建出審批鏈」是真正做事的那一列,而它後面那三個菱形,就是那次往上走所需要的檢查。「申請人是否身處自己的審批鏈之內?」抓那個循環,「獲指名的審批人是否在崗?」把申請轉去一位代理人,而「是否在直屬主管的審批權限之內?」決定一個簽名是否就此了結。「連線至」現在放著列號,所以那些箭嘴存在了,但還沒有任何東西說明哪個出口是哪一個。

  3. 為升級分支加上標籤

    「連線文字」按位置與「連線至」配對,所以 在權限之內,超出權限 會把第一個數字送去一個簽名,把第二個送去「升級至部門主管」。同一對在部門主管那裡重複一次,在總監那裡再重複一次,而那正是你的審批權限欄本來就編碼了的那條升級階梯。第 18 列以「呈交執行委員會還是撤回申請?」把它收結。

  4. 加上兩個泳道欄

    「橫向泳道」欄承載匯報線上的層級——員工、直屬主管、部門主管、總監、執行委員會——所以組織樹上的深度變成畫布上的距離。「縱向泳道」欄承載職能:提出申請的部門、財務、人力資源團隊、行政辦公室。兩個都填好之後,你就讀得出人力資源團隊只在匯出檔出錯時才出現,而財務只在這筆開支坐在另一條線的成本中心時才出現。

運作方式

  1. 匯出路由所依賴的那幾個欄

    你需要 employee_id、manager_id,以及每個人一個讀得出的姓名。加上職銜、成本中心、審批權限與任何代理人欄,因為那些才是決定一份申請爬到哪裡停下來的東西。凡是這張圖永遠不會顯示的都不要——薪酬、地址、入職日期——因為一個窄一些的檔案用肉眼檢查容易得多,而一個不獲認得的欄無論如何都會在貼上時被帶過並忽略。

  2. 在試算表之前先把檔案當文字讀一次

    先用文字編輯器打開這份匯出檔。檢查分隔符是逗號而不是分號、含有逗號的姓名有用雙引號包起、檔案是 UTF-8 好讓帶重音的姓名活下來,以及第一個標題真的是 employee_id 而不是一個位元組順序標記後面跟著 employee_id。這幾項每一項都會安靜地失敗:欄是按標題名稱比對的,所以一個不完全等於你所以為那樣的標題,甚麼都比對不上。

  3. 決定你在建的是那兩張圖裡的哪一張

    一個人一個方框、按誰向誰匯報排列的是一棵樹,屬於組織圖編輯器。一份申請穿過匯報線所走的路徑是一張流程圖,屬於這裡:一個步驟一列而不是一個人一列,由匯出檔提供那些層級、權限與代理人。在你開始為列編號之前先決定這件事,因為那兩個形狀互相轉換不了。

  4. 把 manager_id 反轉成列號

    先把那些列排成你想要編號的次序,因為「連線至」引用的是位置,事後重新編號會把一切重新接線。然後,對每一個人,把所有 manager_id 等於這個人 employee_id 的那些列的列號收集起來,以逗號分隔放進這個人的「連線至」。下屬變成向外的箭嘴;manager_id 只是那個查找鍵,永遠不會被貼進「連線至」本身。

  5. 在檔案裡解決孤兒列與循環

    按 manager_id 排序,確認每一個值都在同一個檔案裡的某處作為一個 employee_id 出現過。做不到的就是孤兒,通常是因為這份匯出檔的範圍限定在一個部門、或者只限在職員工。然後把每一條鏈往上走一次,一旦重訪到同一列就停下來:一對互相指名對方的列就是一個循環,它要麼是一個無人結案的署任安排,要麼是兩列在同一日被不同的人編輯過。

  6. 把它貼進去,然後加形狀與泳道

    把 .csv 拖到一張新圖表的試算表區域,或者把 CSV 文字貼進去。把提出問題那些列的「形狀」設為 Decision,把終止符設為 Start、Success 與 Reject,把答案按與「連線至」數字相同的次序放進「連線文字」,再把權限層級放進「橫向泳道」欄,令匯報線的每一級都有自己的一條泳道。

應避免的錯誤

  • manager_id 往上指,「連線至」往下指

    主管那個欄指名的是一個父;「連線至」欄指名的是後繼者。把其中一個原封搬進另一個,每一條箭嘴都會由一個人指向他的上司。徵兆在組織的最頂:它最後會四面八方都有箭嘴指進去,而一條都沒有出來。

  • 一個 employee_id 不是一個列號

    「連線至」讀的是這張表上的位置——編輯器左邊那些數字——所以一個放著 E1042 或者 00147 的儲存格甚麼都連不到,也不會報錯。在匯出檔裡先做這次接合,把識別碼換成位置,然後才貼上。/yue/guides/在csv裡定義連接 詳細講解了這個欄。

  • 匯出檔裡沒有的主管

    一個沒有相符 employee_id 列的 manager_id 是一個孤兒,而它幾乎從來不代表那個人沒有主管。限定部門範圍的匯出、只限在職的篩選,以及一個從未記錄過接手人的離職者,都會產生它。整個組織最頂那一個空白,是唯一一個合理的情況。

  • 試算表悄悄改寫了那些識別碼

    帶前置零的員工編號是最經典的犧牲品:用試算表打開這個 CSV,00147 就變成 147,於是一半的 manager_id 接合不再相符,而你得到一片一人一棵的樹林。請由原始文字著手,或者把 ID 那幾個欄以文字方式匯入,並把你接合結果的列數與檔案的列數比對一次。

打開這個匯報線示例

把示例作為你自己的圖表打開,看看那些欄是怎樣填的,然後在 employee_id 與 manager_id 解析成列號之後,把你自己的匯出檔貼上去覆蓋那些列。

打開這個匯報線示例

相關指南

常見問題

QueryChart 可以直接匯入一個組織圖 CSV 嗎?

你可以把 .csv 拖到試算表區域、或者把 CSV 文字貼進去,把那些列弄進來,而欄是按標題名稱而不是按位置比對的,所以它們坐在甚麼次序都無關緊要,任何不獲認得的東西都會被帶過並忽略。它不會做的,是替你推斷出一個層級:沒有匯入精靈、沒有欄位對應畫面,也沒有連到人力資源系統的連接器。這個檔案必須已經在「連線至」欄裡說明了每一列所連往那幾個列號。

我應該用流程圖編輯器還是組織圖編輯器?

如果產出是一棵人手編制樹——一個人一個方框、主管在下屬上面、用來回答誰向誰匯報——就用專門的組織圖編輯器,它是為那個形狀而建的,並為每個人維持單一一位上級。當匯報線是一條路線而不是一幅圖時,就用流程圖編輯器:一份一路往上爬到遇上權限足夠的人為止的審批、一條升級路徑、一份必須繞道經過財務的申請。那些裡面有判斷與例外,而一個判斷不是一棵樹畫得出來的東西。

如果兩個人互相向對方匯報會怎樣?

圖會照畫——一對互相指著對方的箭嘴——但任何要走到最頂的程序都不會終止,這正是為甚麼你要在檔案裡而不是在貼上之後檢查循環。實務上一個循環是一個無人結案的署任安排,或者兩列在同一日被不同的人編輯過。示例圖以判斷「申請人是否身處自己的審批鏈之內?」防範同一個問題在路由上的版本,它會跳過一級,而不是繞圈。

我的匯出檔是分號分隔的,而有些姓名含有逗號。

兩者對 HRIS 匯出檔都很正常,而且都在檔案裡修得到。一份分號分隔的匯出檔——系統設定為歐洲地區時常見——應該重新匯出或者轉成逗號;照現狀貼上的話,整行標題會落進單獨一個欄,那至少是明顯地失敗而不是隱晦地失敗。一個含有逗號的值只要用雙引號包起就是合法的,所以「Nakamura, Yuki」保持一個欄位,而同樣的文字不加引號就變成兩個。

HRIS 有變動時,怎樣令這張圖保持最新?

靠重新匯出再貼上一次,而不是把兩者連起來——QueryChart 與人力資源系統之間沒有即時連結。這件事沒有聽起來那麼要緊,因為你畫的是那條路由規則而不是那份名冊:「當金額超出直屬主管的權限時升級至部門主管」,經得起一次令檔案裡每一個名字都改變的重組。層級或者權限有變時重做一次匯出,只有人變時就別去碰它。

本指南所用的範本

CSV 組織圖範本(按匯報線劃分的審批權限) — 把 HRIS 的 CSV 匯出檔變成一張誰可以簽甚麼的流程圖。manager_id 欄變成一道升級階梯,三個權限金額坐在判斷上,而自我批准、代理與跨部門分攤各有一條路線。

Browse all 組織圖同公司結構指南

按匯報線劃分的審批權限(源自 HRIS 的 CSV 匯出檔): 員工 → 直屬主管 → 部門主管 → 總監 → 執行委員會
如何由 CSV 建立組織圖