web-dev-qa-db-ja.com

Googleスプレッドシートでのテキストから列への変換

Googleスプレッドシートでテキストから列への変換はどのように行いますか?

たとえば、1つのセルに次のデータ文字列があります。

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

カンマ区切りで列に分割します。

編集:承認済みの回答を、Googleがその能力を弱体化することで地獄に曲がったように見えるため、Google Apps Scriptingを使用しない回答に変更しました。

32
Evan Plaice

次の式はまさにそれを行います。テキストから列へ:

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;","))

PDATE 03-02-201
A1の結果を分割して値を貼り付けると、OPの回答で使用されるすべてのコード行と同じ結果が得られます。 Google Apps Scriptでも試してみましたが、これが私が作成したものです:text to column

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

組み込みのsplit関数を使用して結果を分割し、それをシートに追加するだけです。それ以上でもそれ以下でもありません。

14

Google Apps Scriptingを活用してUIを拡張する

Text to Columnsは非常に便利な機能であり、多くのGoogleスプレッドシートユーザーがExcelを使用するようになった理由の1つです。 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);
}

スクリプトエディターを保存して閉じます。次に、スプ​​レッドシートを更新します。読み込みには数秒かかりますが、ツールバーの「ヘルプ」の後に「詳細」ポップアップというメニューが表示されます。

使用法:

  • 分割する値を含むセルを選択します
  • 詳細列へのテキストを選択します

それでおしまい。また、カスタム区切り文字を使用して(「テキストから列(カスタム)」を介して)分割を行い、プロセスを逆に(「列からテキスト」を介して)行うこともできます。

17
Evan Plaice

Split関数を使用しましたが、continue式も使用し、A列のテキストから適切な間隔でBCDE列に正確に変換するため、完全に機能しました。

私の例:

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

B1の結果はtext1です。 C1の結果はtext2 D1の結果はdate1 E1の結果はnumber1です。

日付は6月1日と綴られており、01/06に変換されているため、形式を処理します。

セルBCDEで使用される分割式は、CONTINUE(B1; 1; 2)CONTINUE(B1; 1; 3)CONTINUE(B1; 1; 4)です。この部分はすべて自動的に作成されました。

3
user46580

Csvデータをtsv(タブ区切り値)に変換します。
それを貼り付けます。

2
Ujjwal Singh

私はAppsスクリプトを使用したEvanの答えが本当に好きで、少し改善しました。正規表現の区切り文字の一致のサポートを追加しました。 onOpenのmenuEntriesに追加したもの:

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オブジェクトを受け入れます。エヴァンを称賛します!

1
James Synge

さらに、分離された値を含む配列を提供するSPLIT関数を使用した後、INDEX関数を使用してこの配列から特定の行または列を分離できます。

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

たとえば、Googleクエリの結果数を取得するのに役立ちます

0
Giorgio M

これに役立つメニュー項目があるようです:データ→テキストを列に分割...

  1. セルをシングルクリックして、データを貼り付けます。

    複数行にわたって表示されますが、1列のみです。

  2. 新しく読み込まれたセルを強調表示したまま、メニューに移動しますデータ→テキストを列に分割...

    アプリがセパレーターを自動検出できた場合は、おめでとうございます。完了です!

    そうでない場合は、分割するセパレーターを尋ねる小さなウィジェットが表示されます。

    注:このウィジェットはウィンドウの下部近くに表示される場合があり、見つけにくい場合があります!

  3. ウィジェットを使用して、データの区切り文字をコンマ、セミコロン、ピリオド、スペース、またはカスタムで選択します。

  4. タブで分割する場合:

You can't!

0
joeytwiddle