跳轉至

公式計算欄位案例庫

本指南旨在幫助你將案例庫中的公式快速應用到自己的Meegle空間,並解決常見的公式編寫問題。 當你從本文件複製一個公式模板後,需要將公式內的資訊(如 {關聯關係欄位}{節點名})替換為你空間中實際的欄位名和值。

快速導航

  1. 基礎計算
  2. 關聯工作項統計
  3. 人力與工作量
  4. 進度與週期

  5. 延期與異常監控

  6. 文字拼接與編碼
  7. 自定義自增編號
  8. 訊號流轉控制

  9. 任務工作項

  10. 節點流分析
  11. 狀態流分析
  12. 進度視覺化

1. 基礎計算

本章涵蓋最基本的數學運算,是構建複雜公式的基石。

場景:兩個數字欄位求和

  • 用途解釋:適用於任何需要將兩個數字欄位(如成本、金額、故事點)相加的場景。
  • 可複製公式
  • 通用模板
  • 常見變體
  • 算術運算:支援加(+)、減(-)、乘()、除(/)等基本運算。
  • 注意事項
  • 欄位型別:確保參與運算的欄位均為“數字”型別,否則將導致公式錯誤。
  • 空值處理:如果任一欄位為空(null),計算結果也為空。可以配合 IF 函式處理空值,如 IF(EMPTY({成本一}), 0, {成本一})

場景:彙總所有流程節點的估分

  • 用途解釋:專案經理或團隊負責人需要快速瞭解一個工作項(如需求、史詩)所有流程節點的總估分,以評估整體工作量。
  • 可複製公式
  • 通用模板
  • 常見變體
  • 彙總關聯工作項的估分
  • 注意事項
  • {流程節點} 是一個系統內建的列表,包含了該工作項的所有流程節點資訊。
  • {節點估分} 必須是“數字”型別欄位。SUM 函式會自動忽略列表中的空值。

2. 關聯工作項統計

本章重點介紹如何統計與篩選關聯的工作項,例如統計一個 Epic 下有多少 P0 缺陷,或判斷關聯的需求是否都已完成。

場景:統計關聯工作項總數

  • 用途解釋:用於快速瞭解一個工作項關聯了多少其他工作項,例如一個需求關聯了多少缺陷。
  • 可複製公式
  • 通用模板
  • 常見變體
  • 判斷關聯是否為空
  • 注意事項
  • COUNT 函式直接作用於關聯關係欄位,返回關聯項的數量。
  • EMPTY 函式用於判斷欄位是否為空,對關聯欄位使用時,即判斷是否存在關聯項。

場景:統計滿足特定條件的關聯工作項數量

  • 用途解釋:專案經理或測試負責人需要統計關聯項中滿足特定條件的個數,如“P0 級別的缺陷數”或“未完成的需求下 P0 缺陷數”。
  • 可複製公式
  • 通用模板
  • 常見變體
  • COUNTIF vs. COUNT(FILTER(...))
    • COUNTIF({列表}, {條件}):語法更簡潔,適用於單層簡單條件的計數。
    • COUNT(FILTER({列表}, {條件})):功能更強大,FILTER 的結果可以被再次 FILTER 或用於其他函式,靈活性更高。
  • 注意事項
  • $related {}$related{關聯關係欄位}{關聯關係欄位} 寫法等價,都用於引用關聯欄位。
  • each 上下文:在 FILTERCOUNTIF 的條件中,each 代表正在被遍歷的每一個關聯項。
  • $option{}:用於引用選項欄位的值,如 $option{P0}$option{高},比直接寫文字 "P0" 更規範,能避免因選項名變更導致的公式失效。

場景:跨級展示關聯工作項的欄位

  • 用途解釋:當需要在一個工作項上展示其“關聯項的關聯項”的欄位時使用。例如,在“缺陷”上展示其關聯的“需求”所屬的“專案”的優先順序。
  • 可複製公式
  • 通用模板
  • 常見變體
  • 拼接所有跨級欄位:如果一級關聯了多個,而每個一級又關聯了多個二級,想把所有二級的某個欄位拼接起來。
  • 注意事項
  • 點“.”運算子{一級關聯欄位}.{二級關聯欄位} 這種鏈式呼叫,會返回一個包含所有二級關聯物件的列表。
  • FIND 函式FIND({列表}, {條件}) 在這裡的作用是從列表中找到一個元素(此處 true 表示找到任意一個即可)。它只返回第一個匹配項。如果一個缺陷關聯了多個需求,該公式只會展示第一個需求的所屬專案的優先順序。

3. 人力與工作量

本章聚焦於如何統計和計算與人力、工作量相關的估分,是資源規劃和專案成本核算的基礎。

