【问题标题】:Google Sheets - night shift hours worked with Arrayformula, weekends hours worked with ArrayformulaGoogle 表格 - 夜班时间使用 Arrayformula,周末时间使用 Arrayformula
【发布时间】:2020-09-14 09:41:38
【问题描述】:

我有谷歌文档列表: https://docs.google.com/spreadsheets/d/1gB-t47BKusiwVM53lZi1dGjaDcscILP4yCMtEdtUTao/edit?usp=sharing

我从手机自动将短信发送到餐桌。我之前已经在那里问过,并得到了很大的帮助,如何解决一些问题,但不幸的是我又被另一个公式卡住了。

我有几个问题:

公式不能在单元格本身中,但必须在“Arrayformula”中因为否则自动短信在收到时会将公式向下推,因此我到达那里advice of this + Index and count function

所以现在我的问题: 我需要在 M 列中在夜间工作数小时。夜间工作开始于:22:00,结束于 06:00。下面是表格,下面是表格,我会放上我到目前为止的公式。

|    | D               | F              |       G      |      I     |   J               |   M        |    
|----+-----------------+----------------+--------------+------------+-------------------+------------+
| 1> | Start work date | Start of work  |End work date |End of work | Total hours worked| Night shift|
| 2> | 11.09.2020      | 16:00          | 12.09.2020   | 04:00      |                   |            |
| 3> | 10.09.2020      | 07:00          | 12.09.2020   | 07:00      |                   |            |

|    |       N            |  
|----+--------------------+
| 1> |Worked over weekend |
| 2> |                    |
| 3> |                    |

对于工作时间(J 栏)我有这个公式,但它的问题是它不会超过 24 小时。 J3 的总工作时间应为 48 小时。

=ARRAYFORMULA({"Hours worked";--(DATEVALUE(G2:INDEX(G:G,Counta(D:D)))+TIMEVALUE(I2:INDEX(I:I,Counta(I:I))))-(DATEVALUE(D2:INDEX(D:D,Counta(D:D)))+TIMEVALUE(F2:INDEX(F:F,COUNTA(F:F))))})

然后我有这个,但它不会正确计数(M 列)夜间时间应该是 22:00-06:00。

=(J2-(
 If(F2<I2;
  MAX(0;MIN(I2;TIMEVALUE("22:00"))-MAX(F2;TIMEVALUE("06:00")));
  MAX(0;TIMEVALUE("22:00")-F2)+MAX(0;I2-TIMEVALUE("06:00"))
 )
)*24)

M2 应该是 06:00。 M3 应该是 16

我不太确定细胞等的形成。它在上面的表格中链接。周末时间为周六至周日。我坚持如果有条件我会这样做,因为如果可能的话,我有几周的时间? N2 的周末时间应该是 4 小时。

如有任何反馈,我将非常高兴。

【问题讨论】:

  • 您的语言环境?在文件电子表格设置中?
  • 嗨 - 抱歉不明白。你是说语言?我已经改成美国了。我试图翻译的公式,希望是正确的。
  • 本地化。文件 > 电子表格设置 > 第一个位置:“丹麦”或“美国”。或者,如果您将其更改为美国,Edit 您的问题以正确提供日期。例如,11.09.2020 在美国不是有效日期,但在某些欧洲/俄罗斯国家/地区有效。或者,提供格式为 yyyy-mm-dd 的日期(普遍接受)
  • 样本表无法访问。
  • 您好,感谢您的回复。现在应该可以访问了:docs.google.com/spreadsheets/d/…

标签: google-apps-script google-sheets google-sheets-formula


【解决方案1】:

我认为您遇到的根本问题是您尝试使用文本而不是立即转换为 数字 以跟踪时间和日期。我在您的工作表上创建了一个名为 MK.help 的新选项卡,并将以下公式放入单元格 M1。

=ARRAYFORMULA({"night shift";IF(C2:C="";;IF((1-F2:F)*(I2:I<F2:F)>2/24;2/24*(I2:I<F2:F);(1-F2:F)*(I2:I<F2:F))+IF(I2:I*(I2:I<F2:F)>6/24;6/24*(I2:I<F2:F);I2:I*(I2:I<F2:F)))})

