Google 스프레드 시트에서 텍스트를 열로 변환


32

Google 스프레드 시트에서 텍스트를 열로 변환하는 방법은 무엇입니까?

예를 들어 하나의 셀에 다음 데이터 문자열이 있습니다.

5,233,6,2,6,7,2,2,6,6

쉼표 구분 기호로 열로 나누고 싶습니다.

편집 : Google은 능숙하게 생각하기 때문에 Google Apps 스크립팅을 사용하지 않는 답변으로 수락 된 답변을 변경했습니다.


google-apps-script 태그를 추가 한 이유는 무엇입니까? 대답에 맞는가?
Jacob Jan Tuinstra

1
@JacobJanTuinstra Google Apps 스크립팅을 통해 기능을 추가 할 수 있기 때문입니다. 이제 Script Gallery에서 찾을 수있는 'Text To Columns'스크립트를 작성하여 자체 문제를 해결했습니다. Googlegooru 또한 여기의 사용법을 설명하는 비디오 자습서를 게시 googlegooru.com/text-columns-google-spreadsheets .
Evan Plaice

무엇 이미 구글 스프레드 시트가 제공하는 솔루션의 차이입니다 : SPLIT. 값이 설정 되었습니까? 알고있는 값을 붙여 넣을 수 있습니다.
Jacob Jan Tuinstra

@JacobJanTuinstra 첫 번째 솔루션에서 B2를 B3으로 복사 해보십시오. 결과 셀에는 원시 데이터가 아닌 연속 수식이 포함됩니다. 스크립트에서 출력 된 셀에는 실제 원시 데이터가 포함되어있어 문제없이 복사 / 이동할 수 있습니다. 이 질문의 목적은 Excel의 'Text to Columns'기능과 동등한 기능을 찾는 것입니다. Google은 공식적으로 스크립트가 가능한 한 가깝게 지원을 추가합니다.
Evan Plaice

1
@ Rubén 안정성을 위해 너무 많은. 나는 이전에 확인했고 스크립팅이 완전히 사라 졌다는 인상을 받았다. 결과적으로 스크립트 갤러리 만 죽였습니다. 가장 간단한 스크립트 가능한 솔루션이므로 권장하는 답변을 사용합니다. 피드백 감사드립니다.
Evan Plaice

답변:


14

다음 공식은 그렇게 할 것입니다. 텍스트에서 열로 :

A1=5,233,6,2,6,7,2,2,6,6
A2=SPLIT(A1;",")

그리고 다음; 텍스트-행 :

A1=5,233,6,2,6,7,2,2,6,6
A2=TRANSPOSE(SPLIT(A1;","))

업데이트 03-02-2013
결과를 분할하여 A1값을 붙여 넣으면 OP의 답변에 사용 된 모든 코드 줄과 동일한 결과가 나타납니다. Google Apps Script를 사용하여 사진을 제공했으며 이것이 내가 만든 것입니다. 텍스트에서 열로

function mySplit() {
  var sh = SpreadsheetApp.getActiveSpreadsheet().getActiveSheet();
  var cell = sh.getActiveCell().getValues()[0];
  var sCell = cell[0].split(",");
  var row = sh.getActiveCell().getRowIndex();
  var col = sh.getActiveCell().getColumnIndex();

  sh.getRange(row,col+1,1,sCell.length).setValues([sCell]);  
}

내장 분할 함수를 사용하여 결과를 분할하여 시트에 추가하면됩니다.


좋습니다 ... UI를 확장하지 않고 어떻게 호출합니까? 사용법을 보여주는 간단한 예를 추가 할 수 있습니까?
Evan Plaice

17

Google Apps 스크립팅을 활용하여 UI 확장

Text to Columns는 매우 편리한 기능이며 많은 Google 스프레드 시트 사용자가 Excel을 다시 사용하는 이유 중 하나입니다. Google이 공식적으로 기능을 지원하기로 결정할 때까지이 솔루션은 기능을 추가하기위한 폴리 필로 사용될 수 있습니다.

코드는 다음과 같습니다.

function onOpen() {
  var ss = SpreadsheetApp.getActiveSpreadsheet();
  var menuEntries = [];
  menuEntries.push({ name:"Text to columns", functionName:"textToColumns" });
  menuEntries.push({ name:"Text to columns (custom separator)", functionName:"textToColumnsCustom" });
  menuEntries.push(null);
  menuEntries.push({ name:"Columns to Text", functionName:"columnsToText" });
  menuEntries.push({ name:"Columns to Text (custom separator)", functionName:"columnsToTextCustom" });
  ss.addMenu("Advanced", menuEntries);
}

