Как удалить дубликаты по строкам и циклам по столбцам в Сценариях Служб Google? - PullRequest
0 голосов
/ 04 сентября 2018

У меня есть набор данных, которые классифицируются по месяцам каждые 3 столбца. Другими словами, например, столбцы с A по C - сентябрь, столбцы с D по F - октябрь и т. д. Мне нужна помощь по удалению дубликатов в каждой строке для каждого месяца, чтобы, если данные в одной строке в столбцах A и B и C совпадали с другой строкой, удалялись дублирующиеся ячейки в этой строке. Затем это повторяется в течение следующего месяца (следующие 3 столбца 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/

Ответы [ 2 ]

0 голосов
/ 05 сентября 2018

Не уверен, является ли это наиболее эффективным, но я попробовал эту поправку к своему коду, и она работает для моих целей с тестовыми данными. Вот последний код, который я использовал.

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.

0 голосов
/ 05 сентября 2018

Попробуйте это:

Вероятно, есть много более простых способов сделать это. Но мне понравилась проблема, так что вот способ сделать это. Этот пример генерирует собственные случайные данные, поэтому вам нужно их извлечь, прежде чем запускать в своем наборе данных. Но если я вставил его правильно, и вы правильно скопировали его и сделали 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);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...