我想做什么:
在我的个人账目表中,我希望有标签,这样我就可以将费用分类到多个桶中。例如“食物”和“孩子”。有些费用两者兼而有之。因此,对于每一行,除了日期、金额和其他内容外,我还用逗号分隔的标签填充了一个字段。然后在另一张纸上,我想总结给定时期(比如一个月、一个季度或一年)的那些。所以在每一行上我都有几个日期来定义时间段,还有一堆列,每个列对应一个标签。我还希望能够使用多个标签进行过滤,例如“孩子们,食物”,所以我知道我和孩子们共进晚餐花了多少钱。
使用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 的一些明显的东西,这些东西允许使用任意的、自定义的比较器?
我是否在从给定范围内读取值时犯了错误?