function textToColumnsCustom() {
  var separator = Browser.inputBox("Text to column","Enter the the separator",Browser.Buttons.OK);
  textToColumns(separator);
}

function columnsToTextCustom() {
  var separator = Browser.inputBox("Column to text","Enter the the separator",Browser.Buttons.OK);
  columnsToText(separator);
}

// Expands a single cell of CSV formatted text to multiple columns
function textToColumns(separator) {
  var sep = typeof(separator) !== 'undefined' ? separator : ',';
  var ss = SpreadsheetApp.getActiveSheet(); 
  var r = ss.getActiveRange();
  // check that only one column was selected
  var col = r.getColumn(); 
  if(col !== r.getLastColumn()) {
    Browser.msgBox("Error", "Invalid selection, too many columns.", Browser.Buttons.OK);
    return;
  }  
  var firstRow = r.getRow();
  // short cut the one row selection
  if(firstRow === r.getLastRow()) {
    var values = r.getValues().toString().split(sep);
    ss.getRange(firstRow,col+1,1,values.length).setValues(new Array(values));
    return;
  } else {
    var rows = r.getValues();
    var values = [];
    var cols = 0;
    for(var i = 0, len = rows.length; i < len; i++) {
      var rowValues = rows[i].toString().split(sep); 
      var rowValuesLen = rowValues.length;
      if(cols < rowValuesLen) { cols = rowValuesLen; }
      values.push(rowValues);
    }
    // set all values at once (padding required because setValues doesn't accept jagged 2d arrays)
    padRow(values, cols);
    ss.getRange(firstRow,col+1,values.length,cols).setValues(values);
  }
}

// Pads a row with empty values to the specified length
function padRow(array, length) {
  for(var i = 0; i < array.length; i++) {
    var arrLen = array[i].length;
    if(arrLen < length) {
      var padLen = length - arrLen;
      var padding = new Array(padLen);
      array[i].push.apply(array[i], padding);
      for(var j = 0, len = array[i].length; j < len; j++) {
        if(typeof(array[i][j]) === 'undefined') {
          array[i][j] = "";
        }
      }
    }
  }
  return array;
}

function columnsToText(separator) {
  var sep = typeof(separator) !== 'undefined' ? separator : ',';
  var ss = SpreadsheetApp.getActiveSheet(); 
  var r = ss.getActiveRange();
  var col = r.getColumn();  
  var firstRow = r.getRow();
  var rows = r.getValues();
  var values = [];
  for(var i = 0, len = rows.length; i < len; i++) {
    var value = rows[i].join(sep);
    values[i] = [value];
  }
  col -= 1;
  ss.getRange(firstRow,col,values.length,1).setValues(values);
}

스크립트 편집기를 저장하고 닫으십시오. 그런 다음 스프레드 시트를 새로 고치십시오. 로드하는 데 1 초가 걸리지 만 툴바에서 '도움말'다음에 '고급'팝업 메뉴가 나타납니다.

용법:

  • 분할 할 값이 포함 된 셀을 선택하십시오.
  • 고급텍스트를 열로를 선택하십시오.

그게 다야. 사용자 정의 구분 기호 ( '텍스트에서 열 (사용자 정의)'로)를 사용하여 분할을 수행하고 프로세스를 '열에서 텍스트로'역으로 바꿀 수도 있습니다.


스크립트 갤러리에서 방금 설치했는데 작동하지 않았습니다. 도구 → 스크립트 관리자 → 편집 버튼으로 이동하여 각 함수 정의의 닫는 중괄호 뒤에 세미콜론을 추가하여 문제를 해결했습니다. 스크립트 주셔서 감사합니다.
bob esponja

@bobesponja 감사합니다. 가져온 스크립트의 이벤트 트리거가 제대로 등록되지 않는 Google 스크립트에 버그가 있음을 알고 있습니다. 이를 해결하려면 onOpen 트리거를 수동으로 추가하십시오.
Evan Plaice

스크립트 갤러리에 표시되지 않습니다. 아직 있습니까?
Ellen Spertus

1
@espertus Google이 새로운 부가 기능을 위해 스크립트 갤러리를 삭제 한 것으로 보입니다. 위의 코드를 스크립트에 복사 한 다음 문서를 닫았다가 다시 열면 제대로 작동합니다.
Evan Plaice

이것이 작동하지 않는 몇 가지 경우가 있습니다. 1,421,873,190,017,370,000,000,000 1.42E+24 즉, CSV 라인은 9 열로 분할 했어야하지만, 그것은 단지 1로 분할되었다
haventchecked

3

