【问题标题】:List all missing Dates between a Start Date and Today()列出开始日期和今天()之间的所有缺失日期
【发布时间】:2018-10-13 15:14:43
【问题描述】:

Sample Sheet - 有预期的结果

我需要帮助来列出 Google 表格 列中所有缺失的日期,该列的开始日期是 Today()。

日期范围:出勤!G2:G

公式:DashBoard!T1

下面是一个部分有效的公式,它仅显示第一个缺失的日期。但我要求它列出所有缺失的日期。

部分工作公式:

=ARRAYFORMULA(SMALL(IF(COUNTIFS(Attendance!G2:G, "<="&ROW(INDIRECT(MIN(Attendance!G2:G)&":"&MAX(Today()))), Attendance!G2:G, ">="&ROW(INDIRECT(MIN(Attendance!G2:G)&":"&MAX(Today()))))=0, ROW(INDIRECT(MIN(Attendance!G2:G)&":"&MAX(Today())))), ROWS($A$1:A1)))

谢谢! 扎丁

【问题讨论】:

    标签: google-sheets


    【解决方案1】:
    =FILTER(WORKDAY.INTL(Attendance!G2,ROW(A1:INDEX(A:A,today()-Attendance!G2)),"0000000"),ISNA(MATCH(WORKDAY.INTL(Attendance!G2,ROW(A1:INDEX(A:A,today()-Attendance!G2)),"0000000"),Attendance!G2:G,0)))
    
    • WORKDAY.INTL 列出从开始日期到今天的所有日期
    • 匹配以在给定列表中查找上面列出的所有日期。
    • FILTER(,ISNA()) 查找缺失的日期

    【讨论】:

    • 感谢您的解决方案。它按预期工作,这是我能够更容易理解的事情。欣赏它!美好的一天
    • 嗨,我被要求忽略周末的显示,这是有道理的。 周末是周六和周日。我尝试删除 WORKDAY.INT 公式的“0000000”[周末]部分,但由于公式无法读取 Today() 部分并显示未来,因此所需结果不正确日期也。然后我尝试将周末指定为数值 1,2,但它也不起作用。我用 NETWORKDAYS 替换了 WORKDAY.INT,然后只用了 WORKDAY 函数,但两次尝试都失败了。有人可以帮我解决这个问题吗?
    • 好的,我按说的做了更改,但现在显示的日期截止到 2018 年 5 月 16 日。前 2 个日期是截至 5 月 4 日今天()的日期范围内缺少的工作日。但该公式也将 5 月 7 日至 16 日显示为缺失日期。我在样品表上显示了结果,并显示了预期的结果。 修改后的公式: =FILTER(WORKDAY.INTL(Attendance!G2,ROW(A1:INDEX(A:A,today()-Attendance!G2)),"0000011"),ISNA(MATCH(WORKDAY.INTL(Attendance!G2,ROW(A1:INDEX(A:A,today()-Attendance!G2)),"0000011"),Attendance!G2:G,0))) 谢谢!
    • 只是为了再次提供样品表:Click here for Sample Sheet
    【解决方案2】:
    =filter(
       arrayformula(Attendance!G2+row(indirect("1:"&today()-Attendance!G2))),
       isna(match(
              arrayformula(Attendance!G2+row(indirect("1:"&today()-Attendance!G2))),
              Attendance!G2:G29,
              0
            ))
     )
    

    说明

    主要思想是“列出所有缺失的”形式上是从所有可能的日期集合中减去现有日期集合的结果。

    为了实现集合减法(补码),我们使用公式组合 FILTER + ISNA/MATCH。 FILTER 的第一个参数是我们要从中减去的集合, MATCH 的第二个参数是减去的集合。 ARRAYFORMULA 生成 2 个给定日期之间所有可能日期的列表。

    不幸的是,ARRAYFORMULA 的重复出现,但 Google 公式没有“let”关键字或等效关键字。如果有人知道如何避免它,我将不胜感激评论或更正答案。

    【讨论】:

    • 谢谢。它按预期工作。提供的解释有助于我理解公式。但是,下面的解决方案是我要解决的问题,因为它更容易理解。原因是,我在各种论坛上阅读了有关数组公式对处理能力的要求。我是这个东西的新手,如果我听起来像一个新手,我很抱歉。感谢帮助。干杯!
    • 当然。我同意 WORKDAY.INTL() 是比 ARRAYFORMULA 更合适的解决方案,尽管后者更通用,而且我不会太担心处理如此微不足道的数据量的能力。
    • 这是信息。我会在下一个要求时记住这一点。干杯!
    • @I'-'I 事实上,即使在删除所有 ARRAYFORMULA 之后,我的公式仍然有效!我不知道,这么简单地说,“FILTER 中的任何东西都好像已经在 ARRAYFORMULA 中一样”。它确实可以解释为什么我永远不能将两者结合起来进行循环内循环类型的计算。我一直在寻找 ARRAYFORMULA 的精确语义,但到目前为止还没有找到。你知道这种行为是否记录在某处吗?
    • @I'-'I 另外,我对 ARRAYFORMULA 重复的评论与 ARRAYFORMULA 函数本身无关。相反,我想做的是函数式编程风格的表达,就像这样:={let x=Attendance!G2+row(indirect("1:"&amp;today()-Attendance!G2) in filter(x, match(x, Attendance!G2:G, 0))}。但我想这是一个白日梦。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-09-27
    • 1970-01-01
    • 1970-01-01
    • 2021-09-14
    • 2019-04-23
    相关资源
    最近更新 更多