use*_*545 1 google-apps-script
我想知道如何从2个数组中删除重复的值,并合并到一个主数组中。
不能从表或文档中仅在数组中删除此值,这就是为什么我没有使用内置函数clear()或clearContents()的原因;
香港专业教育学院还试图修改GAS教程中的removeDuplicates()函数,但它使我的行从A到Z陷入了列内,而是将行过滤掉了……真是一团糟。
笔记:
getClients()的参数来自其他函数,并且可以正常工作。
newClients从“用户”表中列出客户端,而newUsers从另一个名为“数据”表中列出用户。
两者都属于同一个电子表格。
newClients和newUsers:这两个数组仅包含字符串(用户名),并且两者中都有重复的值。
这样就确定了目标,并删除了这些值,原始值和重复值。
我认为应该更容易些,但是Im是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;
}
Run Code Online (Sandbox Code Playgroud)
更新!
答案的过滤效果很好,但是我得到的结果与我之前的尝试相同:显示过滤后的结果。我需要将它们从阵列中删除。例:
var array = ['aa','bb','aa','ff','pp', 'pp'];
filtering code...
var array = ['bb','ff'];
Run Code Online (Sandbox Code Playgroud)
我尝试添加splice()js方法,但是我通过的参数无法正常工作。
您正在处理的数组不再是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;
}
Run Code Online (Sandbox Code Playgroud)
在您的代码中,这将替换行
var uniqueData = allData.sort();
Run Code Online (Sandbox Code Playgroud)
那将变成:
var uniqueData = removeDups(allData);
Run Code Online (Sandbox Code Playgroud)
编辑:
如果遇到字母大小写问题,则可以修改此代码以将其忽略。您应该更改条件和排序功能,以便它们都忽略名称中的大小写,但最好保留原始字母大小写。
这可以通过以下代码实现:
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;
}
Run Code Online (Sandbox Code Playgroud)
记录器结果:
这是另一个仅保留唯一值的版本(我在第一个版本中无法正确理解您的请求,因为它保留了重复项中的一个元素...)
我只是添加了一个else if
条件,以删除属于重复项组的元素。(我保留了不区分大小写的版本,但您可以轻松删除它)
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;
}
Run Code Online (Sandbox Code Playgroud)
记录器结果新代码: