Duplicates 谷歌电子表格查找重复项并删除所有

Duplicates 谷歌电子表格查找重复项并删除所有,duplicates,google-sheets,delete-row,Duplicates,Google Sheets,Delete Row,我有一个重复行的电子表格。需要删除所有重复的行 例如: Superman superhero Batman superhero Apple fruit Superman superhero Batman superhero 运行脚本后,我只希望: Apple fruit 找到此脚本。。。也许是个好的开始 function removeDuplicateRows() { var sheet = SpreadsheetApp.getAc

我有一个重复行的电子表格。需要删除所有重复的行

例如:

Superman    superhero
Batman      superhero
Apple       fruit
Superman    superhero
Batman      superhero
运行脚本后,我只希望:

Apple       fruit
找到此脚本。。。也许是个好的开始

function removeDuplicateRows() {
  var sheet = SpreadsheetApp.getActiveSheet();
  var data = sheet.getDataRange().getValues();
  var newData = new Array();

  for(i in data){
    var row = data[i];
    var duplicate = false;

    for(j in newData){
      if(row.join() == newData[j].join()){
        duplicate = true;
      }
    }
    if(!duplicate){
      newData.push(row);
    }
  }
  sheet.clearContents();
  sheet.getRange(1, 1, newData.length, newData[0].length).setValues(newData);
}

这里是对另一个论坛中提出的稍微不同的算法的修改。需要注意的是,它将对数据进行排序,并删除重复的行(但这可以解决)

函数RemovedUpplicates和Sort()
{
var headerRow=假;
var sheet=SpreadsheetApp.getActiveSheet();
var data=sheet.getDataRange().getValues();
如果(headerRow)var header=数据拼接(0,1);
data.sort();
var计数器=0,计数器2,行;
而(计数器<(数据长度-1))
{
行=数据[计数器]。联接(“,”;
if(row==data[counter+1]。join(“,”)//将删除内容
{
计数器2=2;
while((counter+counter2)
问题在于,当前行在到达
newData
后会立即添加到该行(如果当前行不在那里),因此始终会添加一个副本。 在将当前行添加到
newData
之前,我编辑了第二个循环,以检查当前行是否存在于工作表中的任何其他位置

此解决方案不会对数据进行排序,但会将其余行移到工作表的顶部。如果你想让他们呆在原地,看看

我写了一些评论来帮助你理解

function removeDuplicates() {
  var sheet = SpreadsheetApp.getActiveSheet();
  var data = sheet.getDataRange().getValues();

  //Get the number of the last row with data
  var lastRow = sheet.getLastRow();
  var lastColumn = sheet.getLastColumn();
  var newData = new Array();
  for(i in data){

    //Our current row
    var row = data[i];

    var duplicate = 0;

    //A loop with going through all rows with data
    for(var j = 1; j <= lastRow; j++){

      //A variable with the joined data of the row to compare with our current row
      var currValue = sheet.getRange(j, 1, 1, lastColumn).getValues().join();
      if(row.join() == currValue){

        //If an occurrence of the current row exists, add 1 to the variable "duplicate"
        duplicate++;
      }
    }

    //The second loop will find the original row, so the duplicate variable will always
    //be at least 1, if any duplicates exist, it will be more and the row won't be pushed
    if(duplicate == 1){
      newData.push(row);
    }
  }
  sheet.clearContents();
  sheet.getRange(1, 1, newData.length, newData[0].length).setValues(newData);
}
函数removeDuplicates(){
var sheet=SpreadsheetApp.getActiveSheet();
var data=sheet.getDataRange().getValues();
//获取包含数据的最后一行的编号
var lastRow=sheet.getLastRow();
var lastColumn=sheet.getLastColumn();
var newData=newarray();
对于(数据中的i){
//我们当前的行
var行=数据[i];
重复变量=0;
//一个循环,用于遍历包含数据的所有行

对于(var j=1;j不确定这是您想要的,但这里有一个小脚本,它将执行一个真正特定的操作:按列删除所有重复的值(而不是跨其他列),并将非重复值保留在它们所在的位置

function eradicateDuplicate(){
  var sheet = SpreadsheetApp.getActiveSheet();
  var data = sheet.getDataRange().getValues();
  var newData = new Array();
  var cols = data[0].length;
  var objTable = {};
  for(var j in data[0]){
    objTable[j]=new Object();
  }
  for(var i in data){
    for(var j in data[i]){
      if(typeof objTable[j][data[i][j]]=="undefined"){
         objTable[j][data[i][j]]=1;
      }
      else{
        objTable[j][data[i][j]]+=1;
      }
    }
  }
  for(var i in data){
    for(var j in data[i]){
      if(objTable[j][data[i][j]]>1)data[i][j]="";
    }
  }
  sheet.getDataRange().setValues(data);
}

你自己尝试过这个脚本吗?也许你也可以添加google apps脚本标签。是的,它删除了重复项,但只保留了一个。我需要将它们都删除。预期结果如何?删除所有重复项或删除同一列中的重复项(意味着在不同的列中仍然可以存在两个具有相同内容的单元格?)仍然有数据的单元格应保留与第一次出现的单元格相同的位置,或者可以在工作表顶部重新排列。它删除了所有重复行,并保留了找到的每组重复行中的一行,我需要它删除所有重复行。
function eradicateDuplicate(){
  var sheet = SpreadsheetApp.getActiveSheet();
  var data = sheet.getDataRange().getValues();
  var newData = new Array();
  var cols = data[0].length;
  var objTable = {};
  for(var j in data[0]){
    objTable[j]=new Object();
  }
  for(var i in data){
    for(var j in data[i]){
      if(typeof objTable[j][data[i][j]]=="undefined"){
         objTable[j][data[i][j]]=1;
      }
      else{
        objTable[j][data[i][j]]+=1;
      }
    }
  }
  for(var i in data){
    for(var j in data[i]){
      if(objTable[j][data[i][j]]>1)data[i][j]="";
    }
  }
  sheet.getDataRange().setValues(data);
}