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

我在 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 电子表格中使用无需更改的脚本来完成此操作。我能得到的最接近的是从该范围内检索所有重复的用户 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

我建议去做一些简单的事情。

  1. 创建一个标记重复项的简短脚本
  2. 将公式直接写入单元格“=flagDuplicate(C2,C$2:C$10)”
  3. 将论坛复制到列下
  4. 使用电子表格的内置查询公式提取您需要的信息
    "=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 回答
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

这可能不是很有效,但我认为这是你想要的:

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

于 2012-06-15T17:35:10.380 回答