場景:彙總特定角色的節點估分

  • 用途解釋:專案經理或研發 Leader 需要統計特定角色(如研發、測試)在所有流程節點上的估分總和,以評估不同角色的工作量投入。
  • 可複製公式
  • 通用模板
  • 常見變體
  • 統計多個特定節點的估分總和
  • 統計進行中節點的估分
  • 注意事項
  • MATCH vs. ==MATCH(each.{名稱}, "開發") 會匹配所有名稱中包含 "開發" 的節點(如“前端開發”、“後端開發”),而 each.{名稱} == "開發" 只會精確匹配。
  • && ||&& 代表“與”(AND),|| 代表“或”(OR),用於組合多個篩選條件。

場景:在缺陷頁檢視關聯需求的研發估分

  • 用途解釋:測試或研發人員在處理一個缺陷時,需要快速瞭解該缺陷所關聯的需求的研發總工作量,以評估缺陷影響和修復優先順序。
  • 可複製公式
  • 通用模板
  • 注意事項
  • 這是一個跨工作項的計算。{缺陷關聯需求} 是一級關聯,.{流程節點} 是二級的節點列表。公式引擎能夠正確處理這種鏈式呼叫。
  • 如果一個缺陷關聯了多個需求,該公式會彙總所有關聯需求的研發節點估分之和。

場景:根據工作量進行規模判斷

  • 用途解釋:產品或專案經理希望根據總估分自動為需求打上“大需求”或“小需求”的標籤,便於篩選和管理。
  • 可複製公式
  • 通用模板
  • 注意事項
  • IF({條件}, {條件為真時的值}, {條件為假時的值}) 是最基礎的條件判斷函式。
  • 可以巢狀 IF 來實現更復雜的多級判斷(如“大”、“中”、“小”)。

4. 進度與週期

本章介紹如何計算工作項的進度、週期和耗時,是衡量專案效率和交付能力的關鍵指標。

場景:計算節點完成進度

  • 用途解釋:專案經理需要一個宏觀的百分比來展示工作項的整體完成進度。
  • 可複製公式
  • 通用模板
  • 資料顯示配置
  • 精度:保留 4 位小數
  • 縮放:百分比
  • 符號:%
  • 效果:系統將自動將 0.7525 轉換為 75.25%

場景:計算兩個節點間的工作日差

  • 用途解釋:精確計算從一個節點開始到另一個節點開始所經過的工作日(排除週末),用於分析階段耗時。
  • 可複製公式
  • 通用模板
  • 常見變體
  • 計算自然日差:使用 DAYSBETWEEN 函式。
  • 注意事項
  • FIND 函式FIND({列表}, {條件}) 返回列表中第一個滿足條件的元素。請確保你的流程中“開始”和“技術評審”節點是唯一存在的。
  • 日期欄位選擇{節點首次開始時間}{節點末次開始時間}{節點首次結束時間}{節點末次結束時間},請根據你的業務場景精確選擇。
  • WORKDAYSBETWEEN 會排除週六和週日,但預設不考慮法定節假日,除非系統管理員進行了配置。

場景:計算已完成缺陷的總耗時

  • 用途解釋:質量團隊需要統計已關閉缺陷從提出到關閉所花費的總天數,作為衡量修復效率的指標。
  • 可複製公式
  • 通用模板
  • 注意事項
  • {所有狀態} 是一個系統內建列表,記錄了工作項的所有狀態流轉歷史。
  • {狀態開始結束時間} 指的是該狀態最後一次到達的時間。對於終態(如 "Closed"),它就是關閉時間。
  • 為保證公式正確,最好先用 COUNT(FILTER(...)) 判斷是否存在 "Closed" 狀態,避免 FIND 返回空值。

場景:獲取關鍵節點的開始時間

  • 用途解釋:在複雜的流程中,需要根據不同條件來確定某個關鍵階段(如“研發階段”)的正式開始時間。
  • 可複製公式
  • 通用模板
  • 注意事項
  • MIN 函式:當 FILTER 返回多個節點時(例如有多個“開發”節點),MIN 會取其中最早的日期。
  • 邏輯的優先順序非常重要,需要仔細梳理業務規則,並將其轉化為 IF 的巢狀或組合邏輯。

5. 延期與異常監控

本章案例用於主動發現流程中的延期和異常情況,幫助團隊及時識別風險並作出響應。

場景:統計延期完成的節點個數

  • 用途解釋:專案經理需要量化專案中延期節點的數量,以評估專案健康度。
  • 可複製公式
  • 通用模板
  • 注意事項
  • 延期定義:此處的延期被定義為:節點已完成,且有排期,且實際結束時間晚於計劃結束時間。
  • {節點排期}.{週期時長} != 0 用於排除那些沒有設定排期的節點,避免誤判。
  • DAYSBETWEEN(A, B) > 0 表示日期 B 晚於日期 A。

場景:標記核心節點是否延期(風險預警)

  • 用途解釋:對於專案中的關鍵節點(如“產品評審”),需要一個明確的標識來預警其延期風險,無論它是否已完成。
  • 可複製公式
  • 通用模板
  • 注意事項
  • 雙路判斷:該公式透過 ||(或)將邏輯分為兩部分:
    1. 對於已完成的節點:判斷“實際結束時間”是否晚於“預計結束日期”。
    2. 對於未完成的節點:判斷“預計結束日期”是否已經早於“今天”,如果是,則意味著已經處於延期風險中。
  • 這種組合判斷確保了風險能夠被實時監控,而非事後統計。

