是否可以在Google电子表格查询中使用命名范围,以使列引用保持最新状态?


9

使用Google Spreadsheets,您可以编写查询。但是,如果您在引号中使用了列字母,那么它们不会随着列顺序的更改而更新。

有没有一种方法可以编写这些查询,这样就不必在每次添加或删除列时都进行更新?

是否可以在查询中使用命名范围来解决此问题?

这是一个示例:如果在“ F”之后添加一列,则列“ G”会被推送到“ H”,并且公式的含义也会改变。

= Query(B:J,“按G选择平均(J)组”)

相关问题

这个问题与使用查询使用列标题而不是列字母不同,因为这个问题集中在命名范围的使用上。

Answers:


5

这是一种棘手的问题,但是可以通过使用辅助范围和一些串联来实现。

需要做什么:

  1. 创建一个命名范围COLS,以携带这样的列字母:

    A  
    B  
    C  
    D  
    E  
    ...
    

    如图所示,以垂直方式进行操作。

  2. 像这样组装查询字符串:

    =QUERY( B:J, "SELECT AVG(" & INDEX(**COLS**, COLUMN(J1)) & ") GROUP BY " & INDEX(**COLS**, COLUMN(G1)) )
    

1
命名范围将以垂直或水平形状工作。
鲁本

@Rubén可能是正确的。
Oneide '16

3

有没有一种方法可以编写这些查询,这样就不必在每次添加或删除列时都进行更新?

是否可以在查询中使用命名范围来解决此问题?

是的,您可以使用命名范围而不是内置的列标题,但是基本思想与对此的其他答案相同,并且在本网站中建议使用其他类似问题:电子表格应设置为构建动态SQL字符串

让说,JG对应于指定范围GradesClass分别。


仅当列在A和Z列之间时,以下方法才有效


CELL("address",Grades)会回来的"$J:$J"。要获取列引用,请使用MID(CELL("address",Grades),2,1)get "J"。最终公式是

= QUERY(B:J,“ SELECT AVG(”&
MID(CELL(“ address”,Grades),2,1)&
“) 通过...分组 ”&
MID(CELL(“ address”,Class),2,1))


以下方法适用于所有情况


COLUMN(Grades)将返回一个整数(格式为1,2,3等的数字)。为了简化公式以创建SQL语句参数,我建议通过使用数组来强制SQL使用COL1,COL2等格式的列引用。记号({B:J})。最终公式是

= QUERY({B:J},“ SELECT AVG(Col”&COLUMN(Grades)-1&“)GROUP BY Col”&COLUMN(Class)-1)

演示电子表格

参考文献

在Google表格中使用数组-Google文档编辑器帮助


1

Ruben的答案并不能在所有情况下都解决问题,因为MID(CELL("address",Grades),2,1)如果将Grades范围移动到的双字母列,则会失败$AA:$AA

在这种情况下,MID(CELL("address",Grades),2,2)需要公式。对于跨越或邻接$Z:$AA范围的命名范围,此公式会出现问题。

该公式REGEXEXTRACT( CELL("address", Grades), "\$([a-zA-Z]+)\$")解决了一般情况下的问题,但是我强烈质疑在整个大型电子表格中使用它时的CPU效率。


在我的答案中,有两种方法,但此答案只能批评其中一种。第二种方法应适用于所有情况。
鲁本

我认为这不适用于不同工作表上的命名范围。想知道是否+2年之后,是否有更好的解决方案...例如简单地能够在查询本身中引用织补名称范围
-mike01010

0

我在infoinspired.com上看到了该页面该页面解释了一种实现方法。我完全按照他给出的示例进行了测试,并且可以正常工作。设置:

      A        B        F                                     G
 1  names     Age   =left(address(row(B1),column(B1),4))   =QUERY(A:B,"Select "&Age)
 2  joey      32
 3  nicole    26
 4  sally     66

他对F1的解释:包括ROW和COLUMN函数的ADDRESS公式返回B1的单元地址。LEFT函数从中提取列标题的第一个字母。

---单击单元格F1,然后转到菜单“数据”>“命名范围”,并将范围命名为“年龄”(不带引号)

现在,您可以将查询表述为: =QUERY(A:B,"Select "&Age)

他的页面上有许多更复杂的示例,我现在要对其进行测试,但是我很高兴第一个示例可行!

编辑-很抱歉,如果这正是其他人提出的答案。我只是发现这个示例非常清晰,并且能够弄清楚。认为这可能会帮助其他人解决相同的问题。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.