【问题标题】:Replace custom function in Google Sheets with standard functions用标准函数替换 Google 表格中的自定义函数
【发布时间】: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


【解决方案1】:

公式

=ArrayFormula(TRANSPOSE(
MMULT(
N(TRANSPOSE(NamedRange1)
=
INDEX(
QUERY(TRANSPOSE(NamedRange1),
"SELECT "&JOIN(",",("MAX(Col"&TRANSPOSE(ROW(NamedRange1))-INDEX(ROW(NamedRange1),1)+1)&")"
)),
2)
),
SIGN(ROW(NamedRange1))
)
))

其中NamedRange1 被命名为范围引用的范围。

条件格式:

  • 适用范围:A1:H4
  • 自定义公式:=A1=MAX($A1:$H1)

说明

总结

上面的公式不需要额外的列,只是将范围设置为命名范围。公式中使用了NamedRange1,但可以根据您的喜好自定义。

结果是一个1 x n 数组,其中nNamedRange1 的列数。每列将有对应列上按行出现最大值的次数

精选“黑客”

  • ARRAYFORMULA 返回一个值数组。
  • 大于 1 x 1 的范围作为数组处理。
  • 将数组用作某些函数和运算符的参数的工作方式与循环类似。在这种情况下,此功能用于创建 SQL 语句以获取输入数据的每一列的最大值。请注意,QUERY 的输入数据是NamedRange1 的转置。
  • N 个 TRUE/FALSE 值分别强制为 1/0。
  • MMULT 用于按行求和

注意:插入图像上显示的 +0 是为了强制 Google 表格保留在编辑公式时引入的不带分界线的分界线,因为如果公式没有显着更改,分界线会自动删除,因为Google 表格的公式/结果缓存功能。

参考

MMULT Usage Adam Lusk。

【讨论】:

  • 我认为这是正确的方向,但它还没有完全奏效......我在问题中添加了数据集样本,这样您就可以自己查看预期的内容和输出的内容.
  • 也许我可以使用数组公式和我原来的方法为每一行做countif
  • 那么理解起来就有问题了,你在计算每列的最大值重复了多少次。我想一列有多少次给定行的最大值。
  • @fortran:我更新了公式并将解释扩展到新公式,但核心“想法”是相同的。
猜你喜欢
  • 2021-09-19
  • 1970-01-01
  • 2018-06-02
  • 2017-01-20
  • 2016-07-08
  • 1970-01-01
  • 1970-01-01
  • 2019-10-10
  • 1970-01-01
相关资源
最近更新 更多