web-dev-qa-db-ja.com

1つの行のコンテンツを複数の行に分割しますか?

各行に次のようなデータが含まれるテーブルがあります。

チーム名|最初のメンバー|第二メンバー|第三メンバー|チームの説明

このデータを変換/分割して、各行にメンバーが1つだけ含まれるようにすることは可能でしょうか?このような:

チーム名|最初のメンバー|チームの説明
チーム名|第二メンバー|チームの説明
チーム名|第三メンバー|チームの説明
7
Dom Delimar

TRANSPOSEを使用して列を変換できます。つまり、「最初のメンバー、2番目のメンバー、3番目のメンバー」がA1:A3であると仮定すると、どこかで関数を使用できます。

 = TRANSPOSE(A1:A3)

以下のように列を埋めます

 First member
 Second member
 Third member

チームメンバーの前後に列を繰り返すには、試してみてください。

 = TRANSPOSE (SPLIT(REPT(CONCAT(A1, ","), COUNTA(A1:A3)), ","))
 = TRANSPOSE (SPLIT(REPT(CONCAT(A5, ","), COUNTA(A1:A3)), ","))

列を区切りコンマで繰り返し、結果の配列を分割して変換します。

5
neo

Google Sheets配列処理機能とFILTERを使用して、目的の結果を取得します

=FILTER({A:A,B:B,E:E;A:A,C:C,E:E;A:A,D:D,E:E},LEN({A:A;A:A;A:A}))

注:スプレッドシートで小数点記号としてカンマ,を使用している場合は、上記の式のコンマをバックスラッシュ\に置き換えてください

2
Rubén

次のGoogle Appsスクリプトを使用する場合、自動的に実行されます。

function SPLIT() {
  var ss = SpreadsheetApp.getActiveSpreadsheet();  
  var sh0 = ss.getSheets()[0], sh1 = ss.getSheets()[1];

  // get data from sheet 1
  var data = sh0.getDataRange().getValues();

  // create array to hold data
  var aMain = new Array();

  // itterate through data and add to array
  for(var i=1, dLen=data.length; i<dLen; i++) {
    for(var j=1; j<4; j++) {
      aMain.Push([data[i][0],data[i][j],data[i][4]]);
    }
  }

  // add array of data to second sheet
  sh1.getRange(2, 1, aMain.length, 3).setValues(aMain);
}

サンプルファイルを用意しました:SPLIT開くと、2つのオプションを持つ追加のメニュー項目が作成されます。

スクリプトをシートで機能させるには、スクリプトを微調整する必要があります。メニューオプションToolsScript Editorを使用してスクリプトを追加します

1
=ARRAYFORMULA(QUERY(TRIM(SPLIT(TRANSPOSE(SPLIT(QUERY(TRANSPOSE(QUERY(TRANSPOSE(
 IF(LEN(A1:A), "♠"&A1:A&"♦"&B1:D&"♦"&E1:E, )), , 999^99)), , 999^99), 
 "♠")), "♦")), "where Col2 is not null"))

0

0
user0

Rubénの優れたソリューションに追加するために、彼の式を次のように変更すると、空のユーザーとチームごとのグループがスキップされます。

=QUERY(FILTER({A:A,B:B,E:E;A:A,C:C,E:E;A:A,D:D,E:E},LEN({A:A;A:A;A:A})),"Select * Where Not Col2='' Order by Col1 Asc")

0
Erik Tyler