数组公式中的间接地址
Indirect Addresses in Array Formula
我有以下公式
=average(arrayformula(indirect(split(A1,","))))
其中 A1
包含单元格地址列表,例如 E4,E6,E12
。我希望这等同于 =AVERAGE(E4,E6,E12)
,但这并不像预期的那样,无论单元格中的数据是什么,都会产生 4
。初步研究表明 INDIRECT()
函数没有正确地通过 ARRAYFORMULA()
。在外部尝试 SUM()
会产生完全相同的结果。
关于如何对通过单元格地址列表间接获得的单元格值进行平均的任何想法?
我确实有一个列列表,并且对于这个平均计算,行永远不会改变,所以我想知道我是否可以做某种子集,例如
=AVERAGE(RANGE){LIST_TO_SUBSET_BY}
我不确定是否有内置公式可以执行此操作,因此我编写了一个自定义函数来为您执行此操作。
转到工具 -> 脚本编辑器,用下面的代码替换现有函数,然后保存项目。
现在,在电子表格中的任何单元格中 =CUSTOMFUNCTION(A1)
,其中 A1 包含逗号分隔的单元格引用列表。
注意:
更新引用单元格中的值不会强制重新计算此公式,只有更新单元格 A1 才会。
我建议您也转到文件 -> 电子表格设置 -> 计算并将 'Recalculation' 更改为 'On change and every minute',这将强制每分钟重新计算此函数。
/**
* 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;
}
虽然这是一个非常具体的应用程序来回答这个问题,但为了知识库,我想展示如何在没有脚本的情况下完成此操作。
为了给出这个上下文,假设 LIST_CELL
是一个问题编号列表
(作为 header 行输入,称为范围 QUESTIONS
)在符合特定标准的测试中,目标是仅对符合标准的问题进行平均列表是写的,并且是针对每个学生的。使用
=iferror(join(",",ArrayFormula(match(split(LIST_CELL,","),QUESTIONS,FALSE))),"")
split 函数用逗号拆分 hand-entered 问题列表,match 函数 returns 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
列中同一行的每个值 - 在上下文中,它获取与标准匹配的每个问题的分数。
最后,平均值是 self-explanatory,显然确实以数组作为输入。
这两个函数的组合允许在数组公式中使用间接单元格引用,并解决了很多人提出的 "how do I include multiple matches in a calculation" 问题。至少在这个特定的上下文中。
编辑
有一个示例 "template" 已实现 here. 您需要制作自己的副本才能对其进行编辑。
我有以下公式
=average(arrayformula(indirect(split(A1,","))))
其中 A1
包含单元格地址列表,例如 E4,E6,E12
。我希望这等同于 =AVERAGE(E4,E6,E12)
,但这并不像预期的那样,无论单元格中的数据是什么,都会产生 4
。初步研究表明 INDIRECT()
函数没有正确地通过 ARRAYFORMULA()
。在外部尝试 SUM()
会产生完全相同的结果。
关于如何对通过单元格地址列表间接获得的单元格值进行平均的任何想法?
我确实有一个列列表,并且对于这个平均计算,行永远不会改变,所以我想知道我是否可以做某种子集,例如
=AVERAGE(RANGE){LIST_TO_SUBSET_BY}
我不确定是否有内置公式可以执行此操作,因此我编写了一个自定义函数来为您执行此操作。
转到工具 -> 脚本编辑器,用下面的代码替换现有函数,然后保存项目。
现在,在电子表格中的任何单元格中 =CUSTOMFUNCTION(A1)
,其中 A1 包含逗号分隔的单元格引用列表。
注意:
更新引用单元格中的值不会强制重新计算此公式,只有更新单元格 A1 才会。
我建议您也转到文件 -> 电子表格设置 -> 计算并将 'Recalculation' 更改为 'On change and every minute',这将强制每分钟重新计算此函数。
/**
* 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;
}
虽然这是一个非常具体的应用程序来回答这个问题,但为了知识库,我想展示如何在没有脚本的情况下完成此操作。
为了给出这个上下文,假设 LIST_CELL
是一个问题编号列表
(作为 header 行输入,称为范围 QUESTIONS
)在符合特定标准的测试中,目标是仅对符合标准的问题进行平均列表是写的,并且是针对每个学生的。使用
=iferror(join(",",ArrayFormula(match(split(LIST_CELL,","),QUESTIONS,FALSE))),"")
split 函数用逗号拆分 hand-entered 问题列表,match 函数 returns 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
列中同一行的每个值 - 在上下文中,它获取与标准匹配的每个问题的分数。
最后,平均值是 self-explanatory,显然确实以数组作为输入。
这两个函数的组合允许在数组公式中使用间接单元格引用,并解决了很多人提出的 "how do I include multiple matches in a calculation" 问题。至少在这个特定的上下文中。
编辑 有一个示例 "template" 已实现 here. 您需要制作自己的副本才能对其进行编辑。