web-dev-qa-db-ja.com

列の値が交互になっていることを確認します

約1500セルの列Aを持っています。各セルには「a」または「b」のいずれかが含まれます。ほとんどの場合、AsとBは交互になっていますが、値が繰り返される場合があります。

A1:A20の例は次のとおりです:{a,b,a,b,a,b,a,b,a,b,a,b,b,a,b,a,b,a,a,b}。 (私の実際のデータでは、これらの値は異なる場合がありますが、セルのリスト全体が「a」で始まり「b」で終わることが保証されています)。

列BとCには、他の値がいくつかあります(実際のスプレッドシートでは日付です)。列Aの各「a」または「b」は、同じ行の2つの日付(列Bに1つ、列Cに1つ)に対応します。

私の目標は、重複するAsとBを(以下で説明する方法で)削除し、これらの重複する値に関連付けられた日付を削除することです。 AsとBが交互に並んだリストが残っているはずです。元のデータと同じ日付に一致しています(すべての列が同期して移動します)。

重複を削除するためのルールは次のとおりです。

  • 連続して2つの「a」がある場合は、最初の「a」を削除します。
  • 2つの「b」が連続して存在する場合、2番目の「b」を削除します。
  • 3つ以上の連続したAsとBがある場合があることに注意してください。そのような場合、最初の2つを評価し、1つを削除してから、次の2つについて、1つが残るまで繰り返します。

これは何らかの方法でフィルター(おそらくクエリ?)で達成するのが最善だと思いますが、それを機能させることができなかったり、近くに見えることすらありませんでした。上記の例を使用して、A13(および対応するB13:C13)およびA18(および対応するB18:C18)を削除する必要があります。結果のA1:A20(以下の値がシフトアップされた後)は{a,b,a,b,a,b,a,b,a,b,a,b,a,b,a,b,a,b,a,b,...}になります。列Aの残りの値はすべて、列Bの元の値とペアにする必要があります。

代替の半解決策として、条件付き書式設定スクリプトを記述して重複値を強調表示することは可能でしょうか?繰り返しの値(非常に少ない)を手動で削除するのはそれほど難しくありませんが、強調表示せずに削除する値を伝えるのは非常に困難です。 「a」を1色、「b」を別の色にハイライトして、非交互パターンを探してみましたが、すぐに認識するのはまだ困難でした。

1
Kwilinsi

力ずくで実行できます:)

ここにシートがあります:https://docs.google.com/spreadsheets/d/

DからAEまでの計算を別々に入れることができますシートまたはそれらの列を非表示にする

ofcourseAF(それぞれAGAH)は、母集団に対して下にドラッグできます。 AF2:AF5を選択し、青い正方形を下にドラッグします。また、それらの列の半分をドロップすることができます-私はちょうどそれらをそこに残したので、最終結果を得るためのプロセス全体を見ることができます

0
user0

以下は、好みに合わせて学習、研究、デバッグ、変更するためのサンプルカスタム関数です。

function DupeDestroyX(range,a,b,index) {
  var j = index-1 || 0;
  for(var i=0;i<(range.length-1);i++){ //loop over all entries
    try {
      if(range[i][j]==a && range[i+1][j]==a) { // if current entry is a and next entry is also a
        range.splice(i,1); // delete current entry    
        if (range[i+1][j]==a) {i--} //If next entry is also a (after deleting),loop repeat this iteration
      }
      if(range[i][j]==b && range[i+1][j]==b) {
        range.splice(i+1,1); //delete next entry
        if (range[i+1][j]==b) {i--}
      }
    }
    catch(e) {continue;}
  }
  return range;
}

使用法:

=DupeDestroyX(A1:C,"a","b")
0
TheMaster