場景:輸出延期節點的名稱清單

  • 用途解釋:在一個文字欄位中,清晰地列出所有已經延期完成的節點名稱,便於專案覆盤和問題定位。
  • 可複製公式
  • 通用模板
  • 注意事項
  • FILTER({列表}, {條件}).{欄位}:此語法先對列表進行篩選,然後提取篩選後結果中每個元素的指定欄位,最終形成一個新的列表。
  • JOIN({文字列表}, "{分隔符}"):將文字列表用指定的分隔符拼接成一個字串。

場景 :判斷進行中專案是否延期

  • 用途解釋:為專案管理者提供一個自動預警機制。當一個滿足特定條件(如產品線、專案型別)的專案,從啟動至今的持續時間超過了設定的閾值(如60天),且尚未結項時,自動標記為“超期”。
  • 原始示例
  • 通用模板
  • 注意事項
  • empty({欄位}) == true 用於判斷日期欄位是否為空,這是確保只對“進行中”的專案進行判斷的關鍵。
  • empty({開始日期欄位}) == false 確保專案已經開始,避免對還未啟動的專案進行誤判。
  • && (與) 運算子用於連線多個判斷條件,確保所有條件都滿足時,才執行超期判斷。

6. 文字拼接與編碼

本章介紹如何使用公式進行文字的拼接和動態編碼,常用於生成唯一的、資訊豐富的識別符號。

場景:拼接優先順序和需求名稱

  • 用途解釋:運營或專案助理需要將工作項的兩個欄位(如優先順序和名稱)拼接在一起,形成一個更具資訊量的標題,方便快速識別。
  • 可複製公式
  • 通用模板
  • 注意事項
  • JOIN 函式的第一個引數是一個列表 [...],可以包含多個欄位或固定文字。
  • 時間欄位限制:直接在 JOIN 中拼接日期或時間欄位會報錯。必須先用 STRING() 函式將其轉換為文字。

場景:根據條件動態生成編碼

  • 用途解釋:系統管理員或專案管理員需要根據工作項的屬性(如業務線)自動生成不同字首的唯一編碼。
  • 可複製公式
  • 通用模板
  • 注意事項
  • {工作項ID} 是一個數字型別的系統欄位,在拼接前需要使用 STRING() 轉換為文字。
  • 巢狀的 IF 語句可以實現多條件的編碼規則。

場景:關鍵詞匹配

  • 用途解釋:用於識別單選或多選欄位中是否包含特定選項。透過將選項內容轉換為文字字串,實現跨欄位的內容檢索與對映。
  • 可複製公式
  • 通用模板
  • 配置說明
  • 資料轉換:由於多選欄位通常以陣列格式儲存,使用 JOIN 函式可將其合併為一段連續的文字。
  • 匹配邏輯MATCH 會在合併後的文字中檢索“匹配文字”,並根據系統邏輯返回匹配結果(如索引值或布林值)。

場景 :根據角色是否包含特定成員打標籤

  • 用途解釋:面向需要根據團隊成員歸屬來自動分類任務的場景。例如,如果任務的“運營受理人”是華東區的幾位同事之一,就自動給任務打上“東區”標籤。
  • 原始示例(已校對)校對說明:countlf 修正為 countIf@xx 是成員物件的佔位符。

  • 通用模板

  • 常見變體
  • 多區域、多團隊判斷:透過巢狀 if 可以實現更復雜的分割槽邏輯。
  • 注意事項
  • {參與人員}.{流程角色} 返回一個包含所有角色物件的列表。
  • each 在這裡指代每一個“流程角色”物件,它有 {名稱}{角色人員} 兩個屬性。
  • {角色人員} 本身又是一個成員列表,所以需要用 containsAny 來判斷是否包含某些特定的人。
  • [@成員A, @成員B] 是一種表示法,在實際配置時,你需要從成員選擇器中新增對應的成員。

7. 自定義自增編號

Meegle支援建立自增數字欄位,結合公式可以實現強大的自定義編號規則,滿足不同業務場景下的唯一標識需求。

場景:純數字編號(補零對齊)

  • 用途解釋:適用於需要簡潔、統一長度的數字編號場景,如將 236512345 格式化為 0002036512345
  • 可複製公式
  • 通用模板
  • 注意事項
  • FORMAT 函式中的格式字串(如 "0000")決定了最小的輸出長度。如果數字本身位數不足,則在前面補零;如果超出,則按原樣顯示。

場景:複合型編號(拼接欄位)

  • 用途解釋:透過拼接常量、日期、欄位等內容,生成包含多元資訊的編號,便於快速識別工作項型別、建立時間等。
  • 可複製公式示例輸出:A202403001, B202403002

  • 通用模板

  • 注意事項
  • FORMAT({建立時間}, "YYYYMM") 可以將日期格式化為年月,如 202403
  • 各部分在拼接前可能需要用 IFFORMATSTRING 等函式進行預處理。

