Arrays 如何在不删除公式其他列的情况下删除重复项?
这是我的简单表格:Arrays 如何在不删除公式其他列的情况下删除重复项?,arrays,google-apps-script,google-sheets,Arrays,Google Apps Script,Google Sheets,这是我的简单表格: Col A: Col B: Col C: Col D: 010Mar0100 Link =mid(A2,find(".",A2)-10,10) =vlookup(C2,MAIN!B:B,1,false) 010Mar0110 Link =mid(A3,find(".",A3)-10,10) =vlookup(C3,MAIN!B:B,1,false) 020Mar0100 Link
Col A: Col B: Col C: Col D:
010Mar0100 Link =mid(A2,find(".",A2)-10,10) =vlookup(C2,MAIN!B:B,1,false)
010Mar0110 Link =mid(A3,find(".",A3)-10,10) =vlookup(C3,MAIN!B:B,1,false)
020Mar0100 Link =mid(A4,find(".",A4)-10,10) =vlookup(C4,MAIN!B:B,1,false)
020Mar0100 Link =mid(A5,find(".",A5)-10,10) =vlookup(C5,MAIN!B:B,1,false)
030Mar0100 Link =mid(A6,find(".",A6)-10,10) =vlookup(C6,MAIN!B:B,1,false)
列C和D有我需要的返回值的公式。
A列和B列每天刷新
我想添加一个脚本来删除重复项,而不删除C列和D列中的公式
每次我使用这个脚本,它都会这样做
function removeDuplicates() {
var ss = SpreadsheetApp.getActive();
var sheet = ss.getSheetByName('Data');
var rng = sheet.getRange("A2:B")
var data = rng.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);
}
}
rng.clearContents();
sheet.getRange(1, 1, newData.length,
newData[0].length).setValues(newData);
}
我需要做什么改变才能让它只关注A列和B列 解决方案 您要做的就是从列表中过滤出非唯一的元素。如果我正确理解您希望保持列
C
和D
的完整性,您只需要通过引入辅助函数(顺便说一句,包括需要,如果这不是一个新项目)和设置值
在同一rng
(请参见下面的改进3)使您的逻辑更加清晰
/**
*删除重复项
*@param{any[]}数组二维输入
*@返回{any[]}个筛选输入
*/
常量筛选器副本=(数组)=>{
常量堆栈=[];
返回数组.filter(元素=>{
常量连接=元素连接(“”);
if(堆叠包括(连接)){
返回false;
}
堆叠。推动(连接);
返回true;
});
};
const[input,output,tbody,tbody_init]=document.queryselectoral(“#input,#output,#grid#u init,#grid”);
const buildCellGrid=(父级,网格)=>{
parent.innerHTML='';
用于(网格的常量行){
const tr=document.createElement('tr');
for(行的常量单元格){
const td=document.createElement('td');
td.textContent=单元格;
tr.append(td);
}
父项追加(tr);
}
};
input.addEventListener('change',event=>{
const{value}=event.target;
const parsedVal=JSON.parse(值);
const filtered=filterdupplicates(parsedVal);
output.textContent=JSON.stringify(过滤,空,”);
buildCellGrid(tbody_init,过滤);
buildCellGrid(tbody,parsedVal);
});代码>
p,textarea{
利润率:0.2vw;
}
文本区{
填充:2vh 2vw;
线高:2;
调整大小:无;
宽度:125px;
高度:125px;
}
桌子{
利润率:2vh 2vw;
边界塌陷:塌陷;
}
th,td{
填充:1vh;
边框:1px实心暗灰色;
}
输入有效的二维数组
首字母
过滤
解决方案
您要做的就是从列表中过滤出非唯一的元素。如果我正确理解您希望保持列C
和D
的完整性,您只需要通过引入辅助函数(顺便说一句,包括需要,如果这不是一个新项目)和设置值
在同一rng
(请参见下面的改进3)使您的逻辑更加清晰
/**
*删除重复项
*@param{any[]}数组二维输入
*@返回{any[]}个筛选输入
*/
常量筛选器副本=(数组)=>{
常量堆栈=[];
返回数组.filter(元素=>{
常量连接=元素连接(“”);
if(堆叠包括(连接)){
返回false;
}
堆叠。推动(连接);
返回true;
});
};
const[input,output,tbody,tbody_init]=document.queryselectoral(“#input,#output,#grid#u init,#grid”);
const buildCellGrid=(父级,网格)=>{
parent.innerHTML='';
用于(网格的常量行){
const tr=document.createElement('tr');
for(行的常量单元格){
const td=document.createElement('td');
td.textContent=单元格;
tr.append(td);
}
父项追加(tr);
}
};
input.addEventListener('change',event=>{
const{value}=event.target;
const parsedVal=JSON.parse(值);
const filtered=filterdupplicates(parsedVal);
output.textContent=JSON.stringify(过滤,空,”);
buildCellGrid(tbody_init,过滤);
buildCellGrid(tbody,parsedVal);
});代码>
p,textarea{
利润率:0.2vw;
}
文本区{
填充:2vh 2vw;
线高:2;
调整大小:无;
宽度:125px;
高度:125px;
}
桌子{
利润率:2vh 2vw;
边界塌陷:塌陷;
}
th,td{
填充:1vh;
边框:1px实心暗灰色;
}
输入有效的二维数组
首字母
过滤
在D列之后添加一列,并在该列中添加此函数。它基本上会根据A列和B列中的值将唯一/重复文本添加到唯一或双精度的行中。在If函数之前,您甚至可以使用ArrayFormula
=数组公式(如果(COUNTIFS($A$1:$A1,A1,$B$1:$B1,B1)=1,“唯一”,“重复”))
填充此列后,您可以只筛选列E上具有“唯一”的行,并且您的所有唯一行的公式都将保持不变
现在,老实说,我把这些信息上网了。我试图研究它以供参考,但无法再次找到。在D列之后添加一列,并在该列中添加此函数。它基本上会根据A列和B列中的值将唯一/重复文本添加到唯一或双精度的行中。在If函数之前,您甚至可以使用ArrayFormula
=数组公式(如果(COUNTIFS($A$1:$A1,A1,$B$1:$B1,B1)=1,“唯一”,“重复”))
填充此列后,您可以只筛选列E上具有“唯一”的行,并且您的所有唯一行的公式都将保持不变
现在,老实说,我把这些信息上网了。我试图研究它以供参考,但无法再次找到。getValues()
返回一个2D数组。如果要删除重复的行,则必须删除内部数组(外部数组的元素,它们是重复的)
您可以使用和这样做:
函数removeDuplicates(){
var ss=SpreadsheetApp.getActive();
var sheet=ss.getSheetByName('Data');
var rng=sheet.getRange(“A2:B”)
var data=rng.getValues();
var uniqueRows=data.reduce((唯一,行)=>{
var duplicate=unique.some(uniqueRow=>JSON.stringify(uniqueRow)==JSON.stringify(row));
如果(!duplicate)unique.push
const remD = () =>
SpreadsheetApp.getActive()
.getSheetByName('Data')
.getRange('A2:B')
.removeDuplicates();