自动将签入/签出事件日志转换为时间表

时间:2017-01-17 11:19:24

标签: google-sheets

  

更新:某些上下文:由IFTTT脚本自动提供的日志包含在工厂中工作的员工的所有签入和签出。我需要建立一份报告,每天都有第一次办理登机手续,以及每天最后一次退房(员工可能会退房吃午饭,但回来后只有第一次办理登机手续,最后一次办理退房手续计数)。

     

我目前的解决方案是计算"首次登记或上次结账?"布尔,然后将此日志提供到数据透视表中,以便报告过滤掉重复条目

我的电子表格会在D&列中插入数据。 E由第三方应用程序(IFTTT或谷歌表单),我想使用arrayformula自动计算一列作为来自这些应用程序的数据。

(D)Date             (E)Time Calc
January 6, Friday   15:06   TRUE
January 6, Friday   15:15   TRUE
January 9, Monday   8:36    TRUE
January 9, Monday   10:04   FALSE
January 9, Monday   10:37   FALSE
January 9, Monday   15:51   TRUE

Calc的公式是

=or(MIN(filter(E:E,D:D=D2,B:B=B2))=E2,MAX(filter(E:E,D:D=D2,B:B=B2))=E2)

如何将此公式转换为数组公式?从我的实验来看,似乎ArrayFormula与Filter不能很好地混合。感谢帮助!

2 个答案:

答案 0 :(得分:1)

因此,目标是为每个日期确定E列中的值是该日期的最高值还是最低值。我认为这是一个太多的逻辑,无法打包成一个公式,但可以用两个数组公式表示。第一个创建两个辅助列:

=arrayformula(vlookup(filter(D:D, len(D:D)), query(D:E, "select D, min(E), max(E) group by D", 1), {2, 3}))

这本身就是两个公式的组合:内部query获得D中每个日期的最小值和最大值E;然后vlookup将这些最小 - 最大值与原始表的行对齐。由len(D:D)过滤是出于性能原因,以避免查找大量空单元。

假设第一个公式是G1;然后它形成了列G和H,这导致E1

=arrayformula(not((E:E > G:G) * (E:E < H:H)))

请注意,andor不是数组形式友好的,但可以用*和+代替,这会导致布尔值被隐式转换为0-1。 not函数是数组友好的,这里部分用于从整数中获取布尔值。

答案 1 :(得分:1)

受到@zaq的启发,我通过重新设计电子表格解决了问题,并使用以下公式得到了解决方案:

=query(query(Sheet1!B:E, "select D, min(E), max(E) group by D pivot C,B ", 1),"select Col1, Col3, Col10,Col4,Col11")

此公式将员工登记和结账日志转换为汇总的&#34;工作时间&#34;表格,包含每天和每位员工的第一次登记入住和最后一次退房。