場景 :條件型編號(根據不同業務線)

  • 用途解釋:面向需要進行規範化管理的團隊,根據工作項的某個或多個欄位(如業務線、型別),自動生成唯一的、帶字首的ID或編碼,便於識別和檢索。
  • 原始示例(已校對)
  • 通用模板
  • 注意事項
  • {工作項id} 是一個數值型別,需要使用 string() 函式轉換為字串後才能參與 join
  • join 函式的第一個引數是一個列表,第二個引數是分隔符。

場景:條件型編號(新舊規則過渡)

  • 用途解釋:當企業的編號規則發生變更時,此場景可以實現平滑過渡:對已存在的舊記錄沿用老規則,對新增記錄應用新規則。
  • 可複製公式舊規則示例:202201-000005新規則示例:Base-202403-001234

  • 通用模板

  • 注意事項
  • 判斷條件通常基於 {自增數字}{建立時間}。例如,可以設定一個“規則切換日期”,在此日期之前建立的使用舊規則。
  • 這種方式可以有效保證歷史資料的美觀和一致性,同時讓新資料遵循新的規範。

8. 訊號流轉控制

本章介紹如何利用公式作為工作流“准入/準出條件”,實現精細化的流程自動化控制。公式結果需要為布林值(truefalse)。

場景:基於關聯缺陷狀態的準出條件

  • 用途解釋:用於在流程節點設定準出門禁。例如,需求工作項的“測試”節點,只有當其關聯的所有 P0 級別缺陷都已修復時,才允許流轉到下一節點。
  • 可複製公式
  • 通用模板
  • 注意事項
  • 結果必須是布林值:作為準入/準出條件的公式,其最終輸出必須是 true(允許流轉)或 false(禁止流轉)。
  • 邏輯要嚴謹:仔細定義“允許流轉”的條件。上述例子中,“允許流轉”的條件是“不存在未關閉的 P0 缺陷”,所以公式邏輯是計算這類缺陷的數量是否為 0。
  • $option 的使用:在比較狀態或選項欄位時,強烈建議使用 $option{狀態名/選項名} 的寫法,以增強公式的健壯性。

9. 任務工作項

本章介紹專屬於“任務”型別工作項的公式,用於獲取其父級節點的資訊。

場景:在任務中展示其所屬節點的資訊

  • 用途解釋:當你在檢視一個“任務”時,通常需要知道這個任務是屬於哪個流程節點的(例如,是屬於“需求評審”節點,還是“後端開發”節點)。
  • 可複製公式
  • 通用模板
  • 常見變體
  • 展示所屬節點的狀態
  • 展示所屬節點的負責人
  • 注意事項
  • 適用範圍{所屬節點資訊} 是“任務”型別工作項特有的系統欄位,在其他型別(如需求、缺陷)的工作項中使用會報錯。
  • 語法糖:在舊版公式中,你可能會看到 ${所屬節點資訊}.${名稱} 的寫法,這與 {所屬節點資訊}.{名稱} 是等價的。推薦使用後者,更為簡潔。
  • 透過點“.”運算子,你可以獲取所屬節點的幾乎所有欄位資訊,如名稱、狀態、負責人、排期等。

10. 節點流分析

節點流是Meegle定義工作項生命週期的核心。透過分析節點流,可以實現對流程狀態、進度和異常的精細化度量。

場景:判斷流程中是否存在某個/某些節點

  • 用途解釋:用於檢查工作項的流程模板是否包含了特定的一個或多個階段。例如,檢查一個“釋出流程”是否包含“安全審查”節點。
  • 可複製公式
  • 通用模板
  • 注意事項
  • {流程節點}.{名稱} 返回一個包含所有節點名稱的文字列表。
  • CONTAINS 判斷單個文字是否存在;CONTAINSANY 判斷任意一個是否存在。

場景:展示進行中節點的排期

  • 用途解釋:為專案管理者提供一個直觀的檢視,快速檢視當前正在進行的節點的預計開始和結束日期。
  • 可複製公式
  • 注意事項
  • FIND 函式FIND({列表}, {條件}) 返回第一個滿足條件的元素。此公式透過 COUNTIF(...) == 1 確保了只有一個進行中節點,避免了 FIND 的歧義。
  • 資料轉換:日期欄位需要經過 DATE()STRING() 兩次轉換,才能被 JOIN 正確拼接。

場景:計算節點回滾次數

  • 用途解釋:透過計算某個節點被進入的次數,可以判斷是否存在頻繁的打回和重複工作,用於度量流程的順暢度。
  • 可複製公式
  • 通用模板
  • 注意事項
  • {節點進入次數} 是一個內建的節點屬性,記錄了該節點從“未開始”變為“進行中”的次數。
  • “- 1” 的邏輯是假設每個節點至少會正常進入一次,任何超過一次的進入都視為一次“回滾”。

