我尝试在AppsScript中编写自定义Google Spreadsheets功能,该功能将采用任意维度的数组("范围")并在单个列中返回唯一值。该函数采用可选参数transpose
,该参数应按行而不是列对输出进行排序。
我已经进行了半工作,但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;
}
&#13;
有人可以帮我解决行顺序后面的transpose
方法而不截断结果吗?
答案 0 :(得分: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 :(得分:1)
...将在一个仅查看列中合并多个范围: 或
=ARRAYFORMULA({array1;array2;array3})
=UNIQUE(ARRAYFORMULA({A2:A5; B3:B7; C10}))
=TRANSPOSE(UNIQUE(ARRAYFORMULA({A2:A5; B3:B7; C10})))