Google 시트는 여러 줄의 셀을 새 행으로 분할합니다 (+ 중복 주변 행 항목)


15

각 비즈니스의 주요 직원을 포함하여 비즈니스 주소 정보 데이터베이스를 컴파일하고 있습니다. 이 프로젝트에서 상속 한 Google 스프레드 시트에는 '핵심 직원'(B 열) 열이 포함되어 있으며 여러 핵심 직원 이름이 같은 셀에 나열되어 있으며 줄 바꿈으로 구분됩니다 (예 : CHAR (10)). 행당 하나의 비즈니스가 있습니다. '핵심 직원'셀의 줄 수는 행마다 다릅니다. 내 초기 시트는 다음과 같습니다.

여기에 이미지 설명을 입력하십시오

이 시트를 최적화하려면 다음을 수행해야합니다.

  1. 각 여러 줄의 '핵심 직원'셀을 분할하여 각 핵심 직원 이름이 자체 행에 표시되도록합니다. 원래 행 아래에 새 행을 삽입해야합니다.
  2. 원래 행의 다른 모든 셀 (예 : 열 A & C : E)의 데이터를 복제하여 각 새 행에 각 비즈니스의 전체 데이터가 포함되도록합니다.
  3. 자동화 된 프로세스 가 필요합니다. 처리 할 약 1000 개의 비즈니스가 있으므로 수동 단계를 수행 할 수 없습니다.

그러면 시트는 다음과 같아야합니다.

여기에 이미지 설명을 입력하십시오

=TRANSPOSE(SPLIT(B1,CHAR(10)))분명히 사용하는 것은 길의 일부입니다. 새 행을 삽입하지 않고 주변 열 항목을 복제하지 않습니다. 모든 도움에 감사드립니다!


답변:


14

우선, 늦은 답변에 대해 죄송하지만 귀하와 함께 할 수있는 해결책이 있습니다.

암호

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;
}

설명

스크립트는 각 행, 특히 각 행의 두 번째 열을 평가합니다 (JavaScript 배열에서는 0을 기준으로하므로 열 2는 배열의 인덱스 1에 해당함). 해당 셀의 내용을 여러 값으로 나누고 "\n"구분 기호 (줄 바꿈)로 사용합니다 . 그런 다음 기존 정보를 배열에 추가하고 인덱스 1 ()에 도달하면 개별 결과 만 추가합니다 k == 1). 새로 준비된 행이 다른 배열에 추가되면 결과가 표시됩니다.

스크린 샷

데이터
여기에 이미지 설명을 입력하십시오

결과
여기에 이미지 설명을 입력하십시오

다중 행 셀을 새 행으로 만드는 예제 파일을 만들었습니다 . 도구> 스크립트 편집기
에서 스크립트를 추가하고 저장 버튼을 누릅니다.


2
대단해 대단해-이 사람에게 맥주를 사! Jacob에게 많은 감사를드립니다. 그것이 바로 제가 필요로하는 것입니다.
kirk tab

2
그리고 범위를 정의하는 방법? (감사합니다 "정의되지 않은에서"이 메시지 길이를 "속성을 읽을 수 없습니다"를 얻을!
user2060451

정말 큰 파일에서는 실패 할 것입니다 ... 결과가 너무 큽니다.
Kyle Pennell

단 하나의 버그로 훌륭하게 대답했습니다. 주어진 범위의 첫 번째 열에는 DELIMITER가 없어야합니다. 임시 해결 방법은 일련 번호 또는 정적 값을 첫 번째 열로 갖는 것입니다. 시도하지 않았지만 첫 번째 빈 열도 문제를 해결해야합니다.
Ashish Singh

3

반복 가능한 솔루션에는 스크립트가 필요합니다.

그러나 한 번만 노력하면을 사용할 수 있습니다 =SPLIT(B3,CHAR(10)). 이렇게하면 다음과 같이 나란히있는 도우미 열에있는 모든 사람의 이름이 제공됩니다.

여기에 이미지 설명을 입력하십시오

복사 / 붙여 넣기 특수, 도우미 열 내용을 중요하게 생각합니다.

그리고 사용 된 각 도우미 열에 대해 (아마도 너무 많은 사람들이 아니기 때문에 '일부 비즈니스에 너무 많은 사람들이 없기를 바랍니다) 행 블록을 현재 블록의 끝에 수동으로 복사하여 붙여 넣습니다. (그것은 훌륭한 설명이 아니지만 드리프트를 얻습니다.)


안녕 메리, 고맙지 만 나는 개인이 필요합니다. 개인 이름이 새 ROWS에 추가 된 후 (추가 행이 자동 생성되어 해당 개인 셀 옆에 복사 됨) 그리고 100 % 자동화 된 프로세스가 필요합니다. 수천 대의 비즈니스에서는이 작업을 수동으로 수행 할 수 없습니다!
kirk tab

천 사업 전체에 대해 수동 단계를 수행 할 필요는 없습니다. 해당 비즈니스 중 하나와 관련된 최대 pepole 수만큼만 수행하면됩니다. 예를 들어 한 비즈니스에 6 명의 직원이있는 경우 6 개의 새 헬퍼 컬럼이 작성되므로 수동으로 복사하여 붙여 넣기해야합니다. 각 열마다 하나씩 6 번.
MaryC.fromNZ

1
누군가는 이것에 대한 스크립트를 작성할 수 있습니다 (나는 그 사람이 아닙니다!). 그러나 실제로 테스트하는 데 걸린 시간은 수동으로 쓰는 시간보다 더 클 것입니다.
MaryC.fromNZ

2

수락 된 답변 에서 유용한 사용자 정의 기능 을 사용하는 방법을 즉시 이해하지 못하는 사람들을 위해 :

  • 예에서 두 시트는 DATARESULT입니다. RESULT조회가 실행될 때까지 시트가 비어 있습니다. DATAJacob의 스크린 샷에서 시트 를 참조하는 쿼리를 볼 수 있습니다 .

  • k구문 분석 할 데이터가있는 열을 참조하는 8 행 의 비교 값을 수정 해야합니다. 4 번째 줄에서 같은 숫자가 두 번째 배열 값으로 들어가야합니다.

  • 현재 4 행에서 분리 문자를 수정해야 할 수도 있습니다. \n

이 모든 것을 조금 더 쉽게 만들기 위해 동일한 코드를 사용하여 구분 기호대상 열 을 함수 맨 위에 설정된 변수로 추출했습니다 . Jacob이 언급했듯이 대상 열 수 는 첫 번째 숫자 로 0 으로 시작합니다 .

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;
}

참고 문헌


1
코드를 실행하면 TypeError : 정의되지 않은 "length"속성을 읽을 수 없습니다. 정말 고맙습니다. 답변은 여기에 있어야합니다. 답변은 여기에 있어야합니다 (developers.google.com/apps-script/reference/spreadsheet/…) 그러나 같은 오류가 계속 발생합니다.
user2060451

@ user2060451이 답변의 솔루션은 사용자 정의 기능 코드를 보여 주며 스크립트 편집기에서 실행되도록 설계되지 않았습니다. Google의 사용자 정의 기능 안내서에 대한 링크를 추가했습니다.
Rubén
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.