介绍 
考虑度量的场景多变,数据表中的原始维度和度量并不满足我们的需求,需要使用公式或函数进行数据处理和分析。飞书项目度量提供了计算字段作为补充。通过计算字段,可以针对性的取指标和维度。如: 
- 计算一定周期内的估分数据; 
 
- 计算一定周期内有效录入缺陷数据; 
 
- ...... 
 
计算字段界面介绍 
计算字段分为三个区,分别是公式编辑区、字段与函数选择区与示例区。 
- 公式编辑区:可以使用常见的 formula 公式进行编辑,类似「字段一 + 字段二」,从字段与函数选择区选择字段与函数; 
 
- 字段与函数选择区:可以在本区域内选择所需的字段与函数输入到公式编辑区; 
 
- 字段与函数示例区:在本区域内可以了解字段与函数的介绍与使用实例,方便快速上手使用。 
 
 
250px|700px|reset
飞书项目的公式不限制于 Excel 单元格,你可以使用 飞书项目提供的字段对象作为公式的组成部分。 
 
基础知识 
字段 
即 飞书项目内置与自定义的字段,例如:需求名称、需求类型、业务线等等..... 
 
250px|700px|reset
函数 
函数是一组执行任务或计算值的语句,飞书项目计算字段提供了算数函数、逻辑运算、比较函数、字符串函数、数组操作函数与特殊函数。详细使用请参考:@计算函数清单 
数据类型 
即字段类型、函数输出内容的类型,计算字段内提供的数据类型有: 
- String(字符串):需求名称、节点 ID,主要是文本、 
 
- Number(数值):节点估分、主要是数字相关的字段; 
 
- Boolean(布尔值):需要 AB 测试、主要是开关字段; 
 
- Date(日期):提出时间、节点完成时间等时间类型字段; 
 
- Array(数组):业务线、优先级等选择字段。 
 
表达式 
表达式即是将不同字段与函数之间进行组合生成的类似数学公式的展示。比如SUMIF(MATCH(需求状态,"开发中"),节点估分)即是输出需求状态在开发中的所有节点估分。 
注意的是,不同的数据类型,未经过数据类型的转换,不能组合成公式。 
 
对比 Excel 
- 传统的 Excel 是根据单元格来执行公式,例如,(A1:A31)/(B1:B31)。公式实现自由,但只能针对单个单元格,无法批量复用。 
 
- 飞书项目的公式采用的是对象名称,示例中的(A1:A31)/(B1:B31),A 列是人天。B 列名称是时间,那么 飞书项目人天/时间,即可进行计算。 
 
新建计算字段 
比如现在我们要开始度量不同业务线的不同角色在开发中的人力估分: 
- 选择维度是:业务线、角色名称; 
 
- 选择指标是:开发中的人力估分。 
 
业务线、角色名称是默认提供了相关字段,但是 飞书项目中未提供「开发中的人力估分」字段,所以这里就需要通过计算字段来拼接组成一个新的字段。 
- 新建好一个图表后,在维度上配置好「业务线」、「角色名称」; 
 
 
250px|700px|reset
- 在配置维度与指标选择字段时,选择「+ 添加计算字段」; 
 
 
250px|700px|reset
- 输入名称「开发中人力估分」,开始我们的公式撰写; 
 
 
250px|700px|reset
- 我们需要先获取到需求所在的状态、状态下节点的估分,然后组合在一起获取某个状态下的节点估分。聚合函数中的条件求和函数 SUMIF()来根据获取到是否是需求所在的状态,来求和节点估分。 
 
- 这里我们简单解析一下SUMIF():通过条件判断来对字段求和,比如在SUMIF(优先级="P1",节点估分) = 6公式中,当优先级优先级="P1" 也就是筛出来优先级 P1 的需求,然后对优先级 P1 的需求相关的节点估分进行求和。 
 
- 了解的公式使用后,我们可以开始我们的公式撰写:SUMIF(需求状态="开发中",节点估分),输入到计算字段公式编辑区中即可。 
 
 
250px|700px|reset
- 得到我们想要的图表视图,保存后在视图中预览即可。 
 
 
250px|700px|reset
计算字段示例 
 
