0

調査のスプレッドシートがあり、特定のユーザーが時間の経過とともにどのように変化したかを確認する必要があります。そのため、特定の列に一意の値を持つすべての行を無視する必要があります。データは次のようになります。

Response Date           Response_ID Account_ID  Q.1
10/20/2011 12:03:43 PM  23655956    1168161     8
10/20/2011 03:52:57 PM  23660161    1168152     0
10/21/2011 10:55:54 AM  23672903    1166121     7
10/23/2011 04:28:16 PM  23694471    1144756     9
10/25/2011 06:30:52 AM  23732674    1167449     7
10/25/2011 07:52:28 AM  23734597    1087618     5

ExcelVBAでこれを行う方法を見つけました。

Sub Del_Unique()
    Application.ScreenUpdating = False
    Columns("B:B").Insert Shift:=xlToRight
    Columns("A:A").Copy Destination:=Columns("B:B")
    i = Application.CountIf(Range("A:A"), "<>") + 50
    If i > 65536 Then i = 65536
    Do
        If Application.CountIf(Range("B:B"), Range("A" & i)) = 1 Then
            Rows(i).Delete
        End If
        i = i - 1
    Loop Until i = 0
    Columns("B:B").Delete
    Application.ScreenUpdating = True
End Sub

変更する必要のないスクリプトを使用して、Googleスプレッドシートでそれを実行したいと思います。私が得ることができる最も近いものは、範囲からすべての重複するユーザーIDを取得することですが、それを行に関連付けることはできません。そのコードは次のとおりです。

function findDuplicatesInSelection() {
  var activeRange = SpreadsheetApp.getActiveRange();
  var values = activeRange.getValues();

  // values that appear at least once
  var once = {};

  // values that appear at least twice
  var twice = {};

  // values that appear at least twice, stored in a pretty fashion!
  var final = [];

  for (var i = 0; i < values.length; i++) {
     var inner = values[i];
    for (var j = 0; j < inner.length; j++) {
      var cell = inner[j];
      if (cell == "") continue;
      if (once.hasOwnProperty(cell)) {
        if (!twice.hasOwnProperty(cell)) {
          final.push(cell);
        }
        twice[cell] = 1;
      } else {
        once[cell] = 1;
      }
    }
  }

  if (final.length == 0) {
    Browser.msgBox("No duplicates found");
  } else {
    Browser.msgBox("Duplicates are: " + final);
  }
}
4

3 に答える 3

0

配列を使用してシート全体を一度に処理することもできます。

function removeUnique(){
  var col = 2 ; // choose the column you want to check for unique elements
  var sh = SpreadsheetApp.getActiveSheet();
  var ss = SpreadsheetApp.getActiveSpreadsheet();
  var data=ss.getDataRange().getValues();// get all data
    data.sort(function(x,y){
//  var xp = Number(x[col]);// use these to sort on numeric values
//  var yp = Number(y[col]);
  var xp = x[col];// use these for non-numeric values
  var yp = y[col];
  Logger.log(xp+'   '+yp); // just to check the sort is OK
  return xp == yp ? 0 : xp < yp ? -1 : 1;// sort on column col numeric ascending
});
  var cc=0;
  var newdata = new Array();
  for(nn=0;nn<data.length-1;++nn){
    if(data[nn+1][col]==data[nn][col]||cc>0){
    newdata.push(data[nn]);
    ++cc;
    if(cc>1){cc=0}}
    }
  ss.getDataRange().clearContent();  // clear the sheet
  sh.getRange(1,1,newdata.length,newdata[0].length).setValues(newdata);// paste new values sorted and without unique elements
  }

編集:これはすべての複製を保持するバージョンです(作業中のもの)

function removeUnique(){
  var col = 2 ; // choose the column you want to check for unique elements
  var sh = SpreadsheetApp.getActiveSheet();
  var ss = SpreadsheetApp.getActiveSpreadsheet();
  var data=ss.getDataRange().getValues();// get all data
    data.sort(function(x,y){
//  var xp = Number(x[col]);// use these to sort on numeric values
//  var yp = Number(y[col]);
  var xp = x[col];// use these for non-numeric values
  var yp = y[col];
  Logger.log(xp+'   '+yp); // just to check the sort is OK
  return xp == yp ? 0 : xp < yp ? -1 : 1;// sort on column col numeric ascending
});
  var newdata = new Array();
  for(nn=0;nn<data.length-1;++nn){
    if(data[nn+1][col]==data[nn][col]){
    newdata.push(data[nn]);
    }
    }
    if(data[nn-1][col]==data[nn][col]){newdata.push(data[nn])}
  ss.getDataRange().clearContent();  // clear the sheet
  sh.getRange(1,1,newdata.length,newdata[0].length).setValues(newdata);// paste new values sorted and without unique elements
  }
于 2012-06-15T23:14:52.210 に答える
0

シンプルなものを選ぶことをお勧めします。

  1. 重複にフラグを立てる短いスクリプトを作成する
  2. 数式をセル「=flagDuplicate(C2,C$2:C$10)」に直接書き込みます。
  3. フォーラムを下の列にコピーします
  4. スプレッドシートに組み込まれている QUERY 式を使用して、必要な情報を取得します
    "=QUERY(A1:E10; "SELECT * WHERE E = TRUE"; 1)"

重複にフラグを立てる簡単な関数を次に示します

function flagDuplicate(value, array) {
  var duplicateCounter = 0;

   for (var i=0; i<array.length; i++){
     if (array[i] == value){           // I avoid === in Spreadsheet functions
       duplicateCounter++;
      }
   }

   if (duplicateCounter > 1){
     return true;
   }else{
     return false;
   }
}

大きなテーブルに関数が多すぎると、速度が低下する可能性があります。問題が発生した場合は、いつでも「値のみをコピーして貼り付ける」ことができます。これにより、情報は保持されますが、関数は削除されます。

幸運を祈ります。

注:これをテストしたところ、スプレッドシートが新しいカスタム関数を認識するまでに時間がかかることに気付きました(関数FLAGDUPLICATEが見つからないなどのエラーが発生します)

于 2012-06-15T21:14:23.910 に答える