问题描述
这种问题在这里已经问过很多次了(我知道),并且我试图将六个答案转化为我的特定公式而没有成功(like the query smush header trick)。我想我不知道如何或在何处将其实施到我已经非常复杂的公式中(该公式将一周中的每一天(如果是次要时间,则将多行营业时间文本块解析为单一的开始/结束时间格式)我的所有尝试都无效,或者第一行的计算结果在整列中重复进行。
我已经支持了所有尝试,并且将共享我希望最终在整个列(数千行)中进行“数组公式化”的基本公式。
这是到目前为止的基本公式:
=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),INDEX(SPLIT(FLATTEN(SPLIT(TEXTJOIN(CHAR(10),ROW(INDIRECT("A1:A"&COUNTA(SPLIT(TEXTJOIN(CHAR(10),CHAR(10))))),"<="&ROW(INDIRECT("A1:A"&COUNTA(SPLIT(TEXTJOIN(CHAR(10),CHAR(10))))))&"♣"&LOWER(
LEFT(INDEX(SPLIT(FLATTEN(SPLIT(TEXTJOIN(CHAR(10),3))&COLUMN(A:B)&"♣"&
SUBSTITUTE(SUBSTITUTE({TRANSPOSE(QUERY(TRANSPOSE(TEXT(SPLIT(INDEX(SPLIT(INDEX(
SPLIT(FLATTEN(SPLIT(TEXTJOIN(CHAR(10),;"),"–"),"hh:mm")),9^9)),TRANSPOSE(QUERY(TRANSPOSE(TEXT(IFERROR(SPLIT(INDEX(SPLIT(INDEX(
SPLIT(FLATTEN(SPLIT(TEXTJOIN(CHAR(10),"–")),9^9))},"00:00 00:00"," ","-"),3))&COLUMN(A:B))),"♣"),"select max(Col3) group by Col1 pivot Col2"),ROW(INDIRECT("A2:A"&COUNTA(A3:A)+ROW(A3)-1)),0)))
更新:
=ARRAYFORMULA(IFERROR(HLOOKUP(B2:O2,IFNA(VLOOKUP({""; ROW(A3:A)},LOWER(LEFT(INDEX(SPLIT(FLATTEN(SPLIT(TEXTJOIN(CHAR(10),IF(A3:A="",REGEXREPLACE(A3:A,"^|(\n)","$1"&ROW(A3:A)&"♣"))),5))&COLUMN(A:B)&"♣"&
SUBSTITUTE(SUBSTITUTE(SUBSTITUTE({TRANSPOSE(QUERY(TRANSPOSE(TEXT(SPLIT(INDEX(SPLIT(INDEX(
SPLIT(FLATTEN(SPLIT(TEXTJOIN(CHAR(10),"Closed 00:00","Closed"),5))&COLUMN(A:B))),"select Col1,max(Col3) group by Col1 pivot Col2"),COLUMN(B:O),0)),0)))
spreadsheet demo
FIX:
=ARRAYFORMULA(IFERROR(HLOOKUP(B2:O2,LOWER(REGEXEXTRACT(INDEX(SPLIT(FLATTEN(SPLIT(TEXTJOIN(CHAR(10),"\d+♣..."))&COLUMN(A:B)&"♣"&
SUBSTITUTE(SUBSTITUTE(SUBSTITUTE({TRANSPOSE(QUERY(TRANSPOSE(TEXT(SPLIT(INDEX(SPLIT(INDEX(
SPLIT(FLATTEN(SPLIT(TEXTJOIN(CHAR(10),"\d+♣..."))&COLUMN(A:B))),ROW(INDIRECT("A2:A"&MAX(IF(A:A="",ROW(A:A))))),0)))
,
这是另一个建议,它较短,可以完成更多的工作。
这是一个数组公式,它将填充完整的行。然后,您只需将其向下拖动到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,"Select Col2"),"–,1)),"hh:mm")},IF(VALUE(RIGHT(B$3:$3,1))=1,2,4),FALSE)&"-"&VLOOKUP(LEFT(B$3:$3,3,5),FALSE)," -",""))))))
...然后我将其拖动到B5和B6。
注意:FLATTEN仍然是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),TRIM($A4:A)))+12,9),""),";","")),"hh:mm"),IF(FIND(";",FIND(A$2:N$2,TRIM($A4:A)))-FIND(":",TRIM($A4:A)))>25,FIND(",TRIM($A4:$A),"hh:mm")&"-"&TEXT(TRIM(SUBSTITUTE(MID(TRIM($A4:A),"")))})
您需要仔细检查以获取准确的结果,但对我来说似乎是正确的。
请记住,这个复杂的公式依赖,您需要将当前结构保留在A列中。即:
1。)阐明了工作日,然后是冒号和空格。
2。)同一天中的两个句点用逗号分隔。
3。)每个工作日的条目以分号结束。
如果您更改此设置,则该公式将无法工作,因为它将无法找到所需的标记。