Google sheets 如何对已经很复杂的数组进行排序?

Google sheets 如何对已经很复杂的数组进行排序?,google-sheets,google-sheets-formula,array-formulas,google-sheets-query,gs-vlookup,Google Sheets,Google Sheets Formula,Array Formulas,Google Sheets Query,Gs Vlookup,这种类型的问题在这里已经被问过很多次了(我知道),我试图将半打答案转换成我的特定公式,但没有成功()。我想我不知道如何或在何处将其应用到我已经相当复杂的公式中(该公式将一个多行的开放时间文本块解析为一周中每一天的单一开始/结束时间格式(以及辅助时间,如果有的话)。我所有的尝试要么都不起作用,要么第一行的计算结果在整个列中重复 我已经备份了我的所有尝试,并将在整个列(数千行)中分享我希望最终成为“ArrayFor公式”的基本公式 这是迄今为止的基本公式: =if(isblank($A3:$A),

这种类型的问题在这里已经被问过很多次了(我知道),我试图将半打答案转换成我的特定公式,但没有成功()。我想我不知道如何或在何处将其应用到我已经相当复杂的公式中(该公式将一个多行的开放时间文本块解析为一周中每一天的单一开始/结束时间格式(以及辅助时间,如果有的话)。我所有的尝试要么都不起作用,要么第一行的计算结果在整个列中重复

我已经备份了我的所有尝试,并将在整个列(数千行)中分享我希望最终成为“ArrayFor公式”的基本公式

这是迄今为止的基本公式:

=if(isblank($A3:$A),,iferror(
  regexreplace(
    concatenate(
      arrayformula(
        text(
          split(
            INDEX(
              REGEXEXTRACT(
                regexreplace($A3:$A,"–","-"),
                "(\s?" & B$1 & ":\s)((\d?\d:\d\d\s[AMP]*\s?\W\s\d?\d:\d\d\s[AMP]{2})|(Closed)|(Open\s24\shours))"
              ),1,2 
            ),"-",true,true
          ),"HH:MM-"
        )
      )
    ),"(\d\d:\d\d\-\d\d:\d\d)\-","$1"
  ),
))

提前感谢你的帮助

编辑:我被要求澄清该公式的作用。该公式将包含周一至周日营业时间的文本块解析为机器可读格式(我将导入数据库)。如果该业务有时间块(就像一家餐厅开张吃午饭,休息一下,然后再重新开张吃晚饭一样),隔壁牢房里的配方也是原因之一。

试试:

=ARRAYFORMULA(IFERROR(HLOOKUP(B2:O2, QUERY(SPLIT(FLATTEN(IF(IFERROR(
 SPLIT(INDEX(SPLIT(FLATTEN(SPLIT(TEXTJOIN(CHAR(10), 1, A3:A), CHAR(10))), ": ", ),,2), ",;"))<>"", 
 COUNTIFS(
 INDEX(SPLIT(FLATTEN(SPLIT(TEXTJOIN(CHAR(10), 1, A3:A), CHAR(10))), ": ", ),,1), 
 INDEX(SPLIT(FLATTEN(SPLIT(TEXTJOIN(CHAR(10), 1, A3:A), CHAR(10))), ": ", ),,1), 
      ROW(INDIRECT("A1:A"&COUNTA(SPLIT(TEXTJOIN(CHAR(10), 1, A3:A), CHAR(10))))),
 "<="&ROW(INDIRECT("A1:A"&COUNTA(SPLIT(TEXTJOIN(CHAR(10), 1, A3:A), CHAR(10))))))&"♣"&LOWER(
  LEFT(INDEX(SPLIT(FLATTEN(SPLIT(TEXTJOIN(CHAR(10), 1, A3:A), CHAR(10))), ": ", ),,1), 3))&COLUMN(A:B)&"♣"&
 SUBSTITUTE(SUBSTITUTE({TRANSPOSE(QUERY(TRANSPOSE(TEXT(SPLIT(INDEX(SPLIT(INDEX(
 SPLIT(FLATTEN(SPLIT(TEXTJOIN(CHAR(10), 1, A3:A), CHAR(10))), ": ", ),,2), ",;"),,1), "–"),  "hh:mm")),,9^9)),
 TRANSPOSE(QUERY(TRANSPOSE(TEXT(IFERROR(SPLIT(INDEX(SPLIT(INDEX(
 SPLIT(FLATTEN(SPLIT(TEXTJOIN(CHAR(10), 1, A3:A), CHAR(10))), ": ", ),,2), ",;"),,2), "–")), "hh:mm")),,9^9))}, 
 "00:00 00:00", ), " ", "-"), 
 COUNTIFS(
 INDEX(SPLIT(FLATTEN(SPLIT(TEXTJOIN(CHAR(10), 1, A3:A), CHAR(10))), ": ", ),,1), 
 INDEX(SPLIT(FLATTEN(SPLIT(TEXTJOIN(CHAR(10), 1, A3:A), CHAR(10))), ": ", ),,1), 
      ROW(INDIRECT("A1:A"&COUNTA(SPLIT(TEXTJOIN(CHAR(10), 1, A3:A), CHAR(10))))),
 "<="&ROW(INDIRECT("A1:A"&COUNTA(SPLIT(TEXTJOIN(CHAR(10), 1, A3:A), CHAR(10))))))&"♣"&LOWER(
  LEFT(INDEX(SPLIT(FLATTEN(SPLIT(TEXTJOIN(CHAR(10), 1, A3:A), CHAR(10))), ": ", ),,1), 3))&COLUMN(A:B))), "♣"), 
 "select max(Col3) group by Col1 pivot Col2"), ROW(INDIRECT("A2:A"&COUNTA(A3:A)+ROW(A3)-1)), 0)))
=数组公式(
拆分(索引)(拆分(扁平化)(拆分(TEXTJOIN(CHAR(10),1,A3:A),CHAR(10)),“:”,),,2),“,;”,
COUNTIFS(
索引(拆分(展平)(拆分(TEXTJOIN(CHAR(10),1,A3:A),CHAR(10)),“:”,),,1),
索引(拆分(展平)(拆分(TEXTJOIN(CHAR(10),1,A3:A),CHAR(10)),“:”,),,1),
行(间接(“A1:A”)和COUNTA(拆分(TEXTJOIN(CHAR(10)、1、A3:A)、CHAR(10()))),

“这里有另一个建议,它更短,效果更好

这是一个数组公式,它将填充一整行。然后您只需将其沿B列向下拖动即可。我已将其放置在单元格B4中名为“Erik Help”的新工作表中:

=ArrayFormula(IF(A4="","",IF(B$3:$3="","",IFERROR(TRIM(SUBSTITUTE(" "&VLOOKUP(LEFT(B$3:$3,3)&"*",{TRIM(QUERY(SPLIT(FLATTEN(SPLIT(A4,";")),": ",0),"Select Col1")),TEXT(TRIM(SPLIT(QUERY(SPLIT(FLATTEN(SPLIT(A4,";")),": ",0),"Select Col2"),"–,",1)),"hh:mm")},IF(VALUE(RIGHT(B$3:$3,1))=1,2,4),FALSE)&"-"&VLOOKUP(LEFT(B$3:$3,3)&"*",{TRIM(QUERY(SPLIT(FLATTEN(SPLIT(A4,";")),": ",0),"Select Col1")),TEXT(TRIM(SPLIT(QUERY(SPLIT(FLATTEN(SPLIT(A4,";")),": ",0),"Select Col2"),"–,",1)),"hh:mm")},IF(VALUE(RIGHT(B$3:$3,1))=1,3,5),FALSE)," -",""))))))
…然后我把它拖到B5和B6


注意:flatte仍然是一个非官方的Google函数,因此请理解使用它。

根据您添加的注释,我添加了另一个名为“Erik Help 2”的表单。您将发现新的数组公式位于单元格B3(青色)。它填充整个行和列网格,包括子标题(例如mon1、mon2等)从这一单元:

=ArrayFormula({IF(B$2:O$2<>"",LOWER(LEFT(B$2:O$2,3))&"1",LOWER(LEFT(A$2:N$2,3))&2);IF(TRIM($A4:A)="","",IF(B$2:O$2<>"",
TEXT(TRIM(MID(TRIM($A4:A),FIND(":",TRIM($A4:A),FIND(B$2:O$2,TRIM($A4:A)))+1,9)),"hh:mm")&"-"&TEXT(TRIM(SUBSTITUTE(SUBSTITUTE(MID(TRIM($A4:A),FIND(":",TRIM($A4:A),FIND(B$2:O$2,TRIM($A4:A)))+12,9),",",""),";","")),"hh:mm"),
IF(FIND(";",TRIM($A4:A),FIND(A$2:N$2,TRIM($A4:A)))-FIND(":",TRIM($A4:A),FIND(A$2:N$2,TRIM($A4:A)))>25,
TEXT(TRIM(MID(TRIM($A4:A),FIND(",",TRIM($A4:$A),FIND(A$2:N$2,TRIM($A4:A)))+1,9)),"hh:mm")&"-"&TEXT(TRIM(SUBSTITUTE(MID(TRIM($A4:A),FIND(",",TRIM($A4:$A),FIND(A$2:N$2,TRIM($A4:A)))+12,9),";","")),"hh:mm"),"")))})
=ArrayFormula({IF(B$2:O$2',LOWER(LEFT(B$2:O$2,3))&1',LOWER(LEFT(A$2:N$2,3))&2);IF(TRIM($A4:A)=“”,“”,IF(B$2:O$2)”,
文本(TRIM(中间(TRIM($A4:A)、FIND(“:”、TRIM($A4:A)、FIND(B$2:O$2、TRIM($A4:A))+1,9)、“hh:mm”)和“-”文本(TRIM(替换)(替换)(中间(TRIM($A4:A)、FIND(“:”、TRIM($A4:A)、FIND(B$2:O$2、TRIM($A4:A)))+12,9)、“、”、“、”、”、“、”、”、“)、”)、“hh:mm”),
如果(FIND(“;”),TRIM($A4:A),FIND(A$2:N$2,TRIM($A4:A))-FIND(“:”,TRIM($A4:A),FIND(A$2:N$2,TRIM($A4:A))>25,
文本(TRIM(MID(TRIM($A4:A)、FIND(“,”、TRIM($A4:$A)、FIND(A$2:N$2、TRIM($A4:A))+1,9)、“hh:mm”)和“-”文本(TRIM(替换(MID(TRIM($A4:A)、FIND(“,”、TRIM($A4:$A)、FIND(A$2:N$2、TRIM($A4:A))+12,9)、“;”、“、”、”)、“、”)、“)、”)、“)、“)、”)、“)、”)、“)))))
你会想仔细检查一下,以获得准确的结果,但我觉得这是对的

请记住,此复杂公式依赖于将当前结构保留在A列中。即:

1.)平日用冒号和空格表示,后跟冒号和空格

2.)同一天的两个句点用逗号分隔

3.)每个工作日的条目都以分号结尾


如果您更改此设置,公式将不起作用,因为它将无法找到所需的标记。

我正在度假,但我将添加一个澄清问题,可能有助于其他人帮助您。您的结果意味着什么?我快速查看了您的工作表,“17:00-21:00”“没有明显的意义。我建议你在你的帖子中明确这些结果(如mon1、mon2等)的含义。它们是时间(24小时格式)。星期一17:00到21:00=下午5点到9点(它所在的列)。14列(mon1到sun2)中的每一列都是最左边列的解析结果(这是一整周的所有时间段)谢谢,但我需要一个能自动填充一列的公式。我不介意稍微更改顶行中的每个公式(一周中的每一天)。我希望能够锁定顶行(我所有的数组公式都在那里)。数据输入人员不知道如何拖动公式和/或在添加新行时忘记这样做。我正在尝试创建一个用户无错误的解决方案。哇。我没想到会得到一个填充列和行的公式。这太疯狂了。我甚至不打算试着去理解这一点……但谢谢。我刚刚意识到我当我创建示例电子表格时,我已经准备好了。从JSON文件导入的源数据在最后一行(星期一)没有尾随“;”.我需要更改哪一行才能使公式在没有尾随分号的情况下运行?编辑:事实上,我不认为缺少尾随分号是问题所在。我只是无法使公式在不同的工作表上运行。我非常感谢您的帮助。但是…如果有多个空行,公式将开始崩溃。Unfo当然,我的源数据有许多空白的小时数行(并非所有的营业时间都是已知的)。
=ArrayFormula(IF(A4="","",IF(B$3:$3="","",IFERROR(TRIM(SUBSTITUTE(" "&VLOOKUP(LEFT(B$3:$3,3)&"*",{TRIM(QUERY(SPLIT(FLATTEN(SPLIT(A4,";")),": ",0),"Select Col1")),TEXT(TRIM(SPLIT(QUERY(SPLIT(FLATTEN(SPLIT(A4,";")),": ",0),"Select Col2"),"–,",1)),"hh:mm")},IF(VALUE(RIGHT(B$3:$3,1))=1,2,4),FALSE)&"-"&VLOOKUP(LEFT(B$3:$3,3)&"*",{TRIM(QUERY(SPLIT(FLATTEN(SPLIT(A4,";")),": ",0),"Select Col1")),TEXT(TRIM(SPLIT(QUERY(SPLIT(FLATTEN(SPLIT(A4,";")),": ",0),"Select Col2"),"–,",1)),"hh:mm")},IF(VALUE(RIGHT(B$3:$3,1))=1,3,5),FALSE)," -",""))))))
=ArrayFormula({IF(B$2:O$2<>"",LOWER(LEFT(B$2:O$2,3))&"1",LOWER(LEFT(A$2:N$2,3))&2);IF(TRIM($A4:A)="","",IF(B$2:O$2<>"",
TEXT(TRIM(MID(TRIM($A4:A),FIND(":",TRIM($A4:A),FIND(B$2:O$2,TRIM($A4:A)))+1,9)),"hh:mm")&"-"&TEXT(TRIM(SUBSTITUTE(SUBSTITUTE(MID(TRIM($A4:A),FIND(":",TRIM($A4:A),FIND(B$2:O$2,TRIM($A4:A)))+12,9),",",""),";","")),"hh:mm"),
IF(FIND(";",TRIM($A4:A),FIND(A$2:N$2,TRIM($A4:A)))-FIND(":",TRIM($A4:A),FIND(A$2:N$2,TRIM($A4:A)))>25,
TEXT(TRIM(MID(TRIM($A4:A),FIND(",",TRIM($A4:$A),FIND(A$2:N$2,TRIM($A4:A)))+1,9)),"hh:mm")&"-"&TEXT(TRIM(SUBSTITUTE(MID(TRIM($A4:A),FIND(",",TRIM($A4:$A),FIND(A$2:N$2,TRIM($A4:A)))+12,9),";","")),"hh:mm"),"")))})