如何使用数组公式在 Google 工作表中创建周历 sheet?
How to create a week calendar sheet in Google Sheets using Array Formulas?
我有一个“数据库”sheet,其中包含条目,日期为周数:
NAME | ACTION | WEEK
------------------------
carrot | harvest | 48
carrot | wash | 48
garlic | plant | 49
(为方便起见,将列设置为命名范围。)
我想在第二个 sheet 上自动生成每周行动日历,如下所示:
(A) || (B) | (C) | (D) | (E)
-----------------------------------------
NAME / WK || 47 | 48 | 49 | 50 | (1)
=========================================
carrot || | harvest | | | (2)
|| | wash | | |
-----------------------------------------
garlic || | | plant | | (3)
如果我要使用手动插值,我会在上面示例中的值单元格 (B2:E3) 中放入这样的公式:
=IFNA(JOIN(CHAR(10), FILTER(ACTIONS, WEEK=B, NAME=$A2)), "")
(这个特定的公式将放在单元格 B2 中。)
但是,我不想在此日历中使用手动插值:当我在数据库 sheet 中添加、更改或删除行时,日历 sheet 应该自动更新,无需我更改那里有什么。
有没有办法通过将单个公式放入(比如)B2 单元格而不是手动填充 B2:E3 范围内的每个单元格来做到这一点? (假设我已经自动填充 A:A 和 1:1,但如果需要可以将其移入该公式。)
尝试:
=ARRAYFORMULA(QUERY(TRIM(SPLIT(FLATTEN(QUERY(TRANSPOSE(QUERY(QUERY(
{A2:A&"♦", B2:B, "♦"&C2:C, CHAR(10)&B2:B},
"select Col1,max(Col4),Col3
where Col2 is not null
group by Col1,Col3
pivot Col2"), "offset 1", 0)),,9^9)), "♦")),
"select Col1,max(Col2)
group by Col1
pivot Col3
label Col1'NAME / WK'"))
好吧,我花了更长的时间,而且我有一个更丑陋的公式,我现在甚至不会尝试优化,但如果有人想考虑一种不同的方法来做,与 player0 的解决方案相比,这里又是一个公式:
=ArrayFormula(query(
{trim(split(transpose(query(
{ query( query({A2:A & "~" & C2:C & "~", "♦" & B2:B},
"select max(Col2) where Col1<>'~~' group by Col2 pivot Col1",0),"limit 0",1);
substitute(regexreplace(trim(
query(
query(query({A2:A & "~" & C2:C & "~", "♦" & B2:B},
"select max(Col2) where Col1<>'~~' group by Col2 pivot Col1",0),"offset 1",0),,99^99)
), "^♦","" ),"♦",char(10))
},,99^99)),"~",1,0))
},"select Col1, max(Col3) group by Col1 pivot Col2",0))
也许不使用 FLATTEN
是造成设计复杂的一个因素...
我有一个“数据库”sheet,其中包含条目,日期为周数:
NAME | ACTION | WEEK
------------------------
carrot | harvest | 48
carrot | wash | 48
garlic | plant | 49
(为方便起见,将列设置为命名范围。)
我想在第二个 sheet 上自动生成每周行动日历,如下所示:
(A) || (B) | (C) | (D) | (E)
-----------------------------------------
NAME / WK || 47 | 48 | 49 | 50 | (1)
=========================================
carrot || | harvest | | | (2)
|| | wash | | |
-----------------------------------------
garlic || | | plant | | (3)
如果我要使用手动插值,我会在上面示例中的值单元格 (B2:E3) 中放入这样的公式:
=IFNA(JOIN(CHAR(10), FILTER(ACTIONS, WEEK=B, NAME=$A2)), "")
(这个特定的公式将放在单元格 B2 中。)
但是,我不想在此日历中使用手动插值:当我在数据库 sheet 中添加、更改或删除行时,日历 sheet 应该自动更新,无需我更改那里有什么。
有没有办法通过将单个公式放入(比如)B2 单元格而不是手动填充 B2:E3 范围内的每个单元格来做到这一点? (假设我已经自动填充 A:A 和 1:1,但如果需要可以将其移入该公式。)
尝试:
=ARRAYFORMULA(QUERY(TRIM(SPLIT(FLATTEN(QUERY(TRANSPOSE(QUERY(QUERY(
{A2:A&"♦", B2:B, "♦"&C2:C, CHAR(10)&B2:B},
"select Col1,max(Col4),Col3
where Col2 is not null
group by Col1,Col3
pivot Col2"), "offset 1", 0)),,9^9)), "♦")),
"select Col1,max(Col2)
group by Col1
pivot Col3
label Col1'NAME / WK'"))
好吧,我花了更长的时间,而且我有一个更丑陋的公式,我现在甚至不会尝试优化,但如果有人想考虑一种不同的方法来做,与 player0 的解决方案相比,这里又是一个公式:
=ArrayFormula(query(
{trim(split(transpose(query(
{ query( query({A2:A & "~" & C2:C & "~", "♦" & B2:B},
"select max(Col2) where Col1<>'~~' group by Col2 pivot Col1",0),"limit 0",1);
substitute(regexreplace(trim(
query(
query(query({A2:A & "~" & C2:C & "~", "♦" & B2:B},
"select max(Col2) where Col1<>'~~' group by Col2 pivot Col1",0),"offset 1",0),,99^99)
), "^♦","" ),"♦",char(10))
},,99^99)),"~",1,0))
},"select Col1, max(Col3) group by Col1 pivot Col2",0))
也许不使用 FLATTEN
是造成设计复杂的一个因素...