Google sheets 数组公式中的间接地址

Google sheets 数组公式中的间接地址,google-sheets,spreadsheet,Google Sheets,Spreadsheet,我有下面的公式 =average(arrayformula(indirect(split(A1,",")))) 其中A1包含单元地址列表,例如E4、E6、E12。我预计这相当于=平均值(E4、E6、E12),但这并不符合预期,无论单元格中的数据是什么,都会产生4。初步研究表明,INDIRECT()函数没有正确地通过ARRAYFORMULA()。在外部尝试SUM()会产生完全相同的结果 关于如何通过单元格地址列表间接获得单元格值的平均值,有什么想法吗 我确实有一个列的列表,对于这个平均值计算,行

我有下面的公式

=average(arrayformula(indirect(split(A1,","))))
其中
A1
包含单元地址列表,例如
E4、E6、E12
。我预计这相当于
=平均值(E4、E6、E12)
,但这并不符合预期,无论单元格中的数据是什么,都会产生
4
。初步研究表明,
INDIRECT()
函数没有正确地通过
ARRAYFORMULA()
。在外部尝试
SUM()
会产生完全相同的结果

关于如何通过单元格地址列表间接获得单元格值的平均值,有什么想法吗

我确实有一个列的列表,对于这个平均值计算,行永远不会改变,所以我想知道我是否可以做一些子集,例如

=AVERAGE(RANGE){LIST_TO_SUBSET_BY}

我不确定是否有一个内置的公式可以做到这一点,所以我已经为您编写了一个自定义函数

转到工具->脚本编辑器,用下面的代码替换现有函数,然后保存项目

现在,在任何单元格中的电子表格中,A1包含逗号分隔的单元格引用列表

注意:

更新引用单元格中的值不会强制重新计算此公式,只会更新单元格A1

我建议您也转到文件->电子表格设置->计算,并将“重新计算”更改为“更改时和每分钟”,这将强制每分钟重新计算此函数

/**
 * 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;

  }

我不确定是否有一个内置的公式可以做到这一点,所以我已经为您编写了一个自定义函数

转到工具->脚本编辑器,用下面的代码替换现有函数,然后保存项目

现在,在任何单元格中的电子表格中,A1包含逗号分隔的单元格引用列表

注意:

更新引用单元格中的值不会强制重新计算此公式,只会更新单元格A1

我建议您也转到文件->电子表格设置->计算,并将“重新计算”更改为“更改时和每分钟”,这将强制每分钟重新计算此函数

/**
 * 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;

  }

虽然这是回答这个问题的一个非常具体的应用程序,但是为了知识库的缘故,我想展示一下如何在没有脚本的情况下完成这项工作

要给出此上下文,请设想
列表\u单元
是一个问题编号列表 (作为标题行输入,调用与特定标准相对应的测试范围
问题
),目标是仅对与列表旁边的标准相对应的问题和每个学生的问题进行平均。使用

=iferror(join(",",ArrayFormula(match(split(LIST_CELL,","),QUESTIONS,FALSE))),"")
split函数以逗号分隔手工输入的问题列表,match函数返回
问题中该特定问题的列号,join函数将数据重新连接在一起
ArrayFormula
允许在数组上执行匹配,而不仅仅是第一个值

另一个单行标题通过
list\u单元格
中的逗号分隔列表列出了每个问题所匹配的标准(可能是多个标准)。对于a:a中的学生列列表,每个标准都需要对标准旁边列出的每个问题的分数取平均值。这是由漂亮(如果笨重)完成的:

从中心向外的细分:

LOOKUP\u VAL
是正在查找的值(具有多个匹配项的值);在示例上下文中,这是标准

SEARCH\u RANGE
是一个单元格范围,包含查找值列表(上下文中的标准)和第一个函数生成的以逗号分隔的列号列表
COL_W_LIST
是数组
SEARCH_RANGE
中的列号,其中包含从
LIST_单元格
匹配的行号列表

Split
将元素分开并放置在临时数组中,以便可以对每个元素执行
hlookup
。通过
ArrayFormula
hlookup
获取相应
QUESTIONS
列中同一行上的每个值-在上下文中,它获取与标准匹配的每个问题的分数

最后,average是不言自明的,显然是以数组作为输入的

这两个函数的组合允许在数组公式中使用间接单元格引用,并解决了经常被问到的“如何在计算中包含多个匹配项”问题。至少在这个特定的背景下

编辑
有一个示例“模板”实现了这个功能,您需要制作自己的副本来编辑它。

虽然这是回答这个问题的一个非常具体的应用程序,但为了知识库的缘故,我想展示一下如何在没有脚本的情况下完成这项工作

要给出此上下文,请设想
列表\u单元
是一个问题编号列表 (作为标题行输入,调用与特定标准相对应的测试范围
问题
),目标是仅对与列表旁边的标准相对应的问题和每个学生的问题进行平均。使用

=iferror(join(",",ArrayFormula(match(split(LIST_CELL,","),QUESTIONS,FALSE))),"")
split函数以逗号分隔手工输入的问题列表,match函数返回
问题中该特定问题的列号,join函数将数据重新连接在一起
ArrayFormula
允许在数组上执行匹配,而不仅仅是第一个值

另一个单行标题通过
list\u单元格
中的逗号分隔列表列出了每个问题所匹配的标准(可能是多个标准)。对于a:a中的学生列列表,每个标准都需要平均下一个t列出的每个问题的分数