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

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

  • 예에서 두 시트는 DATA및 RESULT입니다. 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.