Google sheets Google Sheets公式用于计算具有不同开始/结束日期、重叠和间隔的任务的实际总持续时间

Google sheets Google Sheets公式用于计算具有不同开始/结束日期、重叠和间隔的任务的实际总持续时间,google-sheets,unique,google-sheets-formula,array-formulas,google-sheets-query,Google Sheets,Unique,Google Sheets Formula,Array Formulas,Google Sheets Query,我知道如何使用自定义函数/脚本来实现这一点,但我想知道是否可以使用内置公式来实现 我有一个带有开始日期和结束日期的任务列表。我想计算所有任务的实际工作日(NETWORKDAYS) 工作日可能会重叠,所以我不能只计算每项任务的总天数 任务之间可能存在差距,因此我无法找到第一个开始和最后一个结束之间的差异 例如,让我们使用这些: | Task Name | Start Date | End Date | NETWORKDAYS | |:---------:|------------|----

我知道如何使用自定义函数/脚本来实现这一点,但我想知道是否可以使用内置公式来实现

我有一个带有开始日期和结束日期的任务列表。我想计算所有任务的实际工作日(
NETWORKDAYS

  • 工作日可能会重叠,所以我不能只计算每项任务的总天数
  • 任务之间可能存在差距,因此我无法找到第一个开始和最后一个结束之间的差异
例如,让我们使用这些:

| Task Name | Start Date | End Date   | NETWORKDAYS |
|:---------:|------------|------------|:-----------:|
|     A     | 2019-09-02 | 2019-09-04 |      3      |
|     B     | 2019-09-03 | 2019-09-09 |      5      |
|     C     | 2019-09-12 | 2019-09-13 |      2      |
|     D     | 2019-09-16 | 2019-09-17 |      2      |
|     E     | 2019-09-19 | 2019-09-23 |      3      |
这是视觉上的:

现在:

  • 如果您将
    网络天数合计
    ,您将得到15天
  • 如果您计算2019-09-02和2019-09-23之间的净工作日,您将得到16
但实际持续时间为13:

  • A和B有点重叠
  • B和C之间有一个间隙
  • D和E之间有一个间隙
如果我要编写一个自定义函数,我基本上会获取所有日期,对它们进行排序,查找重叠并删除它们,并考虑间隙

但我想知道是否有办法使用内置公式计算实际持续时间?

当然,为什么不:

=ARRAYFORMULA(COUNTA(IFERROR(QUERY(UNIQUE(TRANSPOSE(SPLIT(CONCATENATE("×"&
 SPLIT(REPT(INDIRECT("B1:B"&COUNTA(B1:B))&"×", 
 NETWORKDAYS(INDIRECT("B1:B"&COUNTA(B1:B)), INDIRECT("C1:C"&COUNTA(B1:B)))), "×")+
 TRANSPOSE(ROW(INDIRECT("A1:A"&MAX(NETWORKDAYS(B1:B, C1:C))))-1)), "×"))), 
 "where Col1>4000", 0))))

这太棒了。我试图通过它来了解它是如何工作的,但运气不太好。在高层次上,它到底在做什么?另外,如果第一行有一个标题,那么无论如何要让它工作吗?我试着用A2/B2/C2回复A1/B1/C1,但不起作用。好吧,将每个开始日期转换为一个数字,取开始日期数字,创建一个数组,每个值比前一个值多1,长度为开始和结束之间的工作日,删除重复项,计数。。。是否存在这样一种情况,即在开始日期加上#个工作日不会导致重复?否。它更像是:取开始日期的第一列,按networkday复制每个日期。然后将其拆分为列,并将0添加到第一列,将1添加到第二列,将2添加到第三列,等等。然后将所有内容合并到一个单元格中,并将其拆分为一列。创建唯一列表并删除非日期的低值。然后只计算第二行的输出单元fix:
=ARRAYFORMULA(COUNTA(IFERROR)(查询(唯一)(转置(拆分)(连接(×)和拆分(报告(间接(“B2:B”)和COUNTA(B2:B)+1)和“×”,净工作日(间接(“B2:B”和COUNTA(B2:B)+1),间接(“C2:C”和COUNTA(B2:B)+1)),“×”+转置(行(间接(“A1:A”和最大净工作日(B2:B,C2:C))-1),“×”,“where Col1>4000”,0))
-谢谢。这非常有效。我做了一些小改动,以适应任务没有结束日期的情况。您介意我编辑您的答案以重新格式化函数,以便更易于阅读并添加解释其功能的注释吗。