Обнаружение новых текстовых блоков для создания функций в Google Sheets - PullRequest
2 голосов
/ 25 января 2020

Я импортировал текстовый файл, содержащий 3 блока текста. Я хочу иметь возможность распознавать новый блок текста, который всегда разделен двумя строками. Затем объедините текст в строках для этого текстового блока и добавьте текст между каждой строкой.

Вот лист Google, чтобы создать свою собственную копию для воспроизведения или редактирования. Просто go в Файл -> Сделать копию https://docs.google.com/spreadsheets/d/18dAX7P3gCnkUorkYOksyDUfFs_e34uqiwzNjupffo2A/copy

Ответы [ 4 ]

1 голос
/ 26 января 2020

попробуй так:

=TEXTJOIN("<break time=""1000ms""/>", 1, A4:A6)
0 голосов
/ 31 января 2020

Вот мой лист решения. Это просто одна формула в ячейке 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)&"/>")),)})

Надеюсь работы.

0 голосов
/ 30 января 2020

У меня есть 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))))

Я комментирую здесь только как недостаточно репутации, чтобы комментировать его решение.

0 голосов
/ 27 января 2020

У меня есть два решения, но они кажутся утомительными, тбч.

[ Я хотел бы увидеть элегантное решение, которое использует формулы массива и выполняет трюк с одной формулой в одной ячейке. ]

Эти решения зависят от просмотра двух предыдущих строк, чтобы увидеть, были ли они пустыми.

Ссылка на лист с решениями


Решение A

Решение A использует номер строки, чтобы решить, сколько строк объединить. И затем использует TextJoin(), чтобы избежать пустых строк. Объединенный вывод создается в начале каждого блока.

Solution A


Решение B

Решение B продолжает объединять текст, пока не обнаружит, что две предыдущие строки были пустыми. Тогда это начинается снова sh. В этом случае каскадный вывод создается на конце каждого блока.

Solution B

PS: чтобы они работали, вам также понадобятся две пустые строки перед первым текстовым блоком.

...