Скажем, у меня есть номера счетов, номера дополнительных счетов и значения в электронной таблице Google, где могут быть дубликаты номеров счетов с разными номерами дополнительных счетов:

acc no / sub acc no / val
2      /     5      /  6
3      /     10     /  8
4      /     9      /  2
2      /     14     /  1

После того, как я отсортирую весь лист по третьему столбцу, values, он будет выглядеть так:

acc no / sub acc no / val
3      /     10     /  8
2      /     5      /  6
4      /     9      /  2
2      /     14     /  1

Итак, я хочу сгруппировать все счетчики под одними и теми же учетными записями, сохранив исходную сортировку без изменений:

acc no / sub acc no / val
3      /     10     /  8
2      /     5      /  6
2      /     14     /  1
4      /     9     /  2

Похоже, что после сортировки по значениям мне нужен скрипт, который перебирает столбец «Нет учетной записи», для каждой ячейки он проверяет оставшиеся номера учетных записей, и если есть совпадающий дубликат, он будет перемещен вверх.

Вот что я пока мог придумать:

function group(){

  var sheet = SpreadsheetApp.getActiveSpreadsheet();

  // find how many accounts we have 
  var Avals = sheet.getRange("A2:A").getValues();
  var Alast = Avals.filter(String).length;

  for (var i = 0; i < Alast-2; i++) {
    if(Avals[i].toString() == Avals[i+1].toString()){
      continue;
    }
    for (var j = i+2; j < Alast; j++){
      if(Avals[i].toString() == Avals[j].toString()){
        //move
        break;
      }
    }   
  }
}

Заранее спасибо!

0
drillau 25 Апр 2018 в 18:18

1 ответ

Лучший ответ

Это образец сценария. Не проверено. Предполагается, что лист уже отсортирован по столбцу C.

function group(){
  var sheet = SpreadsheetApp.getActiveSpreadsheet().getActiveSheet();
  // find how many accounts we have 
  //get A2:C range& values
  var rng = sheet.getRange(2,1,sheet.getLastRow()-1,3);
  var val = rng.getValues();
  var data =[];//output array
  var k=0; //data array new row count
  //loop through existing rows
  for(i=0;i<val.length;i++){
    //if A is not empty, new k row data array = original row.
    if (val[i][0]) { //value check
      data[k] = val[i];
      k++; //increment k to next row
    //Loop through rows after current row to find next  similar A value,if any
    for(j=i+1;j<val.length;j++) { 
      if (val[i][0] == val[j][0]) { //if one of the folllowing row's A value is == current A value
        data[k] =val[j].slice(0); //new k data array = j row
        k++; //increment k
        val[j][0] =''; //set  the duplicate  j row's A value to null to skip during value check 
      }
    }
   }
  }
//Logger.log(data);
sheet.getRange(2,1,data.length,data[0].length).setValues(data);
}
1
TheMaster 27 Апр 2018 в 16:19