как отсортировать 2D-массив в скрипте приложений Google/таблице Google

У меня есть электронная таблица Google, которая содержит несколько данных, распределенных по различным столбцам (например, 6 столбцов — номер телефона, IMEI, URL-адрес, идентификатор, номер регистрации и время), и у меня есть 15 000 строк данных.

Мне нужно найти/показать все повторяющиеся номера телефонов (столбец 0) и связанные с ними данные на новом листе.

Однако, когда я пытаюсь отсортировать данные, он выдает мне ошибку, например

"Метод сравнения нарушает свой общий контракт. (строка 6, файл "Код")"

Код показан ниже для справки:

function myFunction() {

  var values  = SpreadsheetApp.getActiveSpreadsheet().getSheetByName('DUP').getDataRange().getValues()

  var dupData = new Array();

  values.sort(function sortFunction(a, b) {
    if (a[0] === b[0]) {
        return 0;
    }
    else {
        return (a[0] < b[0]) ? -1 : 1;
    }
});

  for(i=1;i<values.length;i++)
  {
    if (values[i][0] == values[i+1][0]) {
        dup.push(values[i]);
    }
  }

   var new1 = dpnum.getSheetByName('Test123');
  new1.getRange(1,1,dup.length,dup[0].length).setValues(dup);

}

person Lohit Upadhyaya    schedule 20.07.2016    source источник
comment
Ваш скрипт работает правильно в моей электронной таблице. Пожалуйста, дайте ссылку на общую таблицу, в которой возникает проблема.   -  person    schedule 20.07.2016
comment
docs.google.com/spreadsheets/d/   -  person Lohit Upadhyaya    schedule 22.07.2016
comment
docs.google.com/spreadsheets/d/ @PeterSmith могу ли я получить ваш почтовый идентификатор, чтобы я мог поделиться аналогичной таблицей   -  person Lohit Upadhyaya    schedule 22.07.2016


Ответы (1)


Ваш код можно упростить следующим образом (комментарии в коде):

function myFunction() {
  var values  = SpreadsheetApp.getActiveSpreadsheet().getSheetByName('DUP').getDataRange().getValues()  
  var dupData = new Array();  
  values.sort(function(x,y){  // sort on first column
    var xp = x[0];
    var yp = y[0];
    return xp < yp ? -1 : xp > yp ? 1 : 0;// return 0 if equal, 1 if > and -1 if <
  });  
  for(var i=1 ; i<values.length ; i++){
    if (values[i-1][0] == values[i][0]) { // I changed the index as well to keep only valid data
      dup.push(values[i]);
    }
  } 
  var new1 = dpnum.getSheetByName('Test123');
  new1.getRange(1,1,dup.length,dup[0].length).setValues(dup);  
}
person Serge insas    schedule 20.07.2016
comment
большое спасибо за ваше время .. я пробовал следующие коды, но все равно они не работают .. моя главная цель - найти повторяющиеся номера телефонов вместе с другими пятью связанными данными с номером телефона .. пожалуйста, помогите мне с кодом - person Lohit Upadhyaya; 21.07.2016
comment
сообщение об ошибке // Метод сравнения нарушает свой общий контракт. (строка 7, код файла) Закрыть - person Lohit Upadhyaya; 21.07.2016
comment
function myFunction() { var values ​​= SpreadsheetApp.getActiveSpreadsheet().getSheetByName('DUP').getDataRange().getValues() var dupData = new Array(); values.sort(function(x,y){ var xp = x[0]; var yp = y[0]; return xp ‹ yp ? -1 : xp › yp ? 1 : 0; }); for(var i=1 ; i‹values.length ; i++){ if (values[i-1][0] == values[i][0]) { dupData.push(values[i]); } } var new1 = SpreadsheetApp.getActiveSpreadsheet().getSheetByName('Test123'); new1.getRange(1,1,dupData.length,dupData[0].length).setValues(dupData); } - person Lohit Upadhyaya; 22.07.2016