这里我们举例一些常用的表达式书写: 
四则运算 
四则运算是指加法、减法、乘法和除法四种运算,是数学中最基础的运算规则。飞书项目算数函数中提供了+(加)、-(减)、*(乘)、/(除以)、%(取余)、Pow()(求幂) 与 Sqrt()(开根号)等 7 种运算符。 
比如我们要计算三个需求状态的估分之和,那么我们就可以这么写: 
SUMIF(需求状态="设计中",节点估分) + SUMIF(需求状态="开发中",节点估分) + SUMIF(需求状态="测试中",节点估分) // 设计中的节点估分 + 开发中的节点估分 + 测试中的节点估分分
 
聚合运算 
聚合函数支持:SUM()(对字段求和)、AVG()(取字段平均值)、MIN()(取字段最小值)、MAX()(取字段最大值)、COUNT()(对字段计数)、MEDIAN()(取字段中位数)。 
以及对应的聚合条件函数 SUMIF()(通过条件判断,对字段求和)、AVGIF()(通过条件判断,取字段平均值)、MINIF()(通过条件判断,取字段最小值)、MAXIF()(通过条件判断,取字段最大值)、COUNTIF()(通过条件判断,对字段计数)、MEDIAN()(通过条件判断,取字段中位数)。 
求和与条件求和 
需要计算需求的估分之和,那么可以选择 SUM(),比如我们要计算单个需求的总估分之和,就可以参考下方公式: 
SUM(节点估分) // 输出单个需求的总估分,即所有节点估分之和和
 
那么我们想要求某个业务线下的需求估分之和,这里明显就有条件相关,就可以选择 SUMIF(),计算公式如下: 
SUMIF(业务线="前端",节点估分) // 输出属于某个业务线下的单个需求的总估分分
 
以此类推,可以将业务线替换为优先级、需求/缺陷类型来计算某些指标。 
计数与条件计数 
需要计算需求、缺陷、节点的数量,可以尝试使用 COUNT() 进行计数,比如现在我们想要计算需求的数量。 
COUNT(工作项id) // 输出数值,计算需求的数量量
 
类似我们需要计算某个业务线下的需求数量,可以使用 COUNTIF() 来进行计算: 
COUNTIF(业务线="前端",工作项id) // 输出前端业务线需求的数量量
 
逻辑运算 
飞书项目为逻辑运算提供了 AND(与)、OR(或)、IF(条件判断)、IN(是否属于)、NOT(取非) 等五种逻辑运算符。 
AND 与 OR 
基于条件计数,我们可以尝试用上 AND 与 OR。比如我们需要计算某个业务线下某个需求流程下的需求数量。不过在实际公式中建议 AND 使用 && 代替,OR 用 || 代替。 
COUNTIF(业务线="前端" && 需求流程="产品需求流程",需求名称) // 输出前端业务线下产品需求流程相关的需求的数量量
 
IF 
IF 主要应用场景是条件判断,常用作维度,飞书项目提供了两种实现方式: 
- If(值A > 值B,"展示 True 的结果", "展示 False 的结果") 
 
- 值A > 值B ? "展示 True 的结果" : "展示 False 的结果" 
 
在逻辑清晰的情况下,也可以尝试使用 IF 进行嵌套。 
- If(值A > 值B, If(值D > 值C,"展示 True 的结果", "展示 False 的结果") , "展示 False 的结果") = 展示 True 的结果 
 
具体例子如:假设现在有一堆需求,需要通过人天的大小判断是大需求还是小需求,可以这么写:IF(人天> 20,大需求,小需求),当人天大于 20,就是大需求,否则就是小需求。 
其他运算 
时间提取与转换 
如果我们需要计算一个时间段,那么 Timeline 可以很好的满足需求。比如输出 2021 年 8 月 1 日到2021 年 8 月 31 日的数据。 
timeline("2021/08/01", "2021/08/31", "day") // 输出天数数
 
