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


32

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

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

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

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

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


google-apps-scriptタグを追加した理由は何ですか?答えは当てはまりましたか?
ジェイコブヤントゥインストラ

1
@JacobJanTuinstraこの機能は、Google Apps Scriptingを介して追加できるためです。最終的に、スクリプトギャラリーにある「テキストから列へ」スクリプトを作成して、自分の問題を解決しました。Googlegooruもここでその使用を実証するビデオチュートリアルを掲載googlegooru.com/text-columns-google-spreadsheets
エヴァンプライス

Googleスプレッドシートで既に提供されているソリューションとの違いは何ですか:SPLIT。値が設定されている?知っている値を貼り付けることができます。
ジェイコブヤントゥインストラ

@JacobJanTuinstra最初のソリューションでは、B2をB3にコピーしてみてください。結果セルには、生データではなく継続式が含まれます。スクリプトから出力されたセルには実際の生データが含まれているため、問題なくコピー/移動できます。この質問の目的は、Excelの「テキストから列へ」機能に相当するものを見つけることです。Googleが公式にサポートを追加するまで、スクリプトはこれから実現する予定です。
エヴァンプライス

1
@Rubén安定性のために。以前に確認したところ、スクリプトは完全に削除されたという印象を受けました。結局のところ、彼らはスクリプトギャラリーを殺しただけです。これは最も単純なスクリプト可能なソリューションであるため、私はあなたがお勧めした答えに行きます。フィードバックをお寄せいただきありがとうございます。
エヴァンプレイス

回答:


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

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

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


ニース... UIを拡張せずにどのように呼び出すのですか。使用法を示す簡単な例を追加できますか?
エヴァンプライス

17

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

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

使用法:

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

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


スクリプトギャラリーからこれをインストールしたばかりで、機能しませんでした。[ツール]→[スクリプトマネージャー]→[編集]ボタンに移動し、各関数定義の右中括弧の後にセミコロンを追加して修正しました。スクリプトをありがとう。
ボブエスポンジャ

@bobesponjaヘッズアップをありがとう。Googleスクリプトには、インポートされたスクリプトからのイベントトリガーが正しく登録されないというバグがあります。修正するには、onOpenトリガーを手動で追加します。
エヴァンプライス

スクリプトギャラリーには表示されません。まだそこにありますか?
エレンスペルタス14

1
@espertusは、Googleがスクリプトギャラリーを削除して、新しいアドオンを支持したようです。上記のコードをスクリプトにコピーし、ドキュメントを閉じてから再度開くだけで、動作するはずです。
エヴァンプライス14

これが機能しないいくつかのエッジケースがあります。 1,421,873,190,017,370,000,000,000 1.42E+24 そのcsv行は9列に分割されるはずでしたが、1列に分割されました。
15

3

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)。この部分はすべて自動的に作成されました。


2
これはコメントですか、それとも解決策ですか?
ジェイコブヤントゥインストラ

2

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


私は普通のペーストでそれを試しましたが、うまくいきませんでした。ブラウザの「貼り付けと一致スタイル」を使用した貼り付けは機能します(Chrome / MacOS)
nhed

1
シンプルなctrl + vで完璧に機能しました。これが最も簡単な解決策であるように思えます!
ディディエL

1

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


0

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

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

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


0

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

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

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

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

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

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

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

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

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

できません!


-1

また、columnToTextに相当するのは、=JOIN(delim, array)式を使用することです。たとえば=JOIN(",", A1:A10)、セルA1〜A10の値の文字列を連結した結果になります。


1
それは本当ですが、OPは1つのセルに値(カンマ区切り)があると言いました。
ジェイコブヤントゥインストラ

有用な情報ですが、おそらく、分割する回答の1つの下にコメントとして投稿するのが最適でしょう。これは元の質問に答えないためです。
デビッド

-1

Googleスプレッドシートの新しいバージョンでは、Google App Scriptsは廃止されました

Googleアドオンギャラリーパワーツールを使用して、分割機能を使用できます。うまくいきます。


GASは非推奨ではありません。アドオンストアに置き換えられているのはスクリプトギャラリーです!!
ジェイコブヤントゥインストラ
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.