使用单元格值作为公式中工作表的引用

时间:2012-06-17 08:20:57

标签: google-apps-script

我有一张3张电子表格。两个有一堆类似的数据,被称为“2012”和“2011”。最后一张表格对数据进行了比较。

为了能够选择年份,我正在使用一个单元格,我可以写“2011”或“2012”(D1)。然后,公式使用INDIRECT公式将此单元格作为参考的一部分。

INDIRECT(CHAR(39)&$D$1&CHAR(39)&"!F:F")

这不是一个漂亮的解决方案,使得公式变得漫长而复杂。

=IFERROR(SUM(FILTER( INDIRECT(CHAR(39)&$D$1&CHAR(39)&"!M:M") ;  (INDIRECT(CHAR(39)&$D$1&CHAR(39)&"!B:B")=$A4)+(INDIRECT(CHAR(39)&$D$1&CHAR(39)&"!B:B")=$A5)+(INDIRECT(CHAR(39)&$D$1&CHAR(39)&"!B:B")=$A6)+(INDIRECT(CHAR(39)&$D$1&CHAR(39)&"!B:B")=$A7)+(INDIRECT(CHAR(39)&$D$1&CHAR(39)&"!B:B")=$A8); MONTH(INDIRECT(CHAR(39)&$D$1&CHAR(39)&"!D:D"))=$B$1 ; INDIRECT(CHAR(39)&$D$1&CHAR(39)&"!F:F")=D$3));0)

问题1:有更好的方法吗?我已经尝试为计算表创建一个单独的电子表格,并使用VMERGE(脚本库中的自定义函数)将两张表中的数据一起导入(IMPORTRANGE),但是这些数据中有很多数据。两张纸,导入需要很长时间。任何变化(如改变年份)也需要很长时间才能重新计算。

编辑:请忽略Q2,因为我发现了自己的(愚蠢的)错误。忘记将自定义函数放在MONTH公式内的INDIRECT公式中。 Q1仍然有效。

问题2:作为一个部分解决方案,我正在尝试编写一个自定义函数,以更整洁,更易读的方式执行INDIRECT-stuff。像RANGE(D1,“A:A”)。到目前为止,这个功能看起来像这样:

function range(V1,V2) {

 return "'" + V1 + "'!" + V2; 

}

但是 - 虽然它适用于:

=IFERROR(SUM(FILTER( INDIRECT(RANGE(D1;"B:B")) ; INDIRECT(RANGE(D1;"A:A"))=A4 ));0)

当我输入日期变量时它停止工作:

=IFERROR(SUM(FILTER( INDIRECT(RANGE(D1;"B:B")) ; INDIRECT(RANGE(D1;"A:A"))=A4 ; MONTH(RANGE(D1;"C:C"))=$B$1 ));0)

任何帮助都将不胜感激。

2 个答案:

答案 0 :(得分:0)

执行此类操作时,数据库功能往往更清晰。

https://support.google.com/docs/bin/static.py?hl=en&topic=25273&page=table.cs&tab=1368827

数据库功能需要一段时间才能学习,但功能强大。

或者

你可以将INDIRECT(CHAR(39)& $ D $ 1& CHAR(39)&“!B:B”)放在一个单元格中。

答案 1 :(得分:0)

我认为您有两年的架构相同的信息(C列在两个工作表上都有相同类型的信息)。另外,我假设B栏跟踪年份。

如果是这样,请考虑在一张纸上保留所有信息,然后使用电子表格功能“QUERY”创建视图。

例如,此公式从名为“DataSheet”的工作表返回A1:E之间的所有单元格,其中B列中的值= 2010.

= QUERY(DataSheet!A1:E;“SELECT * WHERE B = 2010”; 1)

有时将数据存储在两张纸上是有充分理由的。如果是这样,请使用脚本库中的某个vMerge函数来组合工作表。然后从工作表创建视图和报告。

function VMerge() {
  var maxw=l=0;
  var minw=Number.MAX_VALUE;
  var al=arguments.length ;
  for( i=0 ; i<al ; i++){
    if( arguments[i].constructor == Array )l =arguments[i][0].length ;
    else if (arguments[i].length!=0) l = 1 ;  // literal values count as array with a width of one cell, empty cells are ignored!
    maxw=l>maxw?l:maxw;
    minw=l<minw?l:minw;
  }
  if( maxw==minw) { /* when largest width equals smallest width all are equal */
    var s = new Array();
    for( i=0 ; i<al ; i++){
      if( arguments[i].constructor == Array ) s = s.concat( arguments[i].slice() )
      else if (arguments[i].length!=0) s = s.concat( [[arguments[i]]] )  
    }
  if ( s.length == 0 ) return null ; else return s        //s     
  }
  else return "#N/A: All data ranges must be of equal width!"      
}

希望这有帮助。