如何制作 Google Sheet(或 Excel)甘特图,其中某些工作日(不一定是周末)不是完整的工作日?

How can I make a Google Sheet (or Excel) Gantt chart where some of the weekdays (not necessarily on the weekend) are not full workdays?

我正在尝试制作一个 dally 动态甘特图,考虑到我的一些工作日不是完整的工作日。例如,如果星期五和星期六都是半工作日,而星期日是非工作日,则从星期一开始的三个完整工作日的任务将在星期三完成。但如果同一个任务在星期五开始,它将在连续的星期二完成。这样同一个三个完整工作日的任务可以在甘特图上填满三到五天。

  1. 如何在 Google Sheet(或 Excel)甘特图上使它动态工作?我可以制作一个函数来接收任务的开始日期,考虑到我的所有限制条件(例如,星期五是半天),并计算甘特图中应该填写多少天吗?
  2. 是否可以使用更高的分辨率,如 1/3 工作日的子单位?

附上:

这是我想出的一个公式,它将为您提供从开始日期开始并向右上升的累积“半天”单位。这使得创建条件格式以突出显示项目长度内的单元格变得简单。

=ARRAYFORMULA(IF(B4="",,MMULT(N(VLOOKUP(TEXT(F:,"dddd"),'day guide'!B:D,3,0)*(F:>=B4)),N(F:>=TRANSPOSE(F:)))))

我会把这个 sheet 无限期地留下来供其他人学习。

F2 中的公式:

=INDEX(TRANSPOSE(LEFT(TEXT(ROW(INDIRECT(1*(F1&"1/2021")&":"&
 EOMONTH(1*(F1&"1/2021"), ))), {"d", "ddd"}), {2, 1})))

D4 中的公式:

=QUERY(B4:B, "where B is not null format B 'dddd'")

E4 中的公式:

