Я пытаюсь сделать значения ячеек с разделителями в столбце уникальными
Пример
если значение ячейки D3 = Aa Bb | ЧЧ | Aa Bb | ЧЧ
затем после запуска arrMakeUnique_n () значение ячейки D3 = Aa Bb | ЧЧ
И это работает, но если значение ячейки D2 совпадает с D3, то только значение ячейки D3 становится уникальным. D2 не изменяется
1011 * т.е. *
Если имеется несколько ячеек с одинаковым значением, только одна ячейка становится уникальной, остальные остаются без изменений
Не могу понять почему, любая помощь ценится
Спасибо
function arrMakeUnique_n() {
arrMakeUnique(
'sheet1',
["Header"],
"|",
"|"
);
}
function arrMakeUnique(shtName,cheaders, dilm1, dilm2) {
var sheet = SpreadsheetApp.getActive().getSheetByName(shtName);
var range = sheet.getDataRange();
var rangeValues = range.getValues();
var LR = sheet.getLastRow();
var hn =[];
var fhn = [];
for (var k = 0; k <= cheaders.length-1; k++) {
//Get column indexes from headers
hn[k] = HTN(shtName,cheaders[k]) - 1;
}
for (var j = 0; j <= cheaders.length-1; j++) {
var frRange = sheet.getRange(2, hn[j]+1, LR-1, 1);
var frValues = frRange.getValues();
// iterate through all cells in the selected range
for (var cellRow = 1; cellRow < LR; cellRow++) {
//Make array with split on | get unique with .getUnique() then Join with |
//Logger.log((rangeValues[cellRow][hn[j]].toString().split(frValues[cellRow]+dilm1)).getUnique().join(frValues[cellRow]+dilm2).trim())
rangeValues[cellRow][hn[j]] = (rangeValues[cellRow][hn[j]].toString().split(frValues[cellRow]+dilm1)).getUnique().join(frValues[cellRow]+dilm2).trim();
}
}
// Write back all values at once
range.setValues(rangeValues);
}
Редактировать: Оказывается, что использование: .getUnique
вызывало странное поведение в том, что оно мешало другим сценариям, которые были независимы от его использования. К счастью, решение xyz отлично сработало
//Make array unique
Array.prototype.getUnique = function(){
var u = {}, a = [];
for(var i = 0, l = this.length; i < l; ++i){
if(u.hasOwnProperty(this[i])) {
continue;
}
a.push(this[i]);
u[this[i]] = 1;
}
return a;
}
function HTN(shtName,cheader){
var headers = SpreadsheetApp.getActiveSpreadsheet().getSheetByName(shtName).getDataRange().getValues().shift();
var colindex = headers.indexOf(cheader);
return colindex+1;
}