我有一组数据,每3列按月分类。换句话说,例如A到C列是9月,D到F列是10月,依此类推。我希望获得有关删除每月每一行中重复项的帮助,以便如果A和B和C列中一行的数据与另一行匹配,则该行中的重复单元格将被删除。然后在下个月重复进行此操作(接下来的三列D,E和F)。
到目前为止,我仅设法找到了在特定范围内删除重复行的脚本,但是没有找到如何删除行中重复的单元格并循环每隔几列的脚本。
这是我到目前为止用于删除特定范围内重复行的代码:
function deleteDuplicates() {
var ss = SpreadsheetApp.getActiveSpreadsheet();
var source = "Master";
var sourceSheet = ss.getSheetByName(source);
var sourceRange = sourceSheet.getRange(3, 1, sourceSheet.getLastRow(), 3)
var sourceData = sourceRange.getValues();
var keepData = new Array();
var deleteCount = 0;
for(i in sourceData) {
var row = sourceData[i];
var duplicate = false;
for(j in keepData) {
if(row[0] == keepData[j][0] &&
row[1] == keepData[j][1] &&
row[2] == keepData[j][2]) {
duplicate = true;
}
}
if(!duplicate) {
keepData.push(row);
}
}
sourceRange.clear();
sourceSheet.getRange(3, 1, keepData.length,
keepData[0].length).setValues(keepData);
}
我对脚本编写还很陌生,因此非常感谢您提供有关修改此脚本或新输入的帮助。谢谢。
更新:这是我的Google表格中的示例数据,如果它更清楚的话。 https://docs.google.com/spreadsheets/d/1IDcBlzFj6992RvMXS3TOyqaS5HsSRqjxk5HXsnYrGkA/
答案 0 :(得分:0)
尝试一下:
可能有很多更简单的方法可以做到这一点。但是我喜欢这个问题,所以这是解决问题的方法。此示例生成的是自己的随机数据,因此您需要先将其取出,然后再在数据集上运行它。但是,如果我正确粘贴了它,并且您正确地复制了它,并制作了Sheet2使其可以工作,那么它应该可以正常运行。如果没有,请准备好自行调试。
顺便说一下,它还有一些无关紧要的注释和结果,以便我弄清楚它是否有效。祝好运。另外,我还没有尝试过,但是如果月份出现在连续的列中,我认为这并不在意。
function removeDupesInGroups(){
var ss=SpreadsheetApp.getActive();
var sh=ss.getSheetByName('Sheet2');
generateContent(3,1,100,9);
var rg=sh.getRange(1,1,sh.getLastRow(),9);
var vA=rg.getValues();
var hdr={};
var dA=[];
for(var j=0;j<vA[0].length;j++){
if(!hdr.hasOwnProperty(vA[0][j])){
hdr[vA[0][j]]=[];
hdr[vA[0][j]].push(j);
}else{
hdr[vA[0][j]].push(j);
}
}
var n=0;
for(key in hdr){
var m=key;
var uA=[];
for(var i=2;i<vA.length;i++){
var tA=[];
for(var j=0;j<vA[i].length;j++){
var elements=hdr[key].join(',');
if(hdr[key].indexOf(j)>-1){
tA.push(vA[i][j]);
}
}
if(i<vA.length){
if(!isArrayContained(uA,tA)){
uA.push(tA);
}else{
sh.deleteRow(i - n + 1);
dA.push([Utilities.formatString('n=%s,i=%s,deleeting row %s,key=%s,group=%s',n,i,i-n+1,key,tA.join('|'))]);
sh.getRange(1, 10).setValue(Utilities.formatString('n=%s,i=%s,deleeting row %s,group=%s',n,i,i-n+1,tA.join(',')));
n++;
}
}
}
}
var resultrg=sh.getRange(sh.getLastRow()+2,1,dA.length,1).setValues(dA);
}
function isArrayContained(c,t){
for(var i=0;i<c.length;i++){
var isEqual=true;
for(var j=0;j<c[i].length;j++){
var t1=c[i][j];
var t2=t[j];
if(c[i][j]!=t[j]){
isEqual=false;
break;
}
}
if(isEqual){
return true;
}
}
return false;
}
function generateContent(row,col,rows,cols){
var ss=SpreadsheetApp.getActive();
var sh=ss.getSheetByName('Sheet2');
sh.getDataRange().clearContent();
sh.getRange(1,1,2,9).setValues([['Jan','Jan','Jan','Feb','Feb','Feb','Mar','Mar','Mar'],['Header','Header','Header','Header','Header','Header','Header','Header','Header']])
var rg=sh.getRange(row,col,rows,cols);
var vA=rg.getValues();
var s="For the Lamb on the Throne will be their Shepard.";
for(var i=0;i<vA.length;i++){
for(var j=0;j<vA[i].length;j++){
vA[i][j]=s.charAt(Math.floor(Math.random() * s.length+1));
}
}
rg.setValues(vA);
}
答案 1 :(得分:0)
不确定这是否是最有效的方法,但是我尝试对代码进行此修订,并且它可以用于测试数据。这是我使用的最终代码。
function deleteDuplicates() {
var ss = SpreadsheetApp.getActiveSpreadsheet();
var source = "Master";
var sourceSheet = ss.getSheetByName(source);
for (var a=1; a<=19; a+=3){
var sourceRange = sourceSheet.getRange(3, a, sourceSheet.getLastRow(), 3)
var sourceData = sourceRange.getValues();
var keepData = new Array();
var deleteCount = 0;
for(i in sourceData) {
var row = sourceData[i];
var duplicate = false;
for(j in keepData) {
if(row[0] == keepData[j][0] &&
row[1] == keepData[j][1] &&
row[2] == keepData[j][2]) {
duplicate = true;
}
}
if(!duplicate) {
keepData.push(row);
}
}
sourceRange.clear();
sourceSheet.getRange(3, a, keepData.length,
keepData[0].length).setValues(keepData);
}
它基本上从a列开始,并向其添加3,这将更改源范围并循环直到到达19列。