Google apps script 删除数组Google Apps脚本中的重复值

Google apps script 删除数组Google Apps脚本中的重复值,google-apps-script,Google Apps Script,我想知道如何从2个数组中删除重复的值,并将其合并到一个主数组中 这些值不能从工作表或文档中删除,只能在数组中删除,这就是为什么我没有使用clear()或clearContents()内置函数的原因 我还试图修改GAS教程中的函数,但它在A到Z的列中抛出行,而不是过滤行…一团混乱 注意事项: getClients()中的参数来自其他函数,工作正常 newClients列出工作表“用户”中的客户,newUsers列出另一个工作表“数据”中的用户 两张表都属于同一个电子表格 newClients和ne

我想知道如何从2个数组中删除重复的值,并将其合并到一个主数组中

这些值不能从工作表或文档中删除,只能在数组中删除,这就是为什么我没有使用clear()或clearContents()内置函数的原因

我还试图修改GAS教程中的函数,但它在A到Z的列中抛出行,而不是过滤行…一团混乱

注意事项:

getClients()中的参数来自其他函数,工作正常

newClients列出工作表“用户”中的客户,newUsers列出另一个工作表“数据”中的用户

两张表都属于同一个电子表格

newClients和newUsers:两个数组都只包含字符串(用户名),并且都有重复的值

因此,确定目标并删除这些值,原始值和副本

我想应该更容易些,但我是JS新手,所以我尝试过的所有东西都没用

谢谢

代码

function getAllClientsFromData(body,project){

  var ss = SpreadsheetApp.getActiveSpreadsheet();

  // Active the Sheets
  var sheet= ss.getSheets()[1,3];

  // Access data in Sheet "Data"
  var rangeC = ss.getRangeByName("clients"); //A:2:C273  
  var rangeU = ss.getRangeByName("names"); //A5:A

  var clients = rangeC.getValues();
  var users   = rangeU.getValues();

  var lastRow = sheet.getLastRow()-2;

  body += "<h2>Total of " + lastRow + " clients in " + project + "</h2>" 
  body += "<table style=" + STYLE.TABLE + ">";
  body += getClients(ss,clients,users,project);
  body += "</table>";

  return body;  

}

function getClients(ss,clients,users,project){

  var body = "";

  var newClients = [];

  for( var g = 0; g < clients.length; g++ ){

    var currentProject = clients[g][2];

    if( clients[g]!= "" ){

       newClients.push(clients[g][0]);

    } 

  } // end for

  var newUsers = []; 

  for( var u = 0; u < users.length; u++ ){

    if( users[u] != "" ){    

      newUsers.push(users[u][0]);

    }

  } // end for

  var allData = newUsers.concat(newClients);

  var uniqueData = allData.sort();

  body += "<tr><td style=" + STYLE.TD + ">" + uniqueData.join("</td><tr><td style=" + STYLE.TD + ">") + "</td></tr></tr>";

  return body;

}

我尝试添加splice()js方法,但我传递的参数无法正常工作。

在代码中,您没有做任何事情来过滤重复的值。 此行只对数据进行排序,不会提供唯一的数据

var uniqueData = allData.sort(); 
“安装”2DArray lib后,可以在合并阵列上执行类似操作:


另一个选项是创建循环并检查重复值,但在进行这些匹配之前,您应该记住将字符串的所有值转换为小写。

您正在处理的数组不再是2D数组,因为您在排序之前提取了字段。。。因此,您可以使用一个非常简单的重复删除功能,如下所示,通过一个示例和一些添加的
Logger.log
来查看它是如何工作的

function test(){
  var array = ['aa','bb','cc','aa','dd','cc']
  Logger.log(removeDups(array));
}

function removeDups(array) {
  var outArray = [];
  array.sort():
  outArray.push(array[0]);
  for(var n in array){
    Logger.log(outArray[outArray.length-1]+'  =  '+array[n]+' ?');
    if(outArray[outArray.length-1]!=array[n]){
      outArray.push(array[n]);
    }
  }
  return outArray;
}
在您的代码中,这将替换该行

var uniqueData = allData.sort();
这将成为:

var uniqueData = removeDups(allData);

