商業視角說明

Go-Live:Google Sheet ➔ Jira 工單自動化管線

在醫療系統上線的高壓環境中,將零散表單回報自動收斂為標準化 Jira 工單,並同步完成雙向狀態回寫與 Teams 即時派工廣播。

上線現場痛點

系統上線初期問題量暴增,維運人員手動將 Google Sheet 回報逐筆複製至 Jira,平均每張耗時 3~5 分鐘。格式紊亂與優先級不明確導致 RD 需反覆向現場確認,造成重大溝通延遲。

自動化解法

以 n8n 設計排程工作流,定時篩選待處理列,經由 Code Node 自動解析嚴重度並轉換為 Jira Wiki Markup。建立工單後立即回寫 Key 與連結,並以 Teams Adaptive Card 廣播新工單。

五階段自動化管線架構

工作流每 15 分鐘自動執行一次,具備防重複開票過濾條件、雙向狀態回寫與獨立 Telegram 錯誤通知分支:

Go-Live Jira 工單自動化工作流架構圖
5 階段管線:定時防重過濾 ➔ 優先級與 Wiki Markup 映射 ➔ Jira REST API 自動開票 ➔ 雙向狀態回寫 ➔ Teams Adaptive Card 推播與 Telegram 失敗告警。

專案背景:上線期的維運混亂

系統上線 (Go-Live) 初期,是資訊團隊壓力最大的時刻。問題回報會從四面八方湧入:電話、LINE 群組、急診與門診現場口頭攔截。為了即時記錄,現場人員習慣先將問題登記在共用的 Google Sheet,再由工程師手動建單。

純人工處理在面對大量回報時暴露了嚴重瓶頸:

  • 重複搬運工時: 開單需複製貼上 8~10 個欄位並對應優先級,單張耗時 3~5 分鐘,單日累計耗費數小時行政工時。
  • 工單品質參差不齊: 不同回報者描述方式不一,常遺漏診間編號或病歷號等核心上下文,RD 需反覆來回溝通才能重現問題。
  • 資訊同步延遲: 手動建單後未能即時回寫狀態,導致現場人員不知道問題是否已被受理,甚至重複回報同一問題。

為了徹底解決維運斷層,我以 n8n 設計了這套自動化處理管線,並與先前的 LineBot 回報系統串接,形成從現場手機回報、Sheet 集中匯整到 Jira 自動開單的完整傳輸鏈。


核心架構:防重複開票與雙向同步機制

工作流依照「監控、過濾、映射、開票、回寫、廣播」六個明確步驟執行:

  1. 定時觸發 (Schedule Trigger): 工作流每 15 分鐘自動啟動一次,輪詢 Google Sheet 是否有新增回報。
  2. 防重開票條件鎖 (Google Sheets Node): 僅抓取 Jira Link 為空 且 可Jira='Y' 的資料列。未經現場幹部確認或已完成開票的資料列不會被重複處理。
  3. 格式化與優先級映射 (Code Node): 讀取原始欄位並組裝為帶有彩色 Panel 區塊的 Jira Wiki Markup 描述,同時將「嚴重度等級」映射為 Jira Priority ID(P1 ➔ 1、P2 ➔ 2、P3 ➔ 3、P4 ➔ 4)。
  4. 自動建立工單 (Jira Node): 調用 Jira REST API 建立標準 Bug Ticket,帶入 Assignee、Reporter、Component 與 Labels 標籤。
  5. 雙向狀態回寫 (Writeback Node): 工單建立成功後,將 Jira Key 連結回寫至 Sheet 的 Jira Link 欄位,並將 可Jira 更新為 "Done",消除資訊孤島。
  6. Teams Adaptive Card 廣播 (Power Automate Webhook): 將工單編號、嚴重度與摘要組裝成 Adaptive Card,即時推送到團隊 Teams 頻道。
  7. 獨立異常告警 (Telegram Node): 關鍵節點配置 Continue (using error output),當 API 逾時或認證失效時,立即發送 Telegram 警報通知維運人員。

實體介面與成果展示

點擊下方標籤檢視工作流實體節點與各階段產出:

n8n 工作流實體畫布

包含定時觸發、Google Sheets 篩選、Code Node 格式化、Jira 建立、狀態回寫與雙重推播分支。

n8n 工作流實體畫布
輸入端:Google Sheet 集中表單

維運團隊確認問題後,於「可Jira」欄位填上 "Y",腳本自動處理並回寫產出的 Jira Link 與 Done 狀態。

