从项目,任务和日期表创建一列信息

问题描述 投票:2回答:2

我在电子表格中有大量项目,这些项目具有与之关联的不同任务。每个项目都是一行,不同的任务是列。对于每个项目和任务,都有一个必须执行任务的日期。 (如果条目为空,则不必为该项执行任务。)

电子表格示例如下:https://docs.google.com/spreadsheets/d/1jzla_gMw_soVqW7OR3dSsT7Sd9zDYu-oSpdm5HeOzEs/edit?usp=sharing

是否可以将表转换为单个列表,其中包含日期,项目和任务(列表条目按日期排序)?随着时间的推移将添加行/列。

Current Table

         task1,      task2,      task3
      -------------------------------------
item1 |  1/20/2019   2/20/2020  
item2 |              2/23/2020   3/10/2019
item3 |  4/10/2020               5/10/2020

Expected output:

1/20/2019, item1, task1
3/10/2019, item2, task3
2/20/2020, item1, task2
2/23/2020, item2, task2
4/10/2020, item3, task1
5/10/2020, item3, task3
google-sheets excel-formula pivot-table spreadsheet
2个回答
1
投票

如果你想将日期,项目和任务放在单独的列中,请尝试

=ArrayFormula(sort(split(transpose(split(textjoin("¶",true,if(C5:E7="","",C5:E7&"|"&B5:B7&"|"&C4:E4)),"¶")),"|"),1,true))

我必须手动将第一列格式化为mm / dd / yy日期。可以使用TEXT函数将日期格式化为字符串作为公式的一部分,但是它不能用于排序。您可以在单独的列中添加原始(未格式化的)日期并对其进行排序,但这会使公式变得更加复杂。

enter image description here


2
投票

在数据库术语中,您要执行的操作称为规范化。您可以使用一对ARRAYFORMULAS来完成,如下所示:

首先构建垂直(B5:B7)和水平(C4:E4)轴值的所有可能组合的列表并输入,比方说,A10

=arrayformula(
  split(
    transpose(
      split(
        concatenate(
          arrayformula(
            unique(filter(B5:B7, not(isblank(B5:B7)))) & "|" &
            unique(filter(C4:E4, not(isblank(C4:E4)))) & "\"
          )
        ),
      "\")
    ),
    "|")
  )

使用维度值查找表中的日期并将其放在C10中

=arrayformula(
   text(vlookup(A10:A18, $B$4:$E$7, match(B10:B18, $C$4:$E$4, 0)+1, false), "MM/DD/YYYY")
)

enter image description here备注:

  1. 转换为text()实际上是不必要的,但避免了必须格式化单元格。如果您需要将日期值作为日期,请删除文本并将结果列格式化为日期。
  2. 为了使它全部开放,只需将范围保持在一端(例如A10:A而不是A10:A18),但是你必须稍微复杂化公式以处理错误处理
  3. 如果您更喜欢脚本解决方案,下面是一个(相当不优雅)如何完成它的示例。 Normalize (reformat) cross-tab data for Tableau without using Excel
  4. 我把日期作为最后一列,而不是第一列,因为在非规范化表中习惯于将键放在第一列,将值放在后面。撤销订单是微不足道的。
  5. 1899年的日期当然是桌子上的空单元。我再次将错误处理作为练习留给读者:-)
© www.soinside.com 2019 - 2024. All rights reserved.