場景:計算特定節點的估分佔比

  • 用途解釋:分析專案中不同型別工作的投入比例,例如計算研發估分佔 QA 估分的百分比。
  • 可複製公式
  • 注意事項
  • 分母為零:在做除法前,必須用 IF 判斷分母是否為零,以避免公式報錯。
  • 精度與格式:使用 ROUND 控制小數位數,STRING 轉換為文字,JOIN 拼接百分號。

11. 狀態流分析

狀態流反映了工作項在不同生命週期狀態下的流轉情況。透過分析狀態流,可以度量處理效率、停留時長和流轉健康度。

場景:判斷工作項在某狀態停留是否超期

  • 用途解釋:自動識別在某個狀態(如“待處理”)停留時間過長的工作項,以便團隊及時介入,避免問題積壓。
  • 可複製公式
  • 通用模板
  • 常見變體
  • 返回提示文字
  • 注意事項
  • {所有狀態} 是一個包含工作項所有歷史狀態記錄的列表。
  • {狀態累計進行時間} 是內建屬性,單位為天,會累加同名狀態的停留時間。
  • {狀態名} 必須與系統配置的名稱完全一致。

場景:計算從狀態 A 到狀態 B 的處理時長

  • 用途解釋:精確衡量流程中兩個關鍵狀態之間的耗時,例如計算缺陷從“已受理”到“已解決”花費了多少天。
  • 可複製公式
  • 注意事項
  • {狀態首次開始時間} vs. {狀態末次開始時間}:根據業務需要精確選擇。計算首次響應時長用“首次”,計算完整處理週期用“末次”。
  • 健壯性:使用 FIND 前,務必用 COUNT(FILTER(...)) 判斷目標狀態是否存在,防止公式因找不到狀態而報錯。

場景:計算缺陷關閉耗時(未關閉則顯示持續天數)

  • 用途解釋:動態計算一個缺陷的處理週期。如果已關閉,顯示總耗時;如果未關閉,顯示從提出到今天的持續天數。
  • 可複製公式
  • 注意事項
  • TODAY() 函式返回當天的日期,使未關閉缺陷的耗時能夠動態更新。

場景:拼接關聯工作項的狀態

  • 用途解釋:在一個欄位中集中展示所有關聯工作項(如關聯的版本)的當前狀態,便於快速概覽。
  • 可複製公式
  • 通用模板
  • 注意事項
  • {當前狀態} 是一個選項欄位,JOIN 可以直接處理。

12. 進度視覺化

透過巧妙的公式,可以將數字化的進度(如百分比)轉化為直觀的圖形,如進度條。

場景:用字元繪製進度條

  • 用途解釋:在列表檢視中,用“●●●○○”這樣的字元進度條代替純數字“60%”,使專案或任務的完成度一目瞭然,極大提升資訊的可讀性。
  • 前置準備:首先,你需要一個計算進度的基礎公式,返回一個 0 到 1 之間的小數。

精簡版(5檔)

  • 可複製公式
  • 閾值說明
  • [0, 0.25): ●○○○○
  • [0.25, 0.5): ●●○○○
  • [0.5, 0.75): ●●●○○
  • [0.75, 1): ●●●●○
  • 1: ●●●●●