您会注意到,我还更改了您使用的所有其他公式,以从您的系统中提取时间和日期。你的公式太过分了,而且它们似乎依赖于大量文本,而不是数字操作。

【讨论】:

  • 哇,太棒了!对此感激不尽! :) 我现在唯一的问题是,当同一天晚上有工作时,它不会计算夜间时间。 M2 应该是 03:00,但它是 00:00。这是因为旧公式是错误的,但在上面已更正: ARRAYFORMULA(IFS(G2:G-D2:D>=1;IF(--F2:F>--"22:00";1-F2 :F;"2:00")+IF(--I2:I--"22:00";I2:I-"22:00";"00:00")+IF( --F2:F
  • 啊,你说得对。我忘了补充。我刚刚做了,应该会更好。
  • 谢谢,非常感谢! :) 我不需要星期几,这只是我用来使公式起作用的东西,但这肯定会更好。但是夜班——M2 应该工作 3 小时,M16 应该工作 4 小时,总是只有那些不超过午夜的人。我会尝试检查公式
  • 对不起!我一直希望能在工作表上抓住你,这样我就可以现场查看。修复(再次!)更好吗?
  • 啊,抱歉,不得不离开一段时间。太好了,再次感谢您!
【解决方案2】:

M1:

={"Night shift";ARRAY_CONSTRAIN(ARRAYFORMULA(IF(G2:G-D2:D>=1,IF(--F2:F>--"22:00",1-F2:F,"2:00")+IF(--I2:I<--"6:00",I2:I,"6:00")+(G2:G-D2:D-1)*"8:00")),COUNTA(D:D)-1,1)}

说明:

={"Night shift";                                             
    ARRAY_CONSTRAIN(                      //constrain output                   
    ARRAYFORMULA(                         //enforce array context                   
      IF(G2:G-D2:D>=1,                    //if end work date > start                   
        IF(--F2:F>--"22:00",1-F2:F,"2:00")//if start time >22, get hours left else 2 hours                   
        +IF(--I2:I<--"6:00",I2:I,"6:00")  //if end time < 6 use hours worked else cap it                   
        +(G2:G-D2:D-1)*"8:00"             //8 hours for full days                   
      )                                                      
    )                                                        
    ,COUNTA(D:D)-1,1)                     //constrain rows to count                    
}                                                            

注意事项:

  • INDEX/COUNTA 仍然是首选,但我使用 ARRAY_CONSTRAIN 来限制公式大小。
  • 您应该将结果列的格式设置为“持续时间”
  • 所有日期时间列都应格式化并识别为日期和时间

【讨论】:

  • 您好,谢谢您的回答!但是它不起作用:/我不知道是因为“持续时间”还是为什么不这样做。有没有机会检查这个在没有数组的情况下有效的公式,但我认为我在公式的流程上做错了,但应该也可以工作并且它正在做我需要的事情:
  • @Themaster =ARRAYFORMULA({"星期几";(J2:INDEX(J:J;COUNTA(J:J)))-(IF(F2:INDEX(F:F;COUNTA (F:F)))
  • 我尝试制作 Arrayformula 的原始公式并且正在工作: =(J2-( IF(F2
  • @PatrikGremlica 解释不起作用。你说它不起作用是什么意思?有任何错误信息吗?我的公式对我来说很好。由于使用了max/min,因此您的公式不能在 arrayformula 中使用,它不支持每行操作
  • 也许我不明白这个问题,但是如果开始日和结束日相同,不应该检查工作时间吗?这就是我对此的看法:ARRAYFORMULA(IFS(G2:G-D2:D&gt;=1;IF(--F2:F&gt;--"22:00";1-F2:F;"2:00")+IF(--I2:I&lt;--"6:00";I2:I;"6:00")+(G2:G-D2:D-1)*"8:00";G2:G-D2:D=0;IF(--I2:I&gt;--"22:00";I2:I-"22:00";"00:00")+IF(--F2:F&lt;--"6:00";"6:00"-F2:F;"00:00")))
猜你喜欢
  • 2023-03-07
  • 2021-02-27
  • 2021-08-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-11-28
  • 1970-01-01
相关资源
最近更新 更多