Googleシートは複数行のセルを新しい行に分割します(+周囲の行エントリを複製します)


14

各ビジネスの主要スタッフを含む、ビジネスアドレス情報のデータベースを作成しています。このプロジェクトのために継承したGoogleスプレッドシートには、「キースタッフ」の列(列B)が含まれ、複数のキースタッフ名が同じセルにリストされ、改行で区切られています(つまり、CHAR(10))。行ごとに1つのビジネスがあります。「キースタッフ」セルの行数は行ごとに異なります。私の最初のシートは次のようになります:

ここに画像の説明を入力してください

このシートを最適化するには、次のことを行う必要があります。

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

説明しました

スクリプトは各行、特に各行の2番目の列を評価します(JavaScript配列ではゼロベースなので、列2は配列のインデックス1に対応します)。そのセルの内容を複数の値に分割し、"\n"区切り文字(改行)として使用します。その後、既存の情報を配列に追加し、個々の結果のみを追加しk == 1)ます。インデックス1(に達した場合)。新しく準備された行は別の配列に追加され、結果を表示するために返されます。

スクリーンショット

データ
ここに画像の説明を入力してください

結果
ここに画像の説明を入力してください

私はあなたのためにサンプルファイルを作成しました:新しい行への複数行のセル[ツール]> [スクリプトエディター ]でスクリプト
を追加し、[保存]ボタンを押します。


2
Awesome awesome awesome-この男にビールを買う!Jacobに感謝します。それがまさに私が必要としていることです。
Kirkタブ2014

2
そして、どのように範囲を定義するのですか?!(おかげで「未定義から『このメッセージは長さ』プロパティを読み取ることができません」を取得
user2060451

本当に大きなファイルでは、これはおそらく失敗します...結果が大きすぎます。
カイルPennell

見事に答え、たった1つのバグ。指定された範囲の最初の列に区切り文字を含めないでください。一時的な回避策は、最初の列としてシリアル番号または静的な値を持つことです。試していませんが、最初の空白の列でも問題を解決できます。
Ashish Singh

3

再現可能なソリューションにはスクリプトが必要です。

ただし、1回限りの作業では、を使用できます =SPLIT(B3,CHAR(10))。これにより、次のように、すべての人の名前が横並びのヘルパー列に表示されます。

ここに画像の説明を入力してください

コピー/特殊貼り付け、ヘルパー列の内容を評価します。

そして、使用されるヘルパー列ごとに(おそらく、多すぎないように、「1つのビジネスに多すぎる人がいないことを願って)行のブロックを現在のブロックの末尾に手動でコピーして貼り付けます。(それは素晴らしい説明ではありませんが、ドリフトが発生します。)


こんにちはメアリー、ありがとう、しかし私は個人が必要です。人名が新しい行にドロップされ、それらに対応するために追加の行が自動生成されます)、その後、周囲の情報が新しい「人」セルの横にコピーされます。そして、私は100%自動化されたプロセスが必要です-何千ものビジネスに対して手動でこれを行うことはできません!
カークタブ2014

千のビジネス全体に対して手動の手順を実行する必要はありません。これらのビジネスのいずれか1つに関連付けられているpepoleの最大数に対してのみ実行する必要があります。たとえば、1つのビジネスに6人の従業員がいる場合、6つの新しいヘルパー列が作成されるため、手動でコピーして貼り付ける必要があります。 6回、各列に1つ。
MaryC.fromNZ 2014年

1
誰かがこのためのスクリプトを書くことができました(私はその人ではありません!)-しかし、実際にそれをテストするのに費やした時間は、おそらく手動で行う時間よりも長いでしょう。
MaryC.fromNZ 2014年

2

承認された回答で役立つカスタム関数の使用方法をすぐに理解できない可能性のある人向け:

  • 複数のシートが必要です。この例では、2つのシートはDATAおよびRESULTです。RESULTクエリが実行されるまでのシートは空です。DATAJacobのスクリーンショットで、シートを参照するクエリを確認できます。

  • ほとんどのk場合、解析するデータが見つかるはずの列を参照する8行目の比較値を変更する必要があります。同じ番号が4行目の2番目の配列値に入る必要があります。

  • 現在は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 2017年

@ user2060451この回答のソリューションは、カスタム関数のコードを示しています。これは、スクリプトエディターから実行するためのものではありません。Googleのカスタム機能ガイドへのリンクを追加しました。
ルベン・
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.