Arkusze Google dzielą wieloliniową komórkę na nowe wiersze (+ zduplikuj otaczające wpisy wierszy)

15

Tworzę bazę danych informacji o adresie firmy, w tym kluczowy personel dla każdej firmy. Arkusz kalkulacyjny Google, który odziedziczyłem po tym projekcie, zawiera kolumnę „kluczowego personelu” (w kolumnie B), z wieloma nazwami kluczowych pracowników wymienionymi w tej samej komórce, oddzielonymi podziałami linii (tj. CHAR (10)). W jednym rzędzie jest jedna firma. Liczba linii w komórce „kluczowego personelu” zmienia się rząd po rzędzie. Mój początkowy arkusz wygląda następująco:

wprowadź opis zdjęcia tutaj

Aby zoptymalizować ten arkusz, muszę wykonać następujące czynności:

  1. podziel każdą wieloliniową komórkę „kluczowego personelu”, aby nazwa każdego kluczowego personelu pojawiła się w osobnym wierszu. Wymaga to wstawienia nowego wiersza (ów) poniżej oryginalnego wiersza.
  2. zduplikuj dane ze wszystkich pozostałych komórek w oryginalnym wierszu (tj. z kolumn A i C: E), tak aby każdy nowy wiersz zawierał pełne dane dla każdej firmy
  3. Potrzebuję zautomatyzowanego procesu - będę miał około 1000 firm do przetworzenia, więc nie mogę tego zrobić żadnymi ręcznymi krokami

Arkusz powinien wyglądać następująco:

wprowadź opis zdjęcia tutaj

Używanie jest =TRANSPOSE(SPLIT(B1,CHAR(10)))oczywiście tylko częścią - nie wstawia nowych wierszy i nie powiela otaczających wpisów w kolumnach. Wszelka pomoc z wdzięcznością przyjęta!

karta Kirk
źródło

Odpowiedzi:

14

Po pierwsze przepraszam za późną odpowiedź, ale mam dla ciebie rozwiązanie.

Kod

function result(range) {
  var output2 = [];
  for(var i=0, iLen=range.length; i<iLen; i++) {
    var s = range[i][1].split("\n");    
    for(var j=0, jLen=s.length; j<jLen; j++) {
      var output1 = []; 
      for(var k=0, kLen=range[0].length; k<kLen; k++) {
        if(k == 1) {
          output1.push(s[j]);
        } else {
          output1.push(range[i][k]);
        }
      }
      output2.push(output1);
    }    
  }
  return output2;
}

Wyjaśnione

Skrypt ocenia każdy wiersz, a zwłaszcza drugą kolumnę każdego wiersza (w tablicach JavaScript są oparte na zerach, więc kolumna 2 odpowiada indeksowi 1 tablicy). Dzieli zawartość tej komórki na wiele wartości i używa "\n"jako separatora (przesunięcia wiersza). Następnie dodaje istniejące informacje do tablicy i dodaje tylko pojedyncze wyniki, gdy osiągnie indeks 1. ( k == 1)Nowo przygotowany wiersz jest następnie dodawany do innej tablicy, która jest zwracana, aby pokazać wynik.

Zrzut ekranu

dane
wprowadź opis zdjęcia tutaj

wynik
wprowadź opis zdjęcia tutaj

Przykład

Stworzyłem dla Ciebie przykładowy plik: komórki wieloliniowe w nowe rzędy .
Dodaj skrypt w menu Narzędzia> Edytor skryptów i naciśnij przycisk Zapisz.

