【发布时间】:2016-10-27 16:30:44
【问题描述】:
我有一个单元格范围,我想累积一列在其给定行中具有最大值的次数。
示例:
headers -> a b c d e f g h
0 0 12 18* 1 0 0 0
30* 0 15 25 0 0 0 0
35 0 19 31 0 0 31 50*
40 10 19 31 0 2 5 55*
预期:
#max val per row-> 1 0 0 1 0 0 0 2
最大值用星号标记。 a 列得分 1,因为它在第二个数据行中具有最大值,d 列也得分 1,因为它在第一个数据行中具有最大值,h 列得分 2,因为它有第三和第四数据行中的最大值。其余列在任何行中都没有最大值,因此它们得到 0。
对于一行,我可以为每一列复制这个公式,它会这样做,但我需要一些应用最大行的东西COUNTIF(B2:B10, MAX($B2:$B10))。
我已经编写了这个 google 应用程序脚本,但我不喜欢它的响应能力(与使用本机函数获得的敏捷性相比,在单元格中看到“正在加载...”几乎一秒钟有点令人恼火):
function countMaxInRange(input) {
return [input.map(function(row) {
var m = Math.max.apply(null, row);
return row.map(function(x){return x === m && 1 || 0});
}).reduce(function(a, b){
var s = Array(a.length);
for (var i = 0; i < a.length; i++) {
s[i] = (a[i] + b[i]) || 0;
}
return s;
})];
}
关于如何用内置函数替换该代码有什么想法吗?我不在乎添加辅助行或列,只要它们的数量是恒定的(也就是说,如果我扩展我的数据集,我不想为每个新数据行或列手动添加更多辅助行或列)。
我想我可以添加一个额外的列来收集列的标题以及每行的最大值;然后为每个数据列计算其标题在该辅助列中出现的次数,但看起来不是很干净。
【问题讨论】:
-
也许你会发现这个工具对将文本格式化为 ASCII 表很有帮助:senseful.github.io/web-tools/text-table(我没有进行更改,因为我之前的评论)。
-
描述是正确的(并且js代码完全符合预期),将其视为比赛,其中每一列是参与者,每一行是一天,数据单元格是得分.我想知道每个参与者在每日预赛中赢得了多少次。
标签: google-apps-script google-sheets custom-function