如何用 CSV 创建泳道图
把 CSV 导出文件里的负责人或指派给那一列变成泳道:每一个不同的取值成为一条泳道,空单元格落进第一条泳道,而交接就是两端落在不同泳道里的连线。
一份 CSV 只要把写明每个步骤由谁执行的那一列的表头改成“纵向泳道”,它就成了泳道图——导入按表头名称匹配,所以改一个表头就是大半的工作。
简而言之
- 把负责人那一列的表头改名为“纵向泳道”。导入匹配的是表头名称,不是位置。
- 这一列里每一个不同的取值都会成为一条泳道,所以 IT 和带一个尾随空格的 IT 会变成两条。
- 负责人单元格为空,这个步骤会落进第一条泳道,而不是自成一条。
- 交接就是连线到指向的那一行带着不同负责人的连线——直接从文件里就数得出来。
- 永远不要按负责人给 CSV 排序:连线到装的是行号,一排序就把图重新接线了。
负责人那一列本来就是泳道列
几乎每一份描述流程的 CSV,都带着一列写明每个步骤由谁执行。它从工单系统出来时叫“指派给”,从人力系统出来时叫“部门”,从手工维护的台账里出来时叫“负责人”或“责任人”。到现在为止,这一列一直被用来筛选——把属于我的行给我看。而泳道图,就是同一列被用来撑起结构时的样子:这些取值不再是一个筛选条件,而成了流程横穿而过的那些带子。
机制很短,因为 CSV 就是带表头行的纯文本,而 QueryChart 匹配的是表头名称而不是列的位置。把“指派给”改名为“纵向泳道”,把步骤留在“方框文字”里,把它通向的行号留在“连线到”里,然后把 .csv 拖到编辑器的表格区域上,或者把文本直接粘贴进去。泳道列里每一个不同的取值都会成为一条泳道;取值为空则把这个步骤放进第一条泳道。编辑器不认识的列——工单号、到期日、服务级别——会被原样带过并忽略,所以事先没有什么要剔除的。如果文件还不是这个样子,/zh/guides/流程图csv文件结构 讲的是列,/zh/guides/在csv中定义流程图连线 讲的是连线到。
泳道列给你换来的,是一个可以直接施加在文件本身上、不必打开任何工具的交接定义:交接就是两端落在不同泳道里的连线。取一行,读它的连线到数字,找到那一行,比较两个负责人单元格。取值不同就说明工作换了手。顺着文件这么做一遍,你在画任何东西之前就已经数清了这条流程里的交接次数——而这个数字正是值得拿出来争论的那个,因为其中每一次都是一个队列、一封邮件,或者一段等待。
下面这个示例是一次跨五个负责方的营销活动审批:申请人、市场、品牌、法务和媒介采购。它有 25 行、30 条连线,其中 15 条——恰好一半——从一个负责方的泳道跨进了另一个的泳道。请打开画布下方的表格面板,把纵向泳道这一列挨着连线到一起读。
一列负责人,五条泳道
营销活动审批横跨申请人、市场、品牌、法务和媒介采购。打开表格面板,看看是哪一列泳道值产生了这些带子。
只有行和形状
前六行是简报环节:“提出营销活动申请”、“填写营销活动简报”、检查“简报是否完整到可以开始策划?”、一个关于缺失信息的追问、拒绝行“营销活动申请已撤回”,以及“商定上线日期与预算”。这就是一份 CSV 导出文件通常装着的东西——一串带形状取值、彼此之间毫无连接的步骤。谁也没法从里面看出工作在哪里换了手。
连线到,以及第一次跨界
填上连线到,箭头就画出来了,而第一次交接立刻显形:“填写营销活动简报”属于申请人,它指向“简报是否完整到可以开始策划?”,而后者属于市场。第 9 到第 11 行加上了品牌检查和它的返工循环,其中第 11 行指回第 9 行——连线到里的一个回溯数字,把素材从市场第二次交到品牌手上。
给分支贴上标签
第 14 行“宣传主张是否按原文通过?”的连线到里有三个数字,连线文字里有三个标签:通过、需改写,以及“无法提供证据”。需改写这个出口通向市场那边的第 15 行,而第 15 行又直接指回法务那边的第 13 行。于是一次措辞修改就跨越泳道边界两次,这种往返正是文件明明白白说出来、而一份文字版作业指导书从来说不出来的事。
泳道列
全部 25 行现在都带上了纵向泳道的取值——申请人、市场、品牌、法务、媒介采购——以及一个表示阶段的横向泳道取值:简报、创作、评审、审批、上线。30 条连线里有 15 条跨过了负责方边界。法务只占三行,却有四条连线进出它,这正是把法务比第 13 行更早拉进来的理由。
运作方式
挑出唯一那一列写明负责人的列
导出文件通常提供好几个候选:指派给、负责人、责任人、部门、团队、队列。请挑出与你想要的泳道粒度相符的那一列——读者是管理者就用团队,只有当这条流程真的因人而异时才用具名的人。一张泳道图只有一根泳道轴承载论点,其余的列都可以跟着走而不被使用。
导入之前先把不同取值列出来
在产出这份文件的工具里,对那一列做一次唯一值或删除重复项,然后读结果。这份清单正是你即将得到的那组泳道。如果它有九项而你预期五项,那你有的是四个拼写变体,不是四个团队,而在那一列里改掉它们,比事后合并泳道要便宜得多。
把空格填上一个真实的取值
一个空的负责人单元格不会产生一条“未知”泳道——这个步骤会落进第一条泳道,而在每一位读者看来,那就是第一个团队负责这件工作。请在每一个空单元格里敲进一个明确的取值,“未指派”或者“尚未商定”。谁也叫不出负责人的那些步骤,是这整件事里最有价值的产出,所以给它们一个看得见的位置待着。
改写表头行
导入读的就是表头行:步骤用“方框文字”,它通向的行号用“连线到”,分支标签用“连线文字”,开始、流程、决策、结束用“形状”,负责人用“纵向泳道”。如果你还有一列阶段或环节,也一并用上“横向泳道”。一个还叫“负责人”的表头会被原样带过并忽略,图会平铺着画出来,不给任何提示。
检查分隔符、引号和编码
负责人取值是最可能含逗号的那种——“财务, 欧非中东”或者“运营, 北欧”——而一个不加引号的逗号会把这一行劈出一个多余的列,把它之后的每一个值都往左挪一位。请用纯文本编辑器打开这份文件看三四行。确认分隔符确实是你以为的那个,确认任何含分隔符的取值都用双引号包住了,并确认文件是 UTF-8,好让带重音的泳道名活下来。
导入,然后读那些跨界
把 .csv 拖到一张新图表的表格区域上,或者把文本粘贴进去。泳道会显示成带子,图自行选路。现在追一遍每一支离开一条带子又进入另一条带子的箭头:那些就是交接,而其中最值得关注的,是那些跨过去又跨回来的成对箭头,比如示例里市场和法务之间的改写循环。
应避免的错误
一列还叫“负责人”
导入匹配的是表头名称。表头写着负责人、指派给或部门的列会被原样带过并忽略,于是图平铺着画出来,看上去像是不支持泳道。表头必须写成“纵向泳道”或“横向泳道”。
先按负责人给文件排了序
把行按团队分组,感觉像是在为泳道做准备,实际上会毁掉这张图:连线到装的是行号,重新排序会把每一行重新编号,于是每一条连线都指向了别处。泳道会从取值里自行分组。泳道的顺序是图表的属性,不是文件的属性——在编辑器里调一次就行。
近乎重复的泳道取值
不同的字符串就是不同的泳道,所以 IT、I.T. 和带一个尾随空格的 IT 是三条泳道,其中两条名字看着一样。导出文件源源不断地产出这种东西:有的行是显示名,有的行是邮箱地址,一个团队年中改过一次名。请先把这一列规范化,再导入。
取值内部的逗号和分号
不加引号的“法务, 欧非中东”会变成两个字段,把你的泳道文字挤进备注列。欧洲区域设置的导出文件常常是分号分隔、逗号作小数点的,它以同样的方式在往后一列的位置上出错。导入之前先看原始文本;流程地图上的同一个问题,见 /zh/guides/csv转流程地图。
把你的负责人列变成泳道
把这个营销活动示例作为你自己的图表打开,看看纵向泳道那一列在做什么,然后把你自己的行覆盖上去。
相关指南
常见问题
负责人该放进横向泳道还是纵向泳道?
两者都行,也可以都用。示例里的惯例是纵向泳道放负责人——申请人、市场、品牌、法务、媒介采购——横向泳道放阶段:简报、创作、评审、审批、上线。这样得到一张网格,一个步骤的位置同时说明了由谁做和在什么时候做。如果你的文件只有负责人一列,就填一个泳道列、把另一个留空;单轴本来就是一张正常的泳道图。
我会得到多少条泳道?
泳道列里每一个不重复且非空的取值一条,这也正是导入前值得把唯一值清单读一遍的原因。空单元格不会多产生一条泳道——它们把步骤放进第一条——所以一份有缺失的导出文件,会悄悄把无人负责的工作归到碰巧排在最前面的那个团队头上。在那些单元格里敲上“未指派”只花一分钟,却把一个看不见的错误变成了一条看得见的泳道。
光读 CSV 就能找出交接吗?
能,而且值得做一次,好让你信得过这张图。对每一行,取连线到里的数字,找到那一行,比较两个负责人单元格:取值不同就说明工作换了手。回溯的数字也算——一个指向更早那行的返工行,是另一个方向上的交接。/zh/templates/csv泳道流程图 上的示例文件有 30 条连线,其中 15 条跨过了泳道边界。
我的导出文件是一行一张工单,指派给里有四十个人名,现在怎么办?
你手上的是一份实例流水,不是一份流程定义,把它导进来会得到四十条泳道,每条里装着几个互不相关的方框。两遍就能修好:先把行归约成这些工单走过的那些不同步骤,再把人名映射成执行它们的角色或团队。泳道只有在三条到七条左右时才读得下去,而一人一条泳道的图回答的是一个人员配置问题,不是一个流程问题。
泳道标题变成了乱码字符,出了什么事?
编码。泳道名是画在图上的,所以一份以 Latin-1 或 Windows-1252 导出、却被当成 UTF-8 读取的文件,会把它的损坏摆在最显眼的地方——带子标题里,一个重音字符会变成两个游离的字符。请重新导出为 UTF-8,而不要手工修正那些标签,因为同样的取值通常也出现在别的列里。如果表现为第一列被忽略了,那就检查表头行开头有没有一个字节顺序标记。