完整版(10檔)

  • 可複製公式
  • 注意事項
  • 閾值邊界IF 的判斷順序至關重要,必須從大到小進行判斷。>= 1 必須是第一個條件。
  • 字元替換:你可以將 替換為任何你喜歡的字元,例如 ✅ 和 ⬜,或者 🌕 和 🌑。
  • 與百分比拼接:可以將進度條與百分比文字拼接,提供更豐富的資訊。
  • 帶半滿狀態的10檔進度條
  • 字元 (全滿), (半滿), (空)
  • 邏輯:在每個10%的區間內再增加一個5%的判斷點。
  • 可複製公式 (展示部分邏輯): ${成本1}+${成本2} ${數字欄位A}+${數字欄位B} (${收入} - ${成本}) / ${成本} SUM(${流程節點}.${節點估分}) SUM(${流程節點}.${待求和的數字欄位}) SUM($related{關聯關係欄位}.${待求和的數字欄位}) COUNT($related{需求-關聯缺陷}) COUNT($related{關聯關係欄位}) // 寫法一:推薦,可讀性更好 EMPTY($related{關聯關係欄位}) // 寫法二:功能等價 COUNT($related{關聯關係欄位})== 0 // 統計關聯的 P0 缺陷數 COUNT(FILTER($related{需求-關聯缺陷}, each.${優先順序}== $option{P0})) // 統計未完成需求下的 P0 缺陷數 (假設“完成日期”為空則為未完成) COUNTIF(FILTER($related{需求-關聯缺陷}, EMPTY(${完成日期})), each.${優先順序}== $option{P0}) // 寫法一:COUNTIF,更簡潔 COUNTIF($related{關聯關係欄位}, ${篩選條件}) // 寫法二:COUNT + FILTER,更靈活,可多層巢狀 COUNT(FILTER($related{關聯關係欄位}, ${篩選條件})) FIND($related{缺陷-關聯需求}.$related{需求-所屬專案}, true).${優先順序} // FIND 只返回第一個滿足條件的結果 FIND($related{一級關聯欄位}.$related{二級關聯欄位}, true).${目標欄位} // 拼接所有關聯需求所屬專案(可能重名)的名稱 JOIN($related{缺陷-關聯需求}.$related{需求-所屬專案}.{名稱}, ", ") // 統計所有名稱中包含“開發”的節點的估分總和 SUM(FILTER(${流程節點}, MATCH(each.${名稱}, "開發")).${節點估分}) SUM(FILTER(${流程節點}, {節點篩選條件}).${節點估分}) // 寫法一:逐個相加 SUM(FILTER(${流程節點}, each.${名稱} == "埋點設計").${節點估分}) + SUM(FILTER(${流程節點}, each.${名稱} == "AB方案設計").${節點估分}) // 寫法二:使用 OR (||) 運算子,更推薦 SUM(FILTER(${流程節點}, each.${名稱} == "埋點設計" || each.${名稱} == "AB方案設計").${節點估分}) // 寫法三:使用 CONTAINSANY,最靈活 SUM(FILTER(${流程節點}, CONTAINSANY([each.${名稱}], ["埋點設計", "AB方案設計"])).${節點估分}) // 統計所有“進行中”狀態的節點估分 SUM(FILTER(${流程節點}, each.${節點狀態} == $option{進行中}).${節點估分}) // 統計名稱匹配“開發”且狀態為“進行中”的節點估分 SUM(FILTER(${流程節點}, MATCH(each.${名稱}, "開發") && each.${節點狀態} == $option{進行中}).${節點估分}) SUM(FILTER($related{缺陷關聯需求}.${流程節點}, MATCH(each.${名稱}, "開發")).${節點估分}) SUM(FILTER($related{一級關聯欄位}.${二級關聯欄位_流程節點}, {節點篩選條件}).${節點估分}) IF(SUM(FILTER(${流程節點}, MATCH(each.${名稱}, "開發")).${節點估分}) > 50, "大需求", "小需求") IF(${總估分計算公式} > ${規模閾值}, "大規模標籤", "小規模標籤") COUNTIF(${流程節點}, each.${節點狀態} == $option{已完成}) / COUNT(${流程節點}) // 返回純數字(如 0.75) COUNTIF(${流程節點}, each.${節點狀態} == $option{已完成}) / COUNT(${流程節點}) WORKDAYSBETWEEN( FIND(${流程節點}, each.${名稱} == "開始").${節點末次開始時間}, FIND(${流程節點}, each.${名稱} == "技術評審").${節點末次開始時間} ) WORKDAYSBETWEEN(${開始日期欄位}, ${結束日期欄位}) DAYSBETWEEN( FIND(${流程節點}, each.${名稱} == "開始").${節點首次開始時間}, FIND(${流程節點}, each.${名稱} == "技術評審").${節點首次開始時間} ) DAYSBETWEEN( ${提出時間}, FIND(${所有狀態}, each.${狀態名稱} == "處理中").${狀態末次開始時間} ) DAYSBETWEEN(${開始日期}, FIND(${所有狀態}, each.${狀態名稱} == "{結束狀態}").${狀態日期欄位}) // 如果流程中存在“技術評審”節點,則取該節點最後一次結束的時間作為研發開始時間;否則,取名稱匹配“開發”的節點中最早的開始時間。 IF( CONTAINS(${流程節點}.${名稱}, "技術評審"), MIN(FILTER(${流程節點}, each.${名稱} == "技術評審").${節點末次結束時間}), MIN(FILTER(${流程節點}, MATCH(each.${名稱}, "開發")).${節點末次開始時間}) ) IF({條件A成立}, {取值方式A}, {取值方式B}) COUNTIF( ${流程節點}, each.${節點狀態} == $option{已完成} && each.${節點排期}.${週期時長} != 0 && DAYSBETWEEN(each.${節點排期}.${預計結束日期}, each.${節點末次結束時間}) > 0 ) COUNTIF( ${流程節點}, each.${節點狀態} == $option{已完成} && ${存在有效排期} && ${實際完成時間} > ${計劃完成時間} ) IF( ( COUNTIF(FILTER(${流程節點}, each.${名稱} == "產品評審" && each.${節點狀態} == $option{已完成} && each.${節點排期}.${週期時長} != 0), DAYSBETWEEN(each.${節點排期}.${預計結束日期}, each.${節點末次結束時間}) > 0) > 0 ) || ( COUNTIF(FILTER(${流程節點}, each.${名稱} == "產品評審" && each.${節點狀態} != $option{已完成} && each.${節點排期}.${週期時長} != 0), DAYSBETWEEN(each.${節點排期}.${預計結束日期}, TODAY()) > 0) > 0 ), "⛔️ 有延期風險", "✅ 節點正常" ) IF( ( {已完成的核心節點延期判斷} ) || ( {未完成的核心節點延期判斷} ), "風險標識", "正常標識" ) JOIN( FILTER( ${流程節點}, each.${節點狀態} == $option{已完成} && each.${節點排期}.${週期時長} != 0 && DAYSBETWEEN(each.${節點排期}.${預計結束日期}, each.${節點末次結束時間}) > 0 ).${名稱}, ", " ) JOIN(FILTER(${流程節點}, {延期條件}).${名稱}, "{分隔符}") IF( {實施產品} == "xx" && {專案型別} == "xx" && EMPTY({專案結項日期}) == true && EMPTY({專案啟動日期}) == false && DAYSBETWEEN({專案啟動日期}, TODAY()) > 60, "超期", "不超期" ) if( {判斷條件1} && {判斷條件2} && empty(${結束日期欄位}) == true && empty(${開始日期欄位}) == false && daysBetween(${開始日期欄位}, today()) > ${超期閾值天數}, "超期", "正常" ) JOIN([${優先順序}, ${名稱}], " - ") JOIN([${欄位A}, ${欄位B}], "{分隔符}") // 錯誤寫法 JOIN(["釋出於:",${釋出日期}], "") // 正確寫法 JOIN(["釋出於:", STRING(${釋出日期})], "") IF( ${業務線}.${一級選項} == "業務線1", JOIN(["ABC", STRING(${工作項ID})], "-"), IF( ${業務線}.${一級選項} == "業務線2", JOIN(["BGH", STRING(${工作項ID})], "-"), "" ) ) IF( {條件1}, {編碼規則1}, IF( {條件2}, {編碼規則2}, {預設編碼規則} ) ) MATCH(JOIN([${名稱}],""),"頁面") MATCH(JOIN([${欄位}],""),"匹配文字") if(countIf(${參與人員}.${流程角色}, each.${名稱} == "運營受理人" && containsAny(each.${角色人員}, [@xx, @xx])) > 0, "東區", "南區") if( countIf( ${參與人員}.${流程角色}, each.${名稱} == "{角色名}" && containsAny(each.${角色人員}, [@成員A, @成員B]) ) > 0, "標籤A", "標籤B" // 或者 "" ) if( countIf(${參與人員}.${流程角色}, each.${名稱} == "運營受理人" && containsAny(each.${角色人員}, [@成員A, @成員B])) > 0, "東區", if( countIf(${參與人員}.${流程角色}, each.${名稱} == "運營受理人" && containsAny(each.${角色人員}, [@成員C, @成員D])) > 0, "南區", "其他" ) ) FORMAT(${自增數字}, "0000") FORMAT(${自增數字欄位}, "{補零格式}") JOIN( [ IF(${優先順序} == $option{P0}, "A", IF(${優先順序} == $option{P1}, "B", "C")), FORMAT(${建立時間}, "YYYYMM"), FORMAT(${自增數字}, "000") ], "" ) JOIN([{部分1}, {部分2}, {部分3}], "{分隔符}") IF( ${業務線}.${一級選項} == "業務線1", JOIN(["ABC", STRING(${工作項id})], "-"), IF( ${業務線}.${一級選項} == "業務線2", JOIN(["BGH", STRING(${工作項id})], "-"), "" ) ) if( ${條件欄位} == "值1", join(["字首1", string(${工作項id})], "-"), if( ${條件欄位} == "值2", join(["字首2", string(${工作項id})], "-"), "預設值" ) ) // 假設自增數字小於 1000 的是舊資料 IF( ${自增數字} < 1000, JOIN([FORMAT(${建立時間}, "YYYYMM"), FORMAT(${自增數字}, "000000")], "-"), JOIN([${業務線}.${一級選項}, FORMAT(${建立時間}, "YYYYMM"), FORMAT(${自增數字}, "000000")], "-") ) IF({新舊規則的判斷條件}, ${舊規則公式}, ${新規則公式}) // 當狀態為“開啟”或“重新開啟”的 P0 缺陷數量為 0 時,返回 true IF( COUNT( FILTER( $related{缺陷關聯需求}, each.${優先順序} == $option{P0} && (each.${當前狀態} == $option{OPEN} || each.${當前狀態} == $option{REOPEN}) ) ) == 0, true, false ) // 更簡潔的寫法,直接返回布林值 COUNT(FILTER(${關聯關係欄位}, {不允許流轉的條件})) == 0 ${所屬節點資訊}.${名稱} ${所屬節點資訊}.${節點的目標欄位} ${所屬節點資訊}.${節點狀態} ${所屬節點資訊}.${負責人}.${姓名} // 判斷是否存在“開始”或“iOS開發”任意一個節點 CONTAINSANY(${流程節點}.${名稱}, ["開始", "iOS開發"]) // 判斷是否同時存在“開始”和“iOS開發”兩個節點 COUNT(FILTER(${流程節點}, each.${名稱} == "開始" || each.${名稱} == "iOS開發")) == 2 // 判斷是否存在任意一個 CONTAINSANY(${流程節點}.${名稱}, ["{節點名1}", "{節點名2}"]) // 判斷是否包含某個 CONTAINS(${流程節點}.${名稱}, "{節點名}") // 判斷是否同時存在所有(計數法) COUNT(FILTER(${流程節點}, each.${名稱} == "{節點名1}" || each.${名稱} == "{節點名2}")) == 2 IF( COUNTIF(${流程節點}, each.${節點狀態} == $option{進行中}) == 1, JOIN( [ STRING(DATE(FIND(${流程節點}, each.${節點狀態} == $option{進行中}).${節點排期}.${預計開始日期})), STRING(DATE(FIND(${流程節點}, each.${節點狀態} == $option{進行中}).${節點排期}.${預計結束日期})) ], " ~ " ), "存在多個或無進行中節點" ) IF( COUNT(FILTER(${流程節點}, each.${名稱} == "需求評審")) > 0, FIND(${流程節點}, each.${名稱} == "需求評審").${節點進入次數} - 1, 0 ) IF( COUNT(FILTER(${流程節點}, each.${名稱} == "{節點名}")) > 0, FIND(${流程節點}, each.${名稱} == "{節點名}").${節點進入次數} - 1, 0 ) // 計算(Server開發+FE開發)的估分 / (QA/驗收)的估分 IF( SUM(FILTER(${流程節點}, CONTAINSANY([each.${名稱}], ["QA/驗收估分"])).${節點估分}) != 0, JOIN( [ STRING( ROUND( SUM(FILTER(${流程節點}, CONTAINSANY([each.${名稱}], ["Server開發", "FE開發"])).${節點估分}) / SUM(FILTER(${流程節點}, CONTAINSANY([each.${名稱}], ["QA/驗收估分"])).${節點估分}) * 100, 0 ) ), "%" ], "" ), "QA/驗收估分為0" ) BOOL(COUNT(FILTER(${所有狀態}, each.${狀態名稱} == "In Progress" && each.${狀態累計進行時間} > 3))) // 直接返回 true/false BOOL(COUNT(FILTER(${所有狀態}, each.${狀態名稱} == "{狀態名}" && each.${狀態累計進行時間} > {閾值天數}))) IF( BOOL(COUNT(FILTER(${所有狀態}, each.${狀態名稱} == "{狀態名}" && each.${狀態累計進行時間} > {閾值天數}))), "已超期", "正常" ) IF( COUNT(FILTER(${所有狀態}, each.${狀態名稱} == "已解決")) > 0 && COUNT(FILTER(${所有狀態}, each.${狀態名稱} == "已受理")) > 0, DAYSBETWEEN( FIND(${所有狀態}, each.${狀態名稱} == "已受理").${狀態首次開始時間}, FIND(${所有狀態}, each.${狀態名稱} == "已解決").${狀態首次開始時間} ), -1 // 使用-1等特殊值表示無效 ) IF( ${當前狀態} != $option{CLOSED}, DAYSBETWEEN(${提出時間}, TODAY()), DAYSBETWEEN(${提出時間}, FIND(${所有狀態}, each.${狀態名稱} == "CLOSED").${狀態末次開始時間}) ) JOIN($related{需求-關聯版本}.${當前狀態}, ", ") JOIN($related{關聯關係欄位}.${當前狀態}, "{分隔符}") // 命名為 {進度百分比},後續引用 COUNTIF(${流程節點}, each.${節點狀態} == $option{已完成}) / COUNT(${流程節點}) IF( ${進度百分比} >= 1, "●●●●●", IF( ${進度百分比} >= 0.75, "●●●●○", IF( ${進度百分比} >= 0.5, "●●●○○", IF( ${進度百分比} >= 0.25, "●●○○○", "●○○○○" ) ) ) ) IF( ${進度百分比} >= 1, "●●●●●●●●●●", IF( ${進度百分比} >= 0.9, "●●●●●●●●●○", IF( ${進度百分比} >= 0.8, "●●●●●●●●○○", IF( ${進度百分比} >= 0.7, "●●●●●●●○○○", IF( ${進度百分比} >= 0.6, "●●●●●●○○○○", IF( ${進度百分比} >= 0.5, "●●●●●○○○○○", IF( ${進度百分比} >= 0.4, "●●●●○○○○○○", IF( ${進度百分比} >= 0.3, "●●●○○○○○○○", IF( ${進度百分比} >= 0.2, "●●○○○○○○○○", IF( ${進度百分比} >= 0.1, "●○○○○○○○○○", "○○○○○○○○○○" ) ) ) ) ) ) ) ) ) ) JOIN( [ ${進度條公式}, " ", STRING(ROUND(${進度百分比} * 100, 0)), "%" ], "" ) ... IF( ${進度百分比} >= 0.9, IF(${進度百分比} >= 0.95, "●●●●●●●●●◐", "●●●●●●●●●○"), IF( ${進度百分比} >= 0.8, IF(${進度百分比} >= 0.85, "●●●●●●●●◐○", "●●●●●●●●○○"), ... ) ) ...