我在我的组织中运行上下班打卡系统,目前我们使用自定义函数来根据人们的打卡次数来确定人们的工作总时间。
例如,如果用户一天的条目是:
11 AM - 12PM, 1 PM-2 PM
我编写的自定义函数将输出:
2
但是,我们在使用自定义函数时遇到了一些问题(例如,在进行复制时,代码并不总是在 Google Sheets 之间复制,并且自定义函数有时会随机停止工作)。这些通常可以通过人为干预来解决,但这需要时间和金钱,我们有 1500 多名兼职员工,他们的时间在 20 多张工作表上得到批准,希望按时获得报酬。
因此,我一直在研究一个非自定义函数来对单个单元格中的时间集进行求和。
对一组时间求和是相当简单的:
11 AM - 12 PM
使用公式
minus(index(split($A2,"-"),1,2),index(split($A2,"-"),1,1))*24
我们得到
1
。
但是,我一生都无法弄清楚如何在不多次显式键入该函数的情况下对多组时间进行求和。我的直觉是该解决方案将使用 ARRAYFORMULA,但到目前为止我只能让它对 first 组时间求和:
11AM - 12PM, 1 PM - 2 PM
公式:
arrayformula(sum(minus(index(split(split($A5,","),"-"),1,2),index(split(split($A5,","),"-"),1,1))*24))
结果:
1
由于电子表格的设置方式,我们无法将时间拆分为多个单元格作为中间步骤。即使我们可以,理论上,一名员工也可以拥有无限组时间(比如 5 组是一个现实的理论上限,但仍然......我们不希望有 4 个几乎从未使用过的额外列)。
这里是一个仅供查看 Google 表格,其中包含一些示例。您可以随意制作副本并随心所欲地使用您的副本。
https://docs.google.com/spreadsheets/d/1gVZ09OT_PMSCWocIYW9FM9QfEmLVUI1-LWu1b8HsOsQ/
这适用于此可编辑副本...
=MAP(A1:A,LAMBDA(val,IF(val=A1,"Ending Value",IF(val="",,LET(times,IF(REGEXMATCH(val,":"),SPLIT(val,","),SPLIT(val,";")),REDUCE(0,times,LAMBDA(a,c,a+IFERROR(SUMPRODUCT(SPLIT(c,"-"),{-24,24}),SUMPRODUCT(SPLIT(c,","),{-1,1})))))))))