Хотя ваш синтаксис for(x in range1, y in range2)
не будет возвращать ошибку, он не даст вам желаемого результата ни в том случае, если строки находятся в разном порядке
Причина:
Во время каждого итерация как x
, так и y
изменится, например, если var range1 = [1,2,3]
и var range2 = [4,5,6]
, ваш l oop будет повторяться 3 раза, а значения в вашем образце l oop итераций будут:
- итерация
range1[x] = 1
и range2[y] = 4
итерация
range1[x] = 2
и range2[y] = 5
итерация
range1[x] = 3
и range2[y] = 6
В этом случае вы не получите комбинацию
range1[x] = 1
и range2[y] = 4
или
range1[x] = 2
и range2[y] = 6
и так далее.
Вместо этого вам нужно использовать два вложенных цикла for, которые будут перебирать все возможные комбинации x
и y
:
for(x in range1) {
for(y in range2){
...
}
}
Sidenote:
Даже если ваши строки будут в том же порядке, вам все равно нужно быть осторожным. Поскольку for(x in range1)
в отличие от for(x = 0; x < range1.length; i++)
не дает вам никакого контроля над тем, в какой папке l oop будет перебирать диапазон.
Теперь к вашему запросу для дубликатов
Возможный способ реализации функциональности не слишком сложным способом:
- Определить логическую переменную и использовать ее для проверки каждого
x
либо у него есть дубликат - Если найден дубликат (для столбца B) - будут оцениваться дальнейшие критерии
- Если две строки совпадают по всем критериям, внутренний l oop будет завершен с
break
, и функция перейти к следующему x
- Если будут обнаружены строки с идентичными ключевыми идентификаторами, но расхождения в других столбцах - обе строки будут помещены на лист
output
для сравнения (это проще реализовать, чем указать, какие точно противоречит) - После этого внутренний l oop также будет закрыт
- В других случаях выше
duplicate
будет установлено на true
- Если уникальный идентификатор найдено в листе 1 (duplicate = false) - он будет немедленно помещен в
output
Sample
function compare() {
var ss = SpreadsheetApp.getActiveSpreadsheet();
ss.insertSheet(1);
ss.getActiveSheet().setName('output');
var sheet1 = ss.getSheetByName('sheet1');
var sheet2 = ss.getSheetByName('sheet2');
var sheet_output = ss.getSheetByName('output');
var range1 = sheet1.getRange(1,1,sheet1.getLastRow(),sheet1.getLastColumn()).getValues();
var output1 = [];
var b1;
var m1;
var p1;
var an1;
var x;
var range2 = sheet2.getRange(1,1,sheet2.getLastRow(),sheet2.getLastColumn()).getValues();
var output2 = [];
var b2;
var e2;
var f2;
var g2;
var y;
var array = [];
for(x in range1) {
var duplicate = false;
for(y in range2){
b1 = range1[x][1];
m1 = range1[x][12];
p1 = range1[x][15];
an1 = range1[x][39];
b2 = range2[y][1];
e2 = range2[y][4];
f2 = range2[y][5];
g2 = range2[y][6];
if (
(b1 == b2)
)
{
Logger.log("found");
duplicate = true;
if((m1 != e2)||
(p1 != f2) ||
(an1 != g2)){
array.push(range1[x]);
array.push(range2[y]);
}
break;
}
}
if (duplicate == false){
Logger.log("duplicate false");
array.push(range1[x]);
}
}
//push to output
if(array[0]){
sheet_output.getRange(sheet_output.getLastRow()+1, 1, array.length, array[0].length).setValues(array);
}
}