Google Sheet 輸入
產出端:標準化 Jira Wiki Markup 工單

確保每張 Ticket 具備彩色資訊 Panel、嚴重度映射、病歷號與診間標註,省去 RD 反覆向第一線確認的溝通成本。

Jira 產出
推播端:Microsoft Teams Adaptive Card

工單建立完成後即刻將關鍵資訊推播至團隊頻道,確保所有工程師即時掌握新問題。

Teams 通知

實作步驟與節點配置細節

以下說明關鍵節點之配置條件與核心 JavaScript 格式化邏輯:

將 Trigger Interval 設定為每 15 分鐘 (Minutes) 觸發一次,避免頻繁輪詢造成 API 速率限制,同時確保緊急問題在 15 分鐘內進入 Jira 追蹤。

在 Filters 區塊設定三道防禦條件:

  • Filter 1: Jira Link | Condition: Is Empty(尚未建立工單)
  • Filter 2: 可Jira | Condition: Equals 'Y'(現場幹部已核准)
  • Filter 3: 問題描述 | Condition: Not Empty(排除空行)

節點 On Error 設為 "Continue (using error output)",連接 Telegram 錯誤通知分支。

核心 JavaScript 代碼負責組裝帶有彩色 Panel 的 Jira 描述,並將「嚴重度等級」映射為數值 Priority ID:


const itemJson = $input.item.json;

// 優先級映射表 (Severity -> Jira Priority ID)
const priorityMap = {
  'P1': '1', // Highest
  'P2': '2', // High
  'P3': '3', // Medium
  'P4': '4', // Low
  '_': '3'   // Default: Medium
};

function createListItem(emoji, label, value, defaultValue = 'N/A') {
  let displayValue = value;
  if (typeof value === 'boolean') displayValue = value ? '是' : '否';
  return `* ${emoji} *${label}:* ${displayValue || defaultValue}`;
}

// Panel 1: 問題回報資訊 (藍色面板)
const reportInfoPanel = [
  '{panel:title=問題回報資訊|bgColor=#DEEBFF|borderColor=#B3D4FF}',
  createListItem('💻', '系統別/地點', itemJson['系統別/地點']),  
  createListItem('📝', '問題簡述', itemJson['問題簡述']),
  createListItem('👤', '回報者姓名', itemJson['提出者']),  
  createListItem('🚨', '緊急', itemJson['緊急']),  
  createListItem('👨‍⚕️', '職務', itemJson['職務']),
  createListItem('📞', '聯絡方式', itemJson['聯絡方式']),
  createListItem('🗂️', '病歷號/住院號', itemJson['病歷號/住院號']),
  createListItem('📍', '診間或病房編號', itemJson['診間或病房編號']),
  '{panel}'
].join('\n');

// Panel 2: 內部處理狀態 (黃色面板)
const internalStatusPanel = [
  '{panel:title=內部處理狀態|bgColor=#FEF0B5|borderColor=#FFC400}',
  createListItem('🚦', '嚴重度等級', itemJson['嚴重度等級'], '未分類'),
  createListItem('🧑‍💻', 'Owner', itemJson['Owner(RD)'], '未指派'),
  createListItem('⏳', '處理狀態', itemJson['處理狀態'], '待處理'),
  createListItem('🛠️', '處理方式', itemJson['處理方式'], '分析中'),
  '{panel}'
].join('\n');

itemJson.jiraDescriptionString = `${reportInfoPanel}\n\n${internalStatusPanel}`;
itemJson.priorityId = priorityMap[itemJson['嚴重度等級']] || priorityMap['_'];

return itemJson;
                                        

Jira 工單建立成功後,依據 row_number 主鍵將 https://YOUR_DOMAIN/browse/{{ key }} 回寫至 Sheet,並將狀態標記為 Done。最後透過 Power Automate Webhook 發送 Teams Adaptive Card,完成整條自動化路徑。

實質成效與工程收益

  • 消除重複人工作業 單張工單處理時間從 3~5 分鐘降至 0 秒,單日節省數小時複製貼上時間。
  • 統一工單格式標準 結構化 Wiki Markup 消除資訊缺漏,RD 無需反覆向第一線確認上下文。
  • 主動式即時廣播 Teams Adaptive Card 即時推播,緊急問題能在 15 分鐘內傳達至相關責任工程師。

歡迎交流與討論

如果您對 n8n 工作流設計、Jira 自動化或醫療系統 Go-Live 流程有任何想法,歡迎至 LinkedIn 交流。

前往 LinkedIn 討論