0

我有这个怪异的问题在我脑海中挥之不去。

考虑以下电子表格结构:

      | A   B       C       D       E
    ----------------------------------------------------------------------    
    1 | The awsome project of Foo
    2 |             
    3 | Pri Type    Issue   Estim   Subject
    4 |         
    5 | 1   Story   FA-133          The great UI feature
    6 |             FA-134  5       Do some work
    7 |             FA-135  2       Document the work
    8 |     Bug     FA-137  1       Fix the misplaced pixel
    9 |             FA-136  2       Regression test
    10|                 
    11| 2   Story   FA-153          The awsome BL computation
    12|             FA-154  5       Do some work
    13|             FA-155  2       Document the work
    14|     Bug     FA-157  1       Fix the precision trancation error
    15|     Bug     FA-129  1       Fix the wrong error code
    16|             FA-156  2       Regression test

Pri = 优先级, Estim = 估计

好吧,还有技能类型,但让我们保持简单,对吧......

现在,故事是什么?确切地。我们正在寻找故事。

简而言之

对于不是 Story的每条记录(并且不为空),我需要提取其上方第一个Story记录的主题优先级。

我们如何在电子表格上做到这一点?

这是完整的图片:

我正在尝试帮助我的 Scrum 主管,他现在正在使用电子表格与我们的客户沟通,以进行我们的修饰和计划会议。

现在,在每个 sprint 开始时,一旦范围关闭,他手动将所有任务行(不是Story的那些)复制到备忘录纸笔记中,并将它们放在板上。到目前为止 - 很棒。我们喜欢 Scrum。

但是:我想自动打印这些笔记。就像 duhhh,我们在 2013 年......为此,我需要一个包含相关记录值的 CSV 或 TSV 字符串,以便我可以制定和打印它们。

现在,假设我想在每个任务的记录中计算一个带有故事名称的列,其中说明问题任务的故事是什么以及这个故事的优先级是什么,我将如何在我们的谷歌电子表格上做到这一点?

如果您跳过诸如“为故事中的每个任务拖动优先级以填充它”或“为故事主题添加一个简单的列并手动填充它”之类的建议,我会感谢您。

  • 首先 - 我们的客户喜欢这个电子表格干净易读,没有重复信息,我们尽量满足他的需求。所以 - 隐藏的列是答案的一半。不是全部。

  • 第二 - 在计划任务期间,当它们的优先级发生变化时,它们会在故事之间移动,所以它会变得不舒服。

这个想法是自动化平凡的工作,而不是为计算机工作......

如果我可以使用公式计算这些值 - 那就太棒了

4

1 回答 1

1

所以,我花了很多时间来解决这个问题,但最终得到了一个可行的解决方案——尽管不是最漂亮的。

我创建了一个电子表格:https ://docs.google.com/spreadsheets/d/13KdxYCvNHekAd3pXOhHftSzAzMXS9HqoOCtFoxXocCM/edit?usp=sharing - 看看它,我试图模拟指定的情况。我将尝试解释我搞砸了什么:)

首先,我添加了两列 (F,G),我们将在其中计算结果。关键函数很丑,我们通过一个例子来看看——让我们仔细看看单元格F15,你可以在其中找到以下函数:

=if(and(B15<>"",B15<>"Story"),index(A:E,row(B15)+MAX(arrayformula(if((arrayformula(match(filter(C:C,B:B="Story"),C:C,0))-row(B15))>0,-99999999,arrayformula(match(filter(C:C,B:B="Story"),C:C,0))-row(B15)))),1),"")

很丑,我承认,但也许我可以解释。(此外,在电子表格中,我添加了一些额外的列,从 H 到 L,我在其中逐步解释了我使用的函数 - 请参阅下面的编号列表)

首先,我们做一个快速条件 (IF) 并检查问题的类型不应该为空或故事:if(and(B15<>"",B15<>"Story")- 如果是 TRUE,我们会做一些魔术(稍后解释),如果是 FALSE,我们会在这个单元格中写入一个空字符串- ),"")- 在大丑功能的最后。

现在,魔法来了。逻辑上它看起来像:

  1. 查找故事类型问题的问题编号。
  2. 找出这些问题有哪些行号
  3. 计算这些行与“我们的行”的距离(在示例中,它是第 15 行,还记得吗?)
  4. 选择离我们最近的行并且在我们的行之前的行。
  5. 如果我们有属于我们的 Story 的行号,我们基本上就完成了,我们“只”需要导航到该行,并获取该行的优先级和主题,然后复制到 F15 和 G15。

在丑陋的函数中,以下代码片段代表了上述逻辑:

  1. filter(C:C,B:B="Story")- 一个简单的过滤器,它将找到故事类型问题的所有问题编号
  2. arrayformula(match(filter(C:C,B:B="Story"),C:C,0))- 这将为每个问题编号找到确切的行号。
  3. arrayformula(match(filter(C:C,B:B="Story"),C:C,0))-row(B15)))- 一个简单的减法将告诉我们这些行距我们的行有多“远”。但是,我们应该在这里做一个小技巧,因为如果这些结果是肯定的,则意味着在我们的行之后还有故事。但是我们不想考虑这些,所以有一个 IF,它确保在这些情况下不会选择这些选项: if((arrayformula(match(filter(C:C,B:B="Story"),C:C,0))-row(B15))>0,-99999999,arrayformula(match(filter(C:C,B:B="Story"),C:C,0))-row(B15))))
  4. MAX(arrayformula(if((arrayformula(match(filter(C:C,B:B="Story"),C:C,0))-row(B15))>0,-99999999,arrayformula(match(filter(C:C,B:B="Story"),C:C,0))-row(B15))))- 我们正在选择最接近的选项。(MAX 函数将选择最接近零的 NEGATIVE 数)
  5. index(A:E,row(B15)+MAX(arrayformula(if((arrayformula(match(filter(C:C,B:B="Story"),C:C,0))-row(B15))>0,-99999999,arrayformula(match(filter(C:C,B:B="Story"),C:C,0))-row(B15)))),1)- 最后,我们使用 INDEX 函数导航到该行。第一个参数是范围,第二个参数是我们在前面步骤中计算的行(魔术),最后一个参数(1)是列号。由于我们需要这里的优先级,这就是它设置为 1 的原因。

限制:该函数假定每个故事都有一个问题编号。

我希望它有所帮助。

更新:

如果您想计算所有不是故事但有问题编号的行,请像这样更改函数:

=if(and(C15<>"",B15<>"Story"),index(A:E,row(B15)+MAX(arrayformula(if((arrayformula(match(filter(C:C,B:B="Story"),C:C,0))-row(B15))>0,-99999999,arrayformula(match(filter(C:C,B:B="Story"),C:C,0))-row(B15)))),1),"")

(只有第一个条件改变:B15 到 C15)

于 2014-04-25T20:49:57.153 回答