1

Я пытаюсь написать пользовательскую функцию Google Spreadsheets в приложении, которая будет принимать массив («диапазон») произвольных измерений и возвращать уникальные значения в одном столбце. Функция принимает необязательный аргумент transpose, который должен сортировать вывод по строкам вместо столбцов.Как сгладить и перенести массив в AppsScript

Я получил этот полу-работает, но метод transpose работает только на квадратные массивы:

function GETUNIQUES(range, transpose) { 
 
    traspose = transpose || !0; 
 
    if (transpose) { 
 
    range = range.map(function(col, i) { 
 
     return range.map(function(row) { 
 
     return row[i]; 
 
     }); 
 
    }); 
 
    } 
 
    
 
    var flat = []; 
 
    var clean = []; 
 
    for (i = 0; i < range.length; i++) { 
 
    for (j = 0; j < range[i].length; j++) { 
 
     flat.push(range[i][j]); 
 
    } 
 
    } 
 

 
    for (i = 0; i < flat.length; i++) { 
 
    flat[i] = String(flat[i]); 
 
    if (flat[i].length && clean.indexOf(flat[i].trim()) < 0) { 
 
     clean.push(flat[i].trim()); 
 
    } 
 
    } 
 
    return clean; 
 
}

Может кто-нибудь помочь мне с решением для transpose метода, который следует порядок строк без усечения результатов?

ответ

1

Транспонирование не работает с Array#map(), так как длина может быть не требуемой длины.

Транспонирование с Array#forEach()

Метод forEach() выполняет функцию при условии один раз на каждый элемент массива.

var range = [[0, 1], [2, 3], [4, 5]]; 
 

 
range = function (array) { 
 
    var r = []; 
 
    array.forEach(function (a, i) { 
 
     a.forEach(function (b, j) { 
 
      r[j] = r[j] || []; 
 
      r[j][i] = b; 
 
     }); 
 
    }); 
 
    return r; 
 
}(range); 
 

 
document.write('<pre>' + JSON.stringify(range, 0, 4) + '</pre>');

Транспонирование с Array#reduce()

Метод reduce() применяет функцию от аккумулятора и каждого значения массива (слева направо), чтобы уменьшить его к одному значению.

var range = [[0, 1], [2, 3], [4, 5]]; 
 

 
range = range.reduce(function (r, a, i) { 
 
    a.forEach(function (b, j) { 
 
     r[j] = r[j] || []; 
 
     r[j][i] = b; 
 
    }); 
 
    return r; 
 
}, []); 
 

 
document.write('<pre>' + JSON.stringify(range, 0, 4) + '</pre>');

1

из Sheets Product Forum:

=ARRAYFORMULA({array1;array2;array3})

... будет объединить несколько диапазонов в одном представлении только колонке п:

=UNIQUE(ARRAYFORMULA({A2:A5; B3:B7; C10})) 

или

=TRANSPOSE(UNIQUE(ARRAYFORMULA({A2:A5; B3:B7; C10}))) 
Смежные вопросы