split 함수를 사용했는데 continue 수식도 사용하기 때문에 완벽하게 작동했으며 A 열의 텍스트에서 적절한 간격으로 BCDE 열로 정확하게 변환합니다.

내 예 :

Cell A1= text1, text2, date1, number1
Cell B1= split(A1,",")

B1의 결과는 text1입니다. C1의 결과는 text2입니다. D1의 결과는 date1입니다. E1의 결과는 number1입니다.

날짜가 1-jun으로 표기되고 01/06으로 번역되었으므로 형식을 처리합니다.

전지에 사용 나누 수식 어디 BCDE CONTINUE(B1; 1; 2), CONTINUE(B1; 1; 3), CONTINUE(B1; 1; 4). 이 부분은 모두 자동으로 작성되었습니다.


2
이것은 의견입니까 아니면 해결책입니까?
Jacob Jan Tuinstra

2

csv 데이터를 tsv (탭으로 구분 된 값)로 변환하십시오.
그런 다음 붙여 넣습니다.


방금 일반 페이스트로 시도했지만 작동하지 않았습니다. 브라우저의 "붙여 넣기 앤 매치 스타일"작업을 수행 (크롬 / 맥 OS)와 붙여 넣기
nhed

1
간단한 Ctrl + V로 완벽하게 작동했습니다. 가장 간단한 해결책 인 것 같습니다!
Didier L

1

Apps Script를 사용한 Evan의 답변이 정말 마음에 들었고 정규 표현식 구분 기호 일치에 대한 지원을 추가하여 약간 개선되었습니다. onOpen의 메뉴에 다음을 추가했습니다.

menuEntries.push({
  name: "Text to columns (regular expression separator)",
  functionName:"textToColumnsRegExp"
});

그리고 참조 된 기능을 추가했습니다 :

function textToColumnsRegExp() {
  var separator = Browser.inputBox(
    "Text to column",
    "Enter the regular expression for the separator ",
    Browser.Buttons.OK);
  if (separator) {
    textToColumns(new RegExp(separator));
  }
}

Evan이 Javascript의 String.prototype.split을 사용하므로 문자열이나 RegExp 객체를 구분 기호로 사용하므로 다른 변경은 필요하지 않습니다. 에반도 그렇게!


0

또한 분리 된 값을 포함하는 배열을 제공하는 SPLIT 함수를 사용한 후 INDEX 함수를 사용하여이 배열에서 특정 행 또는 열을 분리 할 수 ​​있습니다.

=index(split(importXML("https://www.google.com/search?q=stackexchange","//div[@id='resultStats']/text()")," "),1,2,1)

예를 들어 Google 검색어에 대한 결과 수를 검색하는 데 유용 할 수 있습니다.


0

데이터 → 텍스트를 열로 나누기 ...에 도움이되는 메뉴 항목이 있습니다 .

  1. 셀을 한 번 클릭하고 데이터를 붙여 넣습니다.

    여러 행에 걸쳐 하나의 열에 만 나타납니다.

  2. 새로 채워진 셀을 강조 표시된 상태에서 데이터 → 텍스트를 열로 분할 메뉴로 이동하십시오 .

    앱에서 구분 기호를 자동 감지하면 축하합니다. 완료되었습니다.

    그렇지 않으면 분할하려는 구분 기호를 묻는 작은 위젯이 나타납니다.

    참고 :이 위젯은 창 하단 근처에 표시 되어 찾기가 조금 어려울 수 있습니다!

  3. 위젯을 사용하여 데이터를 구분할 구분 기호 (쉼표, 세미콜론, 마침표, 공백 또는 사용자 정의)를 선택하십시오.

  4. 탭으로 분할하려면 다음을 수행하십시오.

당신은 할 수 없습니다!


-1

columnToText와 동등한 것은 =JOIN(delim, array)공식 을 사용하는 것 입니다. 예를 들어 =JOIN(",", A1:A10)셀 A1에서 A10까지의 값 문자열을 연결합니다.


1
사실이지만 OP는 한 셀에 값 (쉼표로 구분)이 있다고 말했습니다.
Jacob Jan Tuinstra

유용한 정보이지만 아마도 분할 할 답변 중 하나에 주석으로 게시하는 것이 가장 좋습니다. 이것은 원래 질문에 대답하지 않기 때문입니다.
David

-1

Google 스프레드 시트의 새 버전에서는 이제 Google App Script가 더 이상 사용되지 않습니다. .

Google 애드온 갤러리전원 도구 를 사용하고 분할 기능을 사용할 수 있습니다. 잘 작동한다.


가스는 더 이상 사용되지 않습니다. 애드온 스토어로 대체되고있는 스크립트 갤러리입니다 !!
Jacob Jan Tuinstra
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.