我有以下公式
=average(arrayformula(indirect(split(A1,","))))
A1
包含单元格地址列表,例如E4,E6,E12
。我希望这相当于=AVERAGE(E4,E6,E12)
,但这不符合预期,无论单元格中的数据是什么,都会产生4
。初步研究表明INDIRECT()
函数未正确通过ARRAYFORMULA()
。在外面尝试SUM()
会产生完全相同的结果。
关于如何通过单元格地址列表间接获得的细胞值的平均值的任何想法?
我确实有一个列列表,并且该行的平均值没有变化,所以我想知道我是否可以改为使用某种子集,例如
=AVERAGE(RANGE){LIST_TO_SUBSET_BY}
答案 0 :(得分:1)
我不确定要执行此操作的内置公式,因此我已编写了自定义函数来为您执行此操作。
转到工具 - >脚本编辑器并用下面的代码替换现有函数,然后保存项目。
现在位于任何单元格=CUSTOMFUNCTION(A1)
的电子表格中,其中A1包含逗号分隔的单元格引用列表。
注意:
更新引用单元格中的值不会强制重新计算此公式,只会更新单元格A1。
我建议你也去File - >电子表格设置 - >计算和更改'重新计算'改变和每一分钟'这会迫使每分钟重新计算一次这个功能。
/**
* Returns the average value of a dataset.
* @param {"A1"} cell The cell containing the list of cell references.
* @return The input repeated a specified nunmber of times.
* @customfunction
*/
function CUSTOMAVERAGE(cell){
var ss = SpreadsheetApp.getActiveSheet();
var array = [];
var cellRefs = cell.split(",");
for(var i in cellRefs){
array.push(ss.getRange(cellRefs[i]).getValue());
}
var sum = 0;
for(var i in array){
sum += array[i]
}
var avg = sum/array.length;
return avg;
}
答案 1 :(得分:1)
虽然这是一个非常具体的应用程序来回应这个问题,但为了知识库,我想展示如何在没有脚本的情况下完成这项工作。
为了给出这个背景,假设LIST_CELL
是一个问题编号列表
(在作为标题行输入,在与某些标准相对应的测试中调用范围QUESTIONS
),目标是仅平均与列表所在的标准对应的问题,并为每个学生。使用
=iferror(join(",",ArrayFormula(match(split(LIST_CELL,","),QUESTIONS,FALSE))),"")
split函数在逗号上拆分手工输入的问题列表,match函数在QUESTIONS
中返回该特定问题的列号,join函数将数据重新连接在一起。 ArrayFormula
允许在数组上执行匹配,而不仅仅是第一个值。
另一个单行标题列出了LIST_CELL
中逗号分隔列表与每个问题匹配的标准(可能超过一个标准)。对于A:A中学生的列列表,每个标准需要平均标准旁边列出的每个问题的分数。这是由漂亮的(如果笨重的):
average(ArrayFormula(hlookup(split(vlookup(LOOKUP_VAL,SEARCH_RANGE,COL_W_LIST),","),DATA_SOURCE,row(CURRENT_CELL))))
从中心向外分解:
LOOKUP_VAL
是要查找的值(具有多个匹配的值);在示例上下文中,它是标准。
SEARCH_RANGE
是一系列单元格,包含查找值列表(上下文中的标准)和第一个函数生成的以逗号分隔的列号列表。 COL_W_LIST
是数组SEARCH_RANGE
中的列号,其中包含与LIST_CELL
匹配的行号列表。
Split
将元素分开并将它们放在一个临时数组中,以便可以对每个元素执行hlookup
。通过ArrayFormula
hlookup
抓取相应QUESTIONS
列中同一行的每个值 - 在上下文中,它会获取与标准匹配的每个问题的得分。
最后,平均值是不言自明的,并且显然将数组作为输入。
组合这两个函数允许在数组公式中使用间接单元格引用,并解决了很多问题,“我如何在计算中包含多个匹配”问题。至少在这个特定的背景下。
EDIT 有一个示例“模板”与此实现here.您需要制作自己的副本进行编辑。