=INDEX(VALUE(F1&"1/2021")-1+TRANSPOSE(QUERY(TRANSPOSE(IFNA(IF(QUERY({
 QUERY(IF(N(IFNA(SPLIT(REPT(10, DAY(INDIRECT("B4:B"&MAX(ROW(B:B)*(B:B<>""))))-1), 0)*
 TRANSPOSE(ROW(
 INDIRECT("1:"&DAY(EOMONTH(F1&"1/2021", 0))))^0))=0)=0, 0, 
 TRANSPOSE(QUERY({D12:D18; D12:D18; D12:D18; D12:D18; D12:D18; D12:D18}, 
 "limit "&DAY(EOMONTH(F1&"1/2021", 0))&" 
  offset "&MATCH(TEXT(F1&"1/2021", "dddd"), C12:C18, 0)-1))),
 "select Col1+0"),
 QUERY(IF(N(IFNA(SPLIT(REPT(10, DAY(INDIRECT("B4:B"&MAX(ROW(B:B)*(B:B<>""))))-1), 0)*
 TRANSPOSE(ROW(
 INDIRECT("1:"&DAY(EOMONTH(F1&"1/2021", 0))))^0))=0)=0, 0, 
 TRANSPOSE(QUERY({D12:D18; D12:D18; D12:D18; D12:D18; D12:D18; D12:D18}, 
 "limit "&DAY(EOMONTH(F1&"1/2021", 0))&" 
  offset "&MATCH(TEXT(F1&"1/2021", "dddd"), C12:C18, 0)-1))),
 "select Col1+Col2"),
 QUERY(IF(N(IFNA(SPLIT(REPT(10, DAY(INDIRECT("B4:B"&MAX(ROW(B:B)*(B:B<>""))))-1), 0)*
 TRANSPOSE(ROW(
 INDIRECT("1:"&DAY(EOMONTH(F1&"1/2021", 0))))^0))=0)=0, 0, 
 TRANSPOSE(QUERY({D12:D18; D12:D18; D12:D18; D12:D18; D12:D18; D12:D18}, 
 "limit "&DAY(EOMONTH(F1&"1/2021", 0))&" 
  offset "&MATCH(TEXT(F1&"1/2021", "dddd"), C12:C18, 0)-1))),
 "select Col1+Col2+Col3"),
 QUERY(IF(N(IFNA(SPLIT(REPT(10, DAY(INDIRECT("B4:B"&MAX(ROW(B:B)*(B:B<>""))))-1), 0)*
 TRANSPOSE(ROW(
 INDIRECT("1:"&DAY(EOMONTH(F1&"1/2021", 0))))^0))=0)=0, 0, 
 TRANSPOSE(QUERY({D12:D18; D12:D18; D12:D18; D12:D18; D12:D18; D12:D18}, 
 "limit "&DAY(EOMONTH(F1&"1/2021", 0))&" 
  offset "&MATCH(TEXT(F1&"1/2021", "dddd"), C12:C18, 0)-1))),
 "select Col1+Col2+Col3+Col4"),
 QUERY(IF(N(IFNA(SPLIT(REPT(10, DAY(INDIRECT("B4:B"&MAX(ROW(B:B)*(B:B<>""))))-1), 0)*
 TRANSPOSE(ROW(
 INDIRECT("1:"&DAY(EOMONTH(F1&"1/2021", 0))))^0))=0)=0, 0, 
 TRANSPOSE(QUERY({D12:D18; D12:D18; D12:D18; D12:D18; D12:D18; D12:D18}, 
 "limit "&DAY(EOMONTH(F1&"1/2021", 0))&" 
  offset "&MATCH(TEXT(F1&"1/2021", "dddd"), C12:C18, 0)-1))),
 "select Col1+Col2+Col3+Col4+Col5"),
 QUERY(IF(N(IFNA(SPLIT(REPT(10, DAY(INDIRECT("B4:B"&MAX(ROW(B:B)*(B:B<>""))))-1), 0)*
 TRANSPOSE(ROW(
 INDIRECT("1:"&DAY(EOMONTH(F1&"1/2021", 0))))^0))=0)=0, 0, 
 TRANSPOSE(QUERY({D12:D18; D12:D18; D12:D18; D12:D18; D12:D18; D12:D18}, 
 "limit "&DAY(EOMONTH(F1&"1/2021", 0))&" 
  offset "&MATCH(TEXT(F1&"1/2021", "dddd"), C12:C18, 0)-1))),
 "select Col1+Col2+Col3+Col4+Col5+Col6"), 
 QUERY(IF(N(IFNA(SPLIT(REPT(10, DAY(INDIRECT("B4:B"&MAX(ROW(B:B)*(B:B<>""))))-1), 0)*
 TRANSPOSE(ROW(
 INDIRECT("1:"&DAY(EOMONTH(F1&"1/2021", 0))))^0))=0)=0, 0, 
 TRANSPOSE(QUERY({D12:D18; D12:D18; D12:D18; D12:D18; D12:D18; D12:D18}, 
 "limit "&DAY(EOMONTH(F1&"1/2021", 0))&" 
  offset "&MATCH(TEXT(F1&"1/2021", "dddd"), C12:C18, 0)-1))),
 "select Col1+Col2+Col3+Col4+Col5+Col6+Col7"), 
 QUERY(IF(N(IFNA(SPLIT(REPT(10, DAY(INDIRECT("B4:B"&MAX(ROW(B:B)*(B:B<>""))))-1), 0)*
 TRANSPOSE(ROW(
 INDIRECT("1:"&DAY(EOMONTH(F1&"1/2021", 0))))^0))=0)=0, 0, 
 TRANSPOSE(QUERY({D12:D18; D12:D18; D12:D18; D12:D18; D12:D18; D12:D18}, 
 "limit "&DAY(EOMONTH(F1&"1/2021", 0))&" 
  offset "&MATCH(TEXT(F1&"1/2021", "dddd"), C12:C18, 0)-1))),
 "select "&TEXTJOIN("+", 1, "Col"&ROW(1:8))), 
 QUERY(IF(N(IFNA(SPLIT(REPT(10, DAY(INDIRECT("B4:B"&MAX(ROW(B:B)*(B:B<>""))))-1), 0)*
 TRANSPOSE(ROW(
 INDIRECT("1:"&DAY(EOMONTH(F1&"1/2021", 0))))^0))=0)=0, 0, 
 TRANSPOSE(QUERY({D12:D18; D12:D18; D12:D18; D12:D18; D12:D18; D12:D18}, 
 "limit "&DAY(EOMONTH(F1&"1/2021", 0))&" 
  offset "&MATCH(TEXT(F1&"1/2021", "dddd"), C12:C18, 0)-1))),
 "select "&TEXTJOIN("+", 1, "Col"&ROW(1:9))), 
 QUERY(IF(N(IFNA(SPLIT(REPT(10, DAY(INDIRECT("B4:B"&MAX(ROW(B:B)*(B:B<>""))))-1), 0)*
 TRANSPOSE(ROW(
 INDIRECT("1:"&DAY(EOMONTH(F1&"1/2021", 0))))^0))=0)=0, 0, 
 TRANSPOSE(QUERY({D12:D18; D12:D18; D12:D18; D12:D18; D12:D18; D12:D18}, 
 "limit "&DAY(EOMONTH(F1&"1/2021", 0))&" 
  offset "&MATCH(TEXT(F1&"1/2021", "dddd"), C12:C18, 0)-1))),
 "select "&TEXTJOIN("+", 1, "Col"&ROW(1:10))), 
 QUERY(IF(N(IFNA(SPLIT(REPT(10, DAY(INDIRECT("B4:B"&MAX(ROW(B:B)*(B:B<>""))))-1), 0)*
 TRANSPOSE(ROW(
 INDIRECT("1:"&DAY(EOMONTH(F1&"1/2021", 0))))^0))=0)=0, 0, 
 TRANSPOSE(QUERY({D12:D18; D12:D18; D12:D18; D12:D18; D12:D18; D12:D18}, 
 "limit "&DAY(EOMONTH(F1&"1/2021", 0))&" 
  offset "&MATCH(TEXT(F1&"1/2021", "dddd"), C12:C18, 0)-1))),
 "select "&TEXTJOIN("+", 1, "Col"&ROW(1:11))), 
 QUERY(IF(N(IFNA(SPLIT(REPT(10, DAY(INDIRECT("B4:B"&MAX(ROW(B:B)*(B:B<>""))))-1), 0)*
 TRANSPOSE(ROW(
 INDIRECT("1:"&DAY(EOMONTH(F1&"1/2021", 0))))^0))=0)=0, 0, 
 TRANSPOSE(QUERY({D12:D18; D12:D18; D12:D18; D12:D18; D12:D18; D12:D18}, 
 "limit "&DAY(EOMONTH(F1&"1/2021", 0))&" 
  offset "&MATCH(TEXT(F1&"1/2021", "dddd"), C12:C18, 0)-1))),
 "select "&TEXTJOIN("+", 1, "Col"&ROW(1:12))), 
 QUERY(IF(N(IFNA(SPLIT(REPT(10, DAY(INDIRECT("B4:B"&MAX(ROW(B:B)*(B:B<>""))))-1), 0)*
 TRANSPOSE(ROW(
 INDIRECT("1:"&DAY(EOMONTH(F1&"1/2021", 0))))^0))=0)=0, 0, 
 TRANSPOSE(QUERY({D12:D18; D12:D18; D12:D18; D12:D18; D12:D18; D12:D18}, 
 "limit "&DAY(EOMONTH(F1&"1/2021", 0))&" 
  offset "&MATCH(TEXT(F1&"1/2021", "dddd"), C12:C18, 0)-1))),
 "select "&TEXTJOIN("+", 1, "Col"&ROW(1:13))), 
 QUERY(IF(N(IFNA(SPLIT(REPT(10, DAY(INDIRECT("B4:B"&MAX(ROW(B:B)*(B:B<>""))))-1), 0)*
 TRANSPOSE(ROW(
 INDIRECT("1:"&DAY(EOMONTH(F1&"1/2021", 0))))^0))=0)=0, 0, 
 TRANSPOSE(QUERY({D12:D18; D12:D18; D12:D18; D12:D18; D12:D18; D12:D18}, 
 "limit "&DAY(EOMONTH(F1&"1/2021", 0))&" 
  offset "&MATCH(TEXT(F1&"1/2021", "dddd"), C12:C18, 0)-1))),
 "select "&TEXTJOIN("+", 1, "Col"&ROW(1:14))), 
 QUERY(IF(N(IFNA(SPLIT(REPT(10, DAY(INDIRECT("B4:B"&MAX(ROW(B:B)*(B:B<>""))))-1), 0)*
 TRANSPOSE(ROW(
 INDIRECT("1:"&DAY(EOMONTH(F1&"1/2021", 0))))^0))=0)=0, 0, 
 TRANSPOSE(QUERY({D12:D18; D12:D18; D12:D18; D12:D18; D12:D18; D12:D18}, 
 "limit "&DAY(EOMONTH(F1&"1/2021", 0))&" 
  offset "&MATCH(TEXT(F1&"1/2021", "dddd"), C12:C18, 0)-1))),
 "select "&TEXTJOIN("+", 1, "Col"&ROW(1:15))), 
 QUERY(IF(N(IFNA(SPLIT(REPT(10, DAY(INDIRECT("B4:B"&MAX(ROW(B:B)*(B:B<>""))))-1), 0)*
 TRANSPOSE(ROW(
 INDIRECT("1:"&DAY(EOMONTH(F1&"1/2021", 0))))^0))=0)=0, 0, 
 TRANSPOSE(QUERY({D12:D18; D12:D18; D12:D18; D12:D18; D12:D18; D12:D18}, 
 "limit "&DAY(EOMONTH(F1&"1/2021", 0))&" 
  offset "&MATCH(TEXT(F1&"1/2021", "dddd"), C12:C18, 0)-1))),
 "select "&TEXTJOIN("+", 1, "Col"&ROW(1:16))), 
 QUERY(IF(N(IFNA(SPLIT(REPT(10, DAY(INDIRECT("B4:B"&MAX(ROW(B:B)*(B:B<>""))))-1), 0)*
 TRANSPOSE(ROW(
 INDIRECT("1:"&DAY(EOMONTH(F1&"1/2021", 0))))^0))=0)=0, 0, 
 TRANSPOSE(QUERY({D12:D18; D12:D18; D12:D18; D12:D18; D12:D18; D12:D18}, 
 "limit "&DAY(EOMONTH(F1&"1/2021", 0))&" 
  offset "&MATCH(TEXT(F1&"1/2021", "dddd"), C12:C18, 0)-1))),
 "select "&TEXTJOIN("+", 1, "Col"&ROW(1:17))), 
 QUERY(IF(N(IFNA(SPLIT(REPT(10, DAY(INDIRECT("B4:B"&MAX(ROW(B:B)*(B:B<>""))))-1), 0)*
 TRANSPOSE(ROW(
 INDIRECT("1:"&DAY(EOMONTH(F1&"1/2021", 0))))^0))=0)=0, 0, 
 TRANSPOSE(QUERY({D12:D18; D12:D18; D12:D18; D12:D18; D12:D18; D12:D18}, 
 "limit "&DAY(EOMONTH(F1&"1/2021", 0))&" 
  offset "&MATCH(TEXT(F1&"1/2021", "dddd"), C12:C18, 0)-1))),
 "select "&TEXTJOIN("+", 1, "Col"&ROW(1:18))), 
 QUERY(IF(N(IFNA(SPLIT(REPT(10, DAY(INDIRECT("B4:B"&MAX(ROW(B:B)*(B:B<>""))))-1), 0)*
 TRANSPOSE(ROW(
 INDIRECT("1:"&DAY(EOMONTH(F1&"1/2021", 0))))^0))=0)=0, 0, 
 TRANSPOSE(QUERY({D12:D18; D12:D18; D12:D18; D12:D18; D12:D18; D12:D18}, 
 "limit "&DAY(EOMONTH(F1&"1/2021", 0))&" 
  offset "&MATCH(TEXT(F1&"1/2021", "dddd"), C12:C18, 0)-1))),
 "select "&TEXTJOIN("+", 1, "Col"&ROW(1:19))), 
 QUERY(IF(N(IFNA(SPLIT(REPT(10, DAY(INDIRECT("B4:B"&MAX(ROW(B:B)*(B:B<>""))))-1), 0)*
 TRANSPOSE(ROW(
 INDIRECT("1:"&DAY(EOMONTH(F1&"1/2021", 0))))^0))=0)=0, 0, 
 TRANSPOSE(QUERY({D12:D18; D12:D18; D12:D18; D12:D18; D12:D18; D12:D18}, 
 "limit "&DAY(EOMONTH(F1&"1/2021", 0))&" 
  offset "&MATCH(TEXT(F1&"1/2021", "dddd"), C12:C18, 0)-1))),
 "select "&TEXTJOIN("+", 1, "Col"&ROW(1:20))), 
 QUERY(IF(N(IFNA(SPLIT(REPT(10, DAY(INDIRECT("B4:B"&MAX(ROW(B:B)*(B:B<>""))))-1), 0)*
 TRANSPOSE(ROW(
 INDIRECT("1:"&DAY(EOMONTH(F1&"1/2021", 0))))^0))=0)=0, 0, 
 TRANSPOSE(QUERY({D12:D18; D12:D18; D12:D18; D12:D18; D12:D18; D12:D18}, 
 "limit "&DAY(EOMONTH(F1&"1/2021", 0))&" 
  offset "&MATCH(TEXT(F1&"1/2021", "dddd"), C12:C18, 0)-1))),
 "select "&TEXTJOIN("+", 1, "Col"&ROW(1:21))), 
 QUERY(IF(N(IFNA(SPLIT(REPT(10, DAY(INDIRECT("B4:B"&MAX(ROW(B:B)*(B:B<>""))))-1), 0)*
 TRANSPOSE(ROW(
 INDIRECT("1:"&DAY(EOMONTH(F1&"1/2021", 0))))^0))=0)=0, 0, 
 TRANSPOSE(QUERY({D12:D18; D12:D18; D12:D18; D12:D18; D12:D18; D12:D18}, 
 "limit "&DAY(EOMONTH(F1&"1/2021", 0))&" 
  offset "&MATCH(TEXT(F1&"1/2021", "dddd"), C12:C18, 0)-1))),
 "select "&TEXTJOIN("+", 1, "Col"&ROW(1:22))), 
 QUERY(IF(N(IFNA(SPLIT(REPT(10, DAY(INDIRECT("B4:B"&MAX(ROW(B:B)*(B:B<>""))))-1), 0)*
 TRANSPOSE(ROW(
 INDIRECT("1:"&DAY(EOMONTH(F1&"1/2021", 0))))^0))=0)=0, 0, 
 TRANSPOSE(QUERY({D12:D18; D12:D18; D12:D18; D12:D18; D12:D18; D12:D18}, 
 "limit "&DAY(EOMONTH(F1&"1/2021", 0))&" 
  offset "&MATCH(TEXT(F1&"1/2021", "dddd"), C12:C18, 0)-1))),
 "select "&TEXTJOIN("+", 1, "Col"&ROW(1:23))), 
 QUERY(IF(N(IFNA(SPLIT(REPT(10, DAY(INDIRECT("B4:B"&MAX(ROW(B:B)*(B:B<>""))))-1), 0)*
 TRANSPOSE(ROW(
 INDIRECT("1:"&DAY(EOMONTH(F1&"1/2021", 0))))^0))=0)=0, 0, 
 TRANSPOSE(QUERY({D12:D18; D12:D18; D12:D18; D12:D18; D12:D18; D12:D18}, 
 "limit "&DAY(EOMONTH(F1&"1/2021", 0))&" 
  offset "&MATCH(TEXT(F1&"1/2021", "dddd"), C12:C18, 0)-1))),
 "select "&TEXTJOIN("+", 1, "Col"&ROW(1:24))), 
 QUERY(IF(N(IFNA(SPLIT(REPT(10, DAY(INDIRECT("B4:B"&MAX(ROW(B:B)*(B:B<>""))))-1), 0)*
 TRANSPOSE(ROW(
 INDIRECT("1:"&DAY(EOMONTH(F1&"1/2021", 0))))^0))=0)=0, 0, 
 TRANSPOSE(QUERY({D12:D18; D12:D18; D12:D18; D12:D18; D12:D18; D12:D18}, 
 "limit "&DAY(EOMONTH(F1&"1/2021", 0))&" 
  offset "&MATCH(TEXT(F1&"1/2021", "dddd"), C12:C18, 0)-1))),
 "select "&TEXTJOIN("+", 1, "Col"&ROW(1:25))), 
 QUERY(IF(N(IFNA(SPLIT(REPT(10, DAY(INDIRECT("B4:B"&MAX(ROW(B:B)*(B:B<>""))))-1), 0)*
 TRANSPOSE(ROW(
 INDIRECT("1:"&DAY(EOMONTH(F1&"1/2021", 0))))^0))=0)=0, 0, 
 TRANSPOSE(QUERY({D12:D18; D12:D18; D12:D18; D12:D18; D12:D18; D12:D18}, 
 "limit "&DAY(EOMONTH(F1&"1/2021", 0))&" 
  offset "&MATCH(TEXT(F1&"1/2021", "dddd"), C12:C18, 0)-1))),
 "select "&TEXTJOIN("+", 1, "Col"&ROW(1:26))), 
 QUERY(IF(N(IFNA(SPLIT(REPT(10, DAY(INDIRECT("B4:B"&MAX(ROW(B:B)*(B:B<>""))))-1), 0)*
 TRANSPOSE(ROW(
 INDIRECT("1:"&DAY(EOMONTH(F1&"1/2021", 0))))^0))=0)=0, 0, 
 TRANSPOSE(QUERY({D12:D18; D12:D18; D12:D18; D12:D18; D12:D18; D12:D18}, 
 "limit "&DAY(EOMONTH(F1&"1/2021", 0))&" 
  offset "&MATCH(TEXT(F1&"1/2021", "dddd"), C12:C18, 0)-1))), 
 "select "&TEXTJOIN("+", 1, "Col"&ROW(1:27))), 
 QUERY(IF(N(IFNA(SPLIT(REPT(10, DAY(INDIRECT("B4:B"&MAX(ROW(B:B)*(B:B<>""))))-1), 0)*
 TRANSPOSE(ROW(
 INDIRECT("1:"&DAY(EOMONTH(F1&"1/2021", 0))))^0))=0)=0, 0, 
 TRANSPOSE(QUERY({D12:D18; D12:D18; D12:D18; D12:D18; D12:D18; D12:D18}, 
 "limit "&DAY(EOMONTH(F1&"1/2021", 0))&" 
  offset "&MATCH(TEXT(F1&"1/2021", "dddd"), C12:C18, 0)-1))), 
 "select "&TEXTJOIN("+", 1, "Col"&ROW(1:28))), 
 IF(DAY(EOMONTH(F1&"1/2021", 0))>=29, 
 QUERY(IF(N(IFNA(SPLIT(REPT(10, DAY(INDIRECT("B4:B"&MAX(ROW(B:B)*(B:B<>""))))-1), 0)*
 TRANSPOSE(ROW(
 INDIRECT("1:"&DAY(EOMONTH(F1&"1/2021", 0))))^0))=0)=0, 0, 
 TRANSPOSE(QUERY({D12:D18; D12:D18; D12:D18; D12:D18; D12:D18; D12:D18}, 
 "limit "&DAY(EOMONTH(F1&"1/2021", 0))&" 
  offset "&MATCH(TEXT(F1&"1/2021", "dddd"), C12:C18, 0)-1))), 
 "select "&TEXTJOIN("+", 1, "Col"&ROW(1:29))), 
 IFERROR(1/(0^ROW(INDIRECT("3:"&MAX(ROW(A:A)*(A:A<>""))))))), 
 IF(DAY(EOMONTH(F1&"1/2021", 0))>=30,  
 QUERY(IF(N(IFNA(SPLIT(REPT(10, DAY(INDIRECT("B4:B"&MAX(ROW(B:B)*(B:B<>""))))-1), 0)*
 TRANSPOSE(ROW(
 INDIRECT("1:"&DAY(EOMONTH(F1&"1/2021", 0))))^0))=0)=0, 0, 
 TRANSPOSE(QUERY({D12:D18; D12:D18; D12:D18; D12:D18; D12:D18; D12:D18}, 
 "limit "&DAY(EOMONTH(F1&"1/2021", 0))&" 
  offset "&MATCH(TEXT(F1&"1/2021", "dddd"), C12:C18, 0)-1))), 
 "select "&TEXTJOIN("+", 1, "Col"&ROW(1:30))), 
 IFERROR(1/(0^ROW(INDIRECT("3:"&MAX(ROW(A:A)*(A:A<>""))))))), 
 IF(DAY(EOMONTH(F1&"1/2021", 0))>=31, 
 QUERY(IF(N(IFNA(SPLIT(REPT(10, DAY(INDIRECT("B4:B"&MAX(ROW(B:B)*(B:B<>""))))-1), 0)*
 TRANSPOSE(ROW(
 INDIRECT("1:"&DAY(EOMONTH(F1&"1/2021", 0))))^0))=0)=0, 0, 
 TRANSPOSE(QUERY({D12:D18; D12:D18; D12:D18; D12:D18; D12:D18; D12:D18}, 
 "limit "&DAY(EOMONTH(F1&"1/2021", 0))&" 
  offset "&MATCH(TEXT(F1&"1/2021", "dddd"), C12:C18, 0)-1))), 
 "select "&TEXTJOIN("+", 1, "Col"&ROW(1:31))), 
 IFERROR(1/(0^ROW(INDIRECT("3:"&MAX(ROW(A:A)*(A:A<>"")))))))}, 
 "offset 1 ", 0)>C4:C,,F2:AJ2))*1), 
 "select "&TEXTJOIN(",", 1, 
 "max(Col"&ROW(INDIRECT("4:"&MAX(ROW(A:A)*(A:A<>""))))-ROW(A3)&")"))),, 2)

条件格式的自定义公式:

=($A4<>"")*(DAY($B4)<=(F*1))*(DAY($E4)>=(F*1))


spreadsheet demo

我想知道您是否可以在执行此操作时避免使用繁重的数组公式。是的,你可以 - 条件格式公式仍然是一个数组公式,但是当你使用一个相当简单的 sumproduct 在范围内移动时,自然地计算越来越多的值:

=and(F>=$B4,SUMPRODUCT(vlookup(text($F:F,"dddd"),indirect("'day guide'!$B:$D"),3,false)*($F:F>=$B4))<=$C4)

我的结束日期公式使用两个 countif 来计算所有天数和半天数,但它只是一个下拉公式:

=ArrayFormula(min(if((countifs(vlookup(text(F:AJ,"dddd"),'day guide'!$B:$D,3,false),1,column(F:AJ),"<="&column(F:AJ),F:AJ,">="&$B4)
+countifs(vlookup(text(F:AJ,"dddd"),'day guide'!$B:$D,3,false),2,column(F:AJ),"<="&column(F:AJ),F:AJ,">="&$B4)*2)>=C4,F:AJ,)))