Google sheets 从项目、任务和日期表创建信息列

Google sheets 从项目、任务和日期表创建信息列,google-sheets,excel-formula,pivot-table,spreadsheet,Google Sheets,Excel Formula,Pivot Table,Spreadsheet,我在电子表格中收集了大量项目,这些项目具有与之相关的不同任务。每个项目是一行,不同的任务是列。对于每个项目和任务,都有一个必须执行任务的日期。(如果条目为空,则不必为该项执行任务。) 电子表格示例如下: 是否可以将表转换为一个列表,其中包含日期、项目和任务(列表项按日期排序)?行/列将随着时间的推移而添加 Current Table task1, task2, task3 -----------------------------------

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

电子表格示例如下:

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

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

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

首先构建垂直(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")
)
注:

  • 转换为text()实际上是不必要的,但可以避免格式化单元格。如果需要日期值作为日期,请删除文本并将结果列的格式改为日期
  • 要使其全部开放,只需在一端打开范围(例如,A10:A而不是A10:A18),然后您必须稍微复杂化公式以处理错误
  • 如果您更喜欢脚本解决方案,下面是一个(相当不雅观的)如何实现的示例。
  • 我把日期放在最后一列,而不是第一列,因为在非规范化的表中习惯于先放键,后放值。颠倒顺序是微不足道的
  • 1899年的日期当然是表中的空单元格。同样,我将错误处理作为练习留给读者:-)

  • 如果您希望日期、项目和任务在单独的列中,请尝试

    =ArrayFormula(sort(split(transpose(split(textjoin("¶",true,if(C5:E7="","",C5:E7&"|"&B5:B7&"|"&C4:E4)),"¶")),"|"),1,true))
    
    我必须手动将第一列格式化为mm/dd/yy日期。可以使用TEXT函数将日期格式化为字符串,作为公式的一部分,但不能用于排序。您可以将原始(未格式化)日期添加到单独的列中并进行排序,但这会使公式更加复杂


    这比我的解决方案好,因为它是单一公式,并且已经排序。一个关键点是,您可以跳过ArrayFormula包装器,因为sort()已经强制执行数组上下文。