检测新文本块以在 Google 个工作表中生成函数
Detect new text blocks to generate functions in Google Sheets
我导入了一个包含 3 个文本块的文本文件。我希望能够识别始终由两行分隔的新文本块。然后加入该文本块的行中的文本,并在每行之间添加一些文本。
这里是GoogleSheet,制作自己的副本进行播放或编辑。只需转到文件 - >制作副本
https://docs.google.com/spreadsheets/d/18dAX7P3gCnkUorkYOksyDUfFs_e34uqiwzNjupffo2A/copy
这样试试:
=TEXTJOIN("<break time=""1000ms""/>", 1, A4:A6)
我有两个解决方案,但它们看起来很乏味,tbh。
[我很想看到一个优雅的解决方案,它使用 arrayformulas 并在一个单元格中只用一个公式就可以解决问题。]
这些解决方案取决于查找前两行以查看它们是否为空白。
Link to the sheet with solutions
解决方案 A
解决方案 A 使用行号来决定要连接多少行。然后使用 TextJoin()
来避免空行。串联输出在每个块的开始处生成。
解决方案 B
解决方案 B 继续连接文本,直到发现前两行为空白。然后它重新开始。在这种情况下,串联输出在每个块的 end 处产生。
PS:要使这些起作用,您还需要在第一个文本块之前有两个空白行。
我有 1 个解决方案,但它与 ADW 提到的解决方案有相同的限制,即它需要在第一个文本块之前有 2 行。但是,我设法将所有公式放入 1 个单元格中。
=if(AND(A18="",A16="",A17=""),row(),if((A16="")*(A17=""),textjoin("<break time=""1000ms""/>", 1,indirect("A"&row()&":"&concatenate("A",min(arrayformula(if((B19:B109="")*(B20:B110=""),"",row(B18:B))))))),""))
这是单元格 B3 的公式,您只需将它拖到列中即可。
附带说明一下,我认为 ADW 的解决方案很棒,但 ADW 的解决方案 A 中存在轻微错误,您需要在公式中添加 -1,将其更改为:
=indirect("A"&row()&":A"&row(indirect("E"&if(B3="","", min(B4:B)))))
至
=indirect("A"&row()&":A"&row(indirect("E"&if(B3="","", min(B4:B)-1))))
我只是在这里发表评论,因为我没有足够的声誉来评论他的解决方案。
这是我的解决方案sheet。它只是单元格 B1 中的一个公式。它是可编辑的,因此您可以随意浏览。试驾一下。东西块之间的两行边界对其操作很重要。
https://docs.google.com/spreadsheets/d/1sKcBuHwh4v0UECRtUX4mPfE6NOCPkyafhNYs7LSSa0A/edit?usp=sharing
解决方法如下:
=ARRAYFORMULA({"";IF({1;ARRAY_CONSTRAIN(A1:A,ROWS(A3:A),1)&ARRAY_CONSTRAIN(A2:A,ROWS(A3:A),1)=""},TRANSPOSE(SUBSTITUTE(TRIM(QUERY(IF((LOOKUP(ROW(A2:A),{2;FILTER(ROW(A3:A),ARRAY_CONSTRAIN(A1:A,ROWS(A3:A),1)&ARRAY_CONSTRAIN(A2:A,ROWS(A3:A),1)="")})=TRANSPOSE(LOOKUP(ROW(A2:A),{2;FILTER(ROW(A3:A),ARRAY_CONSTRAIN(A1:A,ROWS(A3:A),1)&ARRAY_CONSTRAIN(A2:A,ROWS(A3:A),1)="")})))*(A2:A<>""),A2:A&CHAR(10),),,9^99)),CHAR(10),"<break time="&CHAR(34)&"1000ms"&CHAR(34)&"/>")),)})
希望有用。
我导入了一个包含 3 个文本块的文本文件。我希望能够识别始终由两行分隔的新文本块。然后加入该文本块的行中的文本,并在每行之间添加一些文本。
这里是GoogleSheet,制作自己的副本进行播放或编辑。只需转到文件 - >制作副本 https://docs.google.com/spreadsheets/d/18dAX7P3gCnkUorkYOksyDUfFs_e34uqiwzNjupffo2A/copy
这样试试:
=TEXTJOIN("<break time=""1000ms""/>", 1, A4:A6)
我有两个解决方案,但它们看起来很乏味,tbh。
[我很想看到一个优雅的解决方案,它使用 arrayformulas 并在一个单元格中只用一个公式就可以解决问题。]
这些解决方案取决于查找前两行以查看它们是否为空白。
Link to the sheet with solutions
解决方案 A
解决方案 A 使用行号来决定要连接多少行。然后使用 TextJoin()
来避免空行。串联输出在每个块的开始处生成。
解决方案 B
解决方案 B 继续连接文本,直到发现前两行为空白。然后它重新开始。在这种情况下,串联输出在每个块的 end 处产生。
PS:要使这些起作用,您还需要在第一个文本块之前有两个空白行。
我有 1 个解决方案,但它与 ADW 提到的解决方案有相同的限制,即它需要在第一个文本块之前有 2 行。但是,我设法将所有公式放入 1 个单元格中。
=if(AND(A18="",A16="",A17=""),row(),if((A16="")*(A17=""),textjoin("<break time=""1000ms""/>", 1,indirect("A"&row()&":"&concatenate("A",min(arrayformula(if((B19:B109="")*(B20:B110=""),"",row(B18:B))))))),""))
这是单元格 B3 的公式,您只需将它拖到列中即可。
附带说明一下,我认为 ADW 的解决方案很棒,但 ADW 的解决方案 A 中存在轻微错误,您需要在公式中添加 -1,将其更改为:
=indirect("A"&row()&":A"&row(indirect("E"&if(B3="","", min(B4:B)))))
至
=indirect("A"&row()&":A"&row(indirect("E"&if(B3="","", min(B4:B)-1))))
我只是在这里发表评论,因为我没有足够的声誉来评论他的解决方案。
这是我的解决方案sheet。它只是单元格 B1 中的一个公式。它是可编辑的,因此您可以随意浏览。试驾一下。东西块之间的两行边界对其操作很重要。
https://docs.google.com/spreadsheets/d/1sKcBuHwh4v0UECRtUX4mPfE6NOCPkyafhNYs7LSSa0A/edit?usp=sharing
解决方法如下:
=ARRAYFORMULA({"";IF({1;ARRAY_CONSTRAIN(A1:A,ROWS(A3:A),1)&ARRAY_CONSTRAIN(A2:A,ROWS(A3:A),1)=""},TRANSPOSE(SUBSTITUTE(TRIM(QUERY(IF((LOOKUP(ROW(A2:A),{2;FILTER(ROW(A3:A),ARRAY_CONSTRAIN(A1:A,ROWS(A3:A),1)&ARRAY_CONSTRAIN(A2:A,ROWS(A3:A),1)="")})=TRANSPOSE(LOOKUP(ROW(A2:A),{2;FILTER(ROW(A3:A),ARRAY_CONSTRAIN(A1:A,ROWS(A3:A),1)&ARRAY_CONSTRAIN(A2:A,ROWS(A3:A),1)="")})))*(A2:A<>""),A2:A&CHAR(10),),,9^99)),CHAR(10),"<break time="&CHAR(34)&"1000ms"&CHAR(34)&"/>")),)})
希望有用。