如何删除具有唯一值的行,保留具有重复值的行?

时间:2012-06-14 14:21:45

标签: javascript excel google-apps-script google-sheets

我有一份调查电子表格,其中我需要了解特定用户随时间的变化情况。因此,我需要忽略特定列中具有唯一值的所有行。数据如下所示:

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

我在Excel VBA中找到了一种方法:

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 Spreadsheets中使用不必更改的脚本。我能得到的最接近的是从范围中检索所有重复的用户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);
  }
}

3 个答案:

答案 0 :(得分:0)

这可能效率不高,但我认为这就是你想要的:

var ar=[1,3,3,5,6,8,6,6];

console.log("Before:");
display(ar);//1 3 3 5 6 8 6 6
var index=[];
var ar2=[];
for(var a=0;a<ar.length;a++)
{
    var duplicate=false;
    for(var b=0;b<ar.length;b++)
    {
        if(ar[a]==ar[b]&&a!=b)
        {
            duplicate=true;
        }
    }
    if(!duplicate)
    {
        index.push(a);
    }
}
for(var a=0;a<index.length;a++)
{
    ar[index[a]]=null;
}
for(var a=0;a<ar.length;a++)
{
    if(ar[a]!=null)ar2.push(ar[a]);
}
console.log("After:");
display(ar2);//3 3 6 6 6

function display(x)
{
    for(var a=0;a<x.length;a++)console.log(x[a]);
}

小提琴:http://jsfiddle.net/mageek/6AGQ4/

作为功能的较短版本:

var ar=[1,3,3,5,6,8,6,6];

function removeUnique(x)
{
    var index=[];
    var ar2=[];
    for(var a=0;a<ar.length;a++)
    {
        var duplicate=0;
        for(var b=0;b<ar.length;b++)if(ar[a]==ar[b]&&a!=b)duplicate=1;
        if(!duplicate)index.push(a);
    }
    for(var a=0;a<index.length;a++)ar[index[a]]=null;
    for(var a=0;a<ar.length;a++)if(ar[a]!=null)ar2.push(ar[a]);
    return x;
}

ar=removeUnique(ar);

小提琴:http://jsfiddle.net/mageek/6AGQ4/2

答案 1 :(得分:0)

我建议选择简单的事情。

  1. 创建标记重复项的短脚本
  2. 将公式直接写入单元格“= flagDuplicate(C2,C $ 2:C $ 10)”
  3. 将论坛栏复制到专栏
  4. 使用电子表格内置的QUERY公式来提取您需要的信息 “= QUERY(A1:E10;”SELECT * WHERE E = TRUE“; 1)”
  5. 这是一个标记重复的简单函数

    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)

答案 2 :(得分: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
  }