Как зациклить функцию транспонирования для каждой строки, содержащей определенный символ в Google Sheets? - PullRequest
0 голосов
/ 03 июня 2018

Это то, что у меня есть (каждый символ "|" обозначает новый столбец в той же строке)

John | Doe
Manager
NY
123-45-67
Fax: 987-54-32
a@b
Jane
Assistant
CA
234-56-78
c@d
Mike | Brown
Analyst | Intern
CA
345-67-89
e@f

Однако я пытаюсь сделать так, чтобы это выглядело так, как показано ниже в Google Sheets:

John Doe | Manager | [empty] | NY | 123-45-67 | Fax: 987-54-32 | a@b
Jane | Assistant | [empty] | CA | 234-56-78 | [empty] | c@d
Mike Brown | Analyst | Intern | CA | 345-67-89 | [empty] | e@f

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

В конечном итоге я хочу, чтобы он мог создавать новую строку записи после каждой ячейки, в которой есть символ "@".Как много из этого возможно?Если это можно сделать, то сколько это можно сделать и как это можно сделать в Google Sheets?

1 Ответ

0 голосов
/ 06 июня 2018

Потребовалась некоторая работа, но это можно сделать без сценария, используя встроенные в лист функции.Я добавлю ссылку на пример ниже в комментарии, но я не могу обещать держать его там навсегда.Но вот метод.

ШАГ 0: Добавьте соответствующие заголовки в строке 1 для здравомыслия.Зарезервируйте столбец A для локатора записи, который будет построен позже.Таким образом, в приведенном выше примере «Джон» находится в B2, а «Doe» - в C2.

ШАГ 1: Постройте столбец для каждого типа поля и укажите, является ли значение этим типом.Например, мой столбец D определяет, является ли что-то электронным письмом с (перетаскиваемой) формулой =iferror(find("@",B2)>0,false).В столбце EI определите, является ли что-то именем.Вы могли бы использовать смелую идею, но я выбрал =or((row()=2),D1), где говорится, что я либо первая строка данных, либо предыдущая строка была электронным письмом.Это тоже тащат.Аналогично проверке состояний: =and((LEN(B2)=2),(B2=upper(B2))), факс =(upper(mid(B2,1,3))="FAX"), идентификатор =and((len(B2)=9),mid(B2,4,1)="-",mid(B2,7,1)="-") и, наконец, все остальное должно быть заданием =not(or(D2,E2,F2,G2,H2)).

ШАГ 2. Построить значение из 2 потенциальных столбцов.Если второе пусто, только первое.В противном случае имена получают пробел между, а все остальное - «и» между.=if(ISBLANK(C2),B2,if(E2,B2&" "&C2,B2&" and "&C2))

ШАГ 3: Построить тип записи, основываясь на том, что было правдой.Я поместил имена типов в строку заголовка, чтобы они соответствовали позже, что делает эту формулу немного непроницаемой, но я надеюсь, что вы поняли: =if(D2,$S$1,if(E2,$N$1,if(F2,$P$1,if(G2,$R$1,if(H2,$Q$1,if(I2,$O$1,"error")))))).Теперь в A2 я добавляю номер записи к типу задания, где номер записи - это количество имен, с которыми мы встречались до сих пор (таким образом, также можно перетаскивать) =K2&countif($E$2:$E2,true).[Идея создания ключа этим способом взята из Prashanth

ШАГ 4: я оставил столбец L пустым для аккуратности, чтобы результаты были отделены от ввода и вычислений, а затем я положилномер записи в столбце М следующим образом =(row()-1).И теперь мы применяем vlookup к остальной части строки, чтобы получить каждое поле, сопоставляя его с заголовком столбца желаемого вывода (имя | задание | состояние | ID | факс | электронная почта) следующим образом =vlookup(N$1&$M2,$A:$K,10,false), который построен так, чтобы бытьможно перетаскивать как в самый правый столбец (электронная почта), так и в нижнюю строку (строка 4 для записи 3, в нашем примере).Недостающие данные отображаются как # N / A (если вы находите это уродливым, IfError может заставить его сказать что-то более приятное).

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

...