编辑:

如果字母大小写是一个问题,您可以修改此代码以忽略它。您应该更改条件和排序函数,以便它们都忽略您姓名中的大小写,但最好保留原始字母大小写

这可以通过以下代码实现:

function test(){
  var array = ['aa','bb','Cc','AA','dd','CC'];// an example with Upper and Lower case
  Logger.log(removeDups(array));
}

function removeDups(array) {
  var outArray = [];
  array.sort(lowerCase);
  function lowerCase(a,b){
    return a.toLowerCase()>b.toLowerCase() ? 1 : -1;// sort function that does not "see" letter case
  }
  outArray.push(array[0]);
  for(var n in array){
    Logger.log(outArray[outArray.length-1]+'  =  '+array[n]+' ?');
    if(outArray[outArray.length-1].toLowerCase()!=array[n].toLowerCase()){
      outArray.push(array[n]);
    }
  }
  return outArray;
}
记录器结果:


编辑2: 这里是另一个只保留唯一值的版本(在第一个版本中,我没有正确理解您的请求,因为它保留了重复项中的一个元素…)

我只是简单地添加了一个
else if
条件来删除作为一组重复项的一部分的元素。(我保留了不区分大小写的版本,但您可以轻松地删除它)

功能测试(){
var数组=['aa','dd','hh','aa','bb','Cc','Cc','Cc','bb','nn','bb','aa','dd','Cc'];//大小写示例
Logger.log('原始数组='+数组);
log('unique result='+removeDups2(数组));
}
函数removeDups2(数组){
var uniqueArray=[]
array.sort(小写);
函数小写(a,b){
返回a.toLowerCase()>b.toLowerCase()?1:-1;//对不“查看”字母大小写的函数进行排序
}
var-temp=数组[0];

对于(var n=1;n当你说“它不起作用”时,实际的输出或错误是什么?只有在
outArray[outArray.length-1]
和最后一个if语句中的
array[n]
末尾应用了
.toString()
之后才对我起作用。非常感谢!我不得不做一个更改/添加(我对JS几乎一无所知)。我一直得到
function(){return this.filter(function(value,index,self){return self.indexOf(value)==index;})}?
所以我把
if(outArray[outArray.length-1]!=array[n]&&n!=“unique”)改为
if(outArray[outArray.length-1]!=array[n]&&n!=“unique”)
。我不知道是什么导致了这个问题,也不知道我的“修复”是否合适,所以我想让你运行它。再次感谢!
var uniqueData = removeDups(allData);
function test(){
  var array = ['aa','bb','Cc','AA','dd','CC'];// an example with Upper and Lower case
  Logger.log(removeDups(array));
}

function removeDups(array) {
  var outArray = [];
  array.sort(lowerCase);
  function lowerCase(a,b){
    return a.toLowerCase()>b.toLowerCase() ? 1 : -1;// sort function that does not "see" letter case
  }
  outArray.push(array[0]);
  for(var n in array){
    Logger.log(outArray[outArray.length-1]+'  =  '+array[n]+' ?');
    if(outArray[outArray.length-1].toLowerCase()!=array[n].toLowerCase()){
      outArray.push(array[n]);
    }
  }
  return outArray;
}
function test(){
  var array = ['aa','dd','hh','aa','bb','Cc','cc','cc','bb','nn','bb','AA','dd','CC'];// an example with Upper and Lower case
  Logger.log('original array = '+array);
  Logger.log('unique result = '+removeDups2(array));
}


function removeDups2(array) {
  var uniqueArray = []
  array.sort(lowerCase);
  function lowerCase(a,b){
    return a.toLowerCase()>b.toLowerCase() ? 1 : -1;// sort function that does not "see" letter case
  }
  var temp = array[0];
  for(var n=1 ;n<array.length ; n++){
    Logger.log(temp+'  =  '+array[n]+' ?');
    if(temp.toLowerCase()!=array[n].toLowerCase()){
      uniqueArray.push(array[n]);
      temp = array[n];
    }else if(uniqueArray[uniqueArray.length-1]==temp){
      uniqueArray.pop();// remove it from result if one of the duplicate values
    }
  }
  return uniqueArray;
}