在 google 表格中,如何在 sumifs 中调用自定义 javascript 比较器

问题描述 投票:0回答:0

我想做什么:

在我的个人账目表中,我希望有标签,这样我就可以将费用分类到多个桶中。例如“食物”和“孩子”。有些费用两者兼而有之。因此,对于每一行,除了日期、金额和其他内容外,我还用逗号分隔的标签填充了一个字段。然后在另一张纸上,我想总结给定时期(比如一个月、一个季度或一年)的那些。所以在每一行上我都有几个日期来定义时间段,还有一堆列,每个列对应一个标签。我还希望能够使用多个标签进行过滤,例如“孩子们,食物”,所以我知道我和孩子们共进晚餐花了多少钱。

使用sumifs,我可以选择时间段内的行,但我不知道如何做标签。

我已经写了一个

function is_subset(superset, subset)
.

我试过的

我试过写自己的总结,但事实证明这很困难。

我试过使用标准格式

range, condition
条件是
">"&A$2
但是日期格式不匹配。从范围内,我得到一个格式为
Sat Apr 01 2023 00:00:00 GMT-0300 (GMT-03:00)
的字符串,从串联中我得到“>40000”或接近的东西,无论它代表什么。我试图确定每个条件的格式,以便我可以解析日期,但是当为自定义函数提供范围时,我们得到的只是值,而不是范围,因此我们无法从适当的
Range
对象。

所以我尝试传递范围字符串,例如

=sumifs(mysheet!A1:A, "mysheet!B1:B", "A2", "ARGLEFT>ARGRIGHT")
。所以我可以得到一个
Range
,检查格式,然后替换 ARGLEFT 和 ARGRIGHT 并调用
eval
,但是我不能再复制和粘贴公式了,因为范围不会得到调整。无论如何,测试所有格式都会很痛苦。

我认为可能有用,只要...

我最接近的是始终将 eval 与自定义函数一起使用:

=sumifs(mysheet!A1:A, mysheet!B1:B, A2, "gt")

我写了

function lt(left,right){return left<right;}
、gt、gte、lte、eq,现在我也可以使用我的首字母
is_subset
了。但这只有在我给它 CELLS 而不是 RANGES 时才有效。单元格比较正确:
=test(A1, A2, "gt")
很好。范围不:
=test_loop(A1:A5, A2, "gt")
返回错误的值。

完整代码如下:

function is_subset(superset, subset)
{
  subset = subset.toLowerCase().split(",")
  superset = superset.toLowerCase().split(",")
  for (var i = 0 ; i < subset.length ; i++)
  {
    var found = false;
    for (var j = 0 ; j < superset.length ; j++)
    {
      if (subset[i] == superset[j])
      {
        found = true;
        break;
      }
    }
    if ( ! found)
      return false;
  }
  return true;
}
function gt (left,right) { return left> right; }
function gte(left,right) { return left>=right; }
function lt (left,right) { return left< right; }
function lte(left,right) { return left<=right; }
function eq (left,right) { return left==right; }
function mysumifs3()
{
  if ((arguments.length % 3) != 1)
    throw "Bad arg count";
  var range_to_sum = arguments[0];
  var sum = 0;
  for (row_idx = 0 ; row_idx < range_to_sum.length ; row_idx++)
  {
    Logger.log("row_idx: " + row_idx);
    var add = true;
    for (arg_idx=1 ; add && arg_idx<arguments.length ; arg_idx+=3)
    {
      Logger.log("arg_idx: " + arg_idx);
      try
      {
        var left_range = arguments[arg_idx];
        if (range_to_sum.length != left_range.length)
          throw "Ranges have differente sizes";
        left = left_range[row_idx];
        Logger.log("left: " + left);
        var right = arguments[arg_idx+1];
        Logger.log("right: " + right);
        var op = eval(arguments[arg_idx+2]);
        Logger.log("op: " + op);
        Logger.log("op(left,right): " + op(left,right));
        
        if ( ! op(left, right))
          add = false;
      } catch(error){
          add = false;
          Logger.log("exception: " + error)
      }
    }
    if (add)
      sum += range_to_sum[row_idx][0];
  }
  return sum;
}

我是否遗漏了关于 sumifs 的一些明显的东西,这些东西允许使用任意的、自定义的比较器?

我是否在从给定范围内读取值时犯了错误?

google-apps-script google-sheets sumifs
© www.soinside.com 2019 - 2024. All rights reserved.