对应也可以通过 week 输出周、month 输出月,以此类推...... 
数据去重 
有些时候通过 COUNT() 计算的数据是有重复数据,这里我们就需要对该数据进行去重。飞书项目提供了两种去重函数:COUNTDISTINCT()去重计数与COUNTDISTINCTIF()带条件的去重计数。 
COUNTDISTINCT(需求名称) // 相同名称的需求去重
COUNTDISTINCTIF(业务线="前端",需求名称) // 相同名称的前端需求去重重
 
函数解析 
度量支持 date_add() 函数,快捷查看最近 14 天关闭的缺陷数量 
度量增加 date_add 函数,可以计算日期增减计算后的返回值。 
- 语法:date_add(date,number) 
 
- 示例:date_add(now(),-60) 
 
如计算查看最近 14 天的缺陷数据,则指标公式书写为:countif(归档时间>=date_add(now(),-14),工作项id) 
度量支持时间游标,快捷计算每天缺陷关闭的数量 
在实际度量场景中,以时间轴作为维度时,指标需要根据当前日期区间进行计算。通过 timeline_cursor() 可以取当前 timeline 时间切片日期。 
- 语法:timeline_cursor() 
 
- 示例:date_add(timeline_cursor(),-60) 
 
如计算每天缺陷关闭的数量,则指标公式书写为:countif(TOSTARTOFDAY(归档日期)= TOSTARTOFDAY(TIMELINE_CURSOR()),工作项id),维度选择timeline 函数,timeline("2022/01/01", "2022/05/03", "day")。 
注意 TIMELINE_CURSOR() 默认秒,需要使用 TOSTARTOFDAY() 对相关值进行转换。 
案例解析 
计算未关闭缺陷的数量 
PMO 同学在度量时,需要对产品质量上做一个完整分析,比如产品收尾时,要计算某个迭代下未关闭缺陷的数量,用来判断剩余多少缺陷,估算需求上线时间。 
回到字段本身,如需计算数量相关,首先想到应该是 COUNT()(对字段计数),如果计算时候带有条件,那么可以使用 COUNTIF()(通过条件判断,对字段计数)。 
这里需要计算未关闭的缺陷数据,那么就是计算「状态 ≠ CLOSE」的缺陷数,说明这里是有条件的,可以使用 COUNTIF() 来进行计算。接下来将条件代入COUNTIF(): 
COUNTIF(状态 != "CLOSE", 工作项id) //「≠」在公式中使用「!=」表达;工作项id等于缺陷 idd
 
计算某业务线下某迭代的人力总和 
同样是 PMO 同学需要估算某个业务线在某个迭代下的人力消耗总数,方便为下一次迭代提供人力预估。 
那么这里我们需要计算人力总数相关,首先想到是的SUM()(对字段求和),如果计算的字段有条件,那么可以使用,SUMIF()(通过条件判断,对字段求和)。 
首先是选择业务线,再选择对应的迭代。因为用到条件相关,这里就需要用到SUMIF()。首先业务线是「文档」,迭代是 Sprint5,我们按照计算字段的表达式书写规范,得出: 
业务线 = "文档" && 迭代 ="Sprint5""
 
代入到SUMIF(): 
SUMIF(业务线 = "文档" && 迭代 ="Sprint5", 节点估分))
 
计算业务线完成需求分布 
如果需要计算业务线全部需求与完成需求的数量对比,看到不同业务线处理数据的进度。这里维度直接选择「业务线」即可,指标我们需要选择两个,分别是「全部需求数量」与「完成需求数量」,完成需求我们可以用直接选择字段「工作项id」,选择计数。 
但是针对「完成需求数量」,我们通过计算字段来计算。还是前面说到的计算数量我们用 COUNT,如果有条件就是 COUNTIF。 
首先我们判断需求已完成,isnull 就是用来判断某个字段是否为空,为空那么就是布尔中的 true,比如需求没有完成时间,isnull(完成时间) = true,那么反过来需求完成了,有完成时间,isnull(完成时间)=false。 
isnull(完成时间)=falsee
 
接着我们计算完成的数量,输入我们 COUNTIF 的公式即可 
COUNTIF(isnull(完成时间)=false,工作项id) //输出已经完成的需求数量量
 
计算节点累积流 
某项目 PMO 在初期规划项目时,没有使用 飞书项目的状态来作为需求流程的依据,而是通过节点。现在 PMO 同学想通过节点来判断需求在各个阶段的需求数。 
虽然可以参考第六个案例聚合节点,实际还有一种方式,就是在指标上配置计算字段。 
计算节点周期 
如何聚合某些节点为新的状态,或者聚合某些业务线为新的业务线? 
节点作为一个维度,有 6 个值,我想重新定义这个维度支持几个节点合并成一个阶段么,重新定义一个维度,比如 A、B、C 三个节点聚合为「开始」,D、E 聚合为「进行中」,F 聚合为 「已结束」。 
这里就需要使用到计算字段的 IF 函数。 
IF(值A > 值B,"True", "False") //值A > 值B 时,输出「True」」
 
套用上面的公式: 
IF(节点名称="A" || 节点名称="B" || 节点名称="C", "开始", IF(节点名称="D" || 节点名称="E","进行中","已结束")))
 
- 节点名称="A" || 节点名称="B" || 节点名称="C" 会取流程中的 A、B、C 三个节点,当节点名称等于 A 或 B 或 C 时,那么显示维度为「开始」; 
 
IF(节点名称="A" || 节点名称="B" || 节点名称="C", "开始","xx"))
 
- 判断完「开始」,现在我们需要判断「进行中」与「已结束」,我们再加一个 IF。输入判断条件节点名称="D" || 节点名称="E",当节点名称等于 D 或 E 时,那么显示维度为「进行中」; 
 
- 因为只有六个节点,我们已经取了五个节点,如果还是不匹配这五个节点,直接显示 「已结束」作为维度,也就是匹配 节点名称="F"; 
 
IF(节点名称="D" || 节点名称="E","进行中","已结束"))
 
- 将IF(节点名称="D" || 节点名称="E","进行中","已结束") 替换"xx",即可生成三个维度。 
 
- 如果存在聚合成多个状态,那么就继续套用 IF 函数,如果想要聚合其他内容,如任务状态,则替换判断 任务状态="A" || 任务状态 ="B" 实际效果参考: 
 
 
250px|700px|reset
注意的是,输出的结果类型需要统一,条件输出字符串,那么统一输出字符串,使用""包裹,或者 TOSTRING() 函数进行转换;如果输出数字,那么统一使用字符串。 
 
还是无法理解,那就记住:现在有「你我他」,你是你,那就显示你,我是我,那就显示我,反之显示他。 
IF(你=你,显示你,IF(我=我,显示我,反之显示他)) 
 
FAQ 
为什么我的公式输入后报错? 
报错问题请先检查是否存在以下问题: 
- 标点符号问题:中英文引号、中英文逗号 、中英文小括号等中英文标点符号混用导致语法解析出错。例如:使用了「“全角双引号”」、使用了「全角逗号,」、使用「(全角括号)」都会导致报错。 
 
- 字段与函数选择问题:如果提示字段或者函数未高亮,请先点击报错字段后,在「字段与函数选择区」重新选择一次字段或函数。 
 
- 数据类型问题:不同的数据类型是无法进行进行直接运算,比如输出公式EMPTY(任务名称) + COUNT(任务名称)就是无效公式。EMPTY() 输出 Boolean(布尔值) ,COUNT()(数值)输出Number。 
 
配置状态流状态标识、状态 xx 时间为什么使用不出数据? 
需要结合 MAXIF 函数使用,具体案例: 
COUNTIF(TOSTARTOFDAY(MAXIF(状态流状态标识="OPEN",状态末次结束时间))=TOSTARTOFDAY(TIMELINE_CURSOR()) AND TOSTARTOFDAY(MAXIF(状态流状态标识="RESOLVED",状态首次开始时间))=TOSTARTOFDAY(TIMELINE_CURSOR()), 工作项id))
 