Jacob Jan Tuinstra
źródło
2
Wspaniale, wspaniale, wspaniale - kup temu człowiekowi piwo! Wielkie dzięki Jacob, właśnie tego potrzebuję.
kirk tab
2
I jak zdefiniować zakres? (otrzymaj ten komunikat „nie można odczytać właściwości” o długości ”z niezdefiniowanego„ Dzięki!
user2060451
na naprawdę dużym pliku, prawdopodobnie się nie powiedzie ... wynik będzie zbyt duży.
Kyle Pennell
Świetnie odpowiedział, tylko jeden błąd. PIERWSZA KOLUMNA w danym zakresie NIE powinna mieć DELIMITERA. Tymczasowym obejściem jest posiadanie numerów seryjnych lub wartości statycznych jako pierwszej kolumny. Nie wypróbowano, ale pierwsza pusta kolumna powinna również rozwiązać problem.
Ashish Singh
3

Powtarzalne rozwiązanie będzie wymagało skryptu.

Ale dla jednorazowego wysiłku możesz po prostu użyć =SPLIT(B3,CHAR(10)). To da ci wszystkie nazwiska osoby w kolumnach pomocniczych, takich jak to:

wprowadź opis zdjęcia tutaj

Copy / Paste-special, ceni zawartość kolumny pomocniczej.

I dla każdej użytej kolumny pomocniczej (mam nadzieję, że nie za dużo, bo mam nadzieję, że nie ma zbyt wielu osób w jednej firmie) ręcznie skopiuj i wklej blok wierszy do końca bieżącego bloku. (To nie jest świetny opis, ale masz dryf.)

MaryC.fromNZ
źródło
Cześć Mary, dzięki, ale potrzebuję osoby. nazwiska osób spadły do ​​nowych WIERSZY (z dodatkowymi wierszami automatycznie wygenerowanymi, aby je uwzględnić), a następnie otaczające informacje zostały skopiowane obok nowych komórek „osoby”. Potrzebuję w 100% zautomatyzowanego procesu - nie mogę tego zrobić ręcznie dla około tysiąca firm!
karta kirk
Nie musisz wykonywać ręcznego kroku dla całego tysiąca firm. Musisz to zrobić tylko dla maksymalnej liczby pepoli związanej z którąkolwiek z tych firm: np. Jeśli jedna firma ma sześć osób, powstanie sześć nowych kolumn pomocniczych, więc musisz ręcznie skopiować i wkleić sześć razy, po jednym dla każdej kolumny.
MaryC
1
Ktoś mógłby napisać do tego skrypt (nie jestem tym kimś!) - ale tak naprawdę czas poświęcony na testowanie byłby prawdopodobnie dłuższy niż czas poświęcony na ręczne wykonanie.
MaryC
2

Dla osób, które mogą nie od razu zrozumieć, jak używać pomocnej funkcji niestandardowej w zaakceptowanej odpowiedzi :

  • Potrzebujesz więcej niż jednego arkusza, w przykładzie dwa arkusze to DATAi RESULT. RESULTArkusz jest pusty do momentu uruchomienia kwerendy. Możesz zobaczyć zapytanie odnoszące się do DATAarkusza na zrzucie ekranu Jacoba.

  • Najprawdopodobniej będziesz musiał zmodyfikować wartość porównania dla klinii 8, która odnosi się do kolumny, w której powinny zostać znalezione dane do analizy. Ta sama liczba będzie musiała przejść do drugiej wartości tablicy w wierszu 4.

  • Może być konieczne zmodyfikowanie separatora w wierszu 4, który jest obecnie \n

Aby to wszystko było trochę łatwiejsze, wziąłem ten sam kod i wyodrębniłem separator i kolumnę docelową do zmiennych ustawionych u góry funkcji. Jak wspomina Jacob, liczba kolumn docelowych zaczyna się od 0 jako pierwszej liczby.

function result(range) {
  delimiter = ", "
  targetColumn = 10

  var output2 = [];
  for(var i=0, iLen=range.length; i<iLen; i++) {
    var s = range[i][targetColumn].split(delimiter);    
    for(var j=0, jLen=s.length; j<jLen; j++) {
      var output1 = []; 
      for(var k=0, kLen=range[0].length; k<kLen; k++) {
        if(k == targetColumn) {
          output1.push(s[j]);
        } else {
          output1.push(range[i][k]);
        }
      }
      output2.push(output1);
    }    
  }
  return output2;
}

Bibliografia

jfunk
źródło
1
Po uruchomieniu kodu pojawia się komunikat: TypeError: Nie można odczytać właściwości „length” z niezdefiniowanego. Dziękuję bardzo. Odpowiedź powinna być tutaj: Odpowiedź musi być gdzieś tutaj (developers.google.com/apps-script/reference/spreadsheet/…) Ale wciąż mam ten sam błąd.
user2060451
@ user2060451 Rozwiązanie tej odpowiedzi pokazuje kod funkcji niestandardowej, nie jest przeznaczony do uruchamiania z edytora skryptów. Dodałem link do przewodnika po funkcjach niestandardowych od Google.
Rubén