如何在ArrayFormula中使用自定义函数

时间:2019-09-15 15:12:59

标签: google-apps-script google-sheets google-sheets-formula array-formulas custom-function

我想编写一个可以在ArrayFormula内部使用的函数。我的桌子是这样的:

 | A | B | C |
1| a |   |   |
2| b |   |   |
3| c |   |   |

首先,我编写了一个简单的函数来返回输入(因此我知道它可以在ArrayFormula中使用):

function retAddress(cell){
  return cell;
}

在B1上,我写了=ArrayFormula(retAddress(address(row(B:B),column(A:A),4))),显然它按预期运行,它返回了每个地址,如下所示:

 | A | B | C |
1| a | A1|   |
2| b | A2|   |
3| c | A3|   |

现在,在C列上,我想返回A列的值,所以我写了一个像这样的函数:

function retValue(cell){
  var cellRang = SpreadsheetApp.getActive().getRange(cell);
  return cellRang.getValue();
}

在C1上,我写了=ArrayFormula(retValue(address(row(B:B),column(A:A),4))),但它给了我错误Exception: Range not found (line 2).,这是getRange(cell)方法的行。

如果我这样编写没有ArrayFormula的函数:

在C1上,=retValue(address(row(C1),column(A:A),4))

在C2上,=retValue(address(row(C2),column(A:A),4))

在C3上,=retValue(address(row(C3),column(A:A),4))

我得到了预期的结果:

 | A | B | C |
1| a | A1| a |
2| b | A2| b |
3| c | A3| c |

那么,如何使其在ArrayFormula中工作?

1 个答案:

答案 0 :(得分:1)

问题:

SpreadsheetApp.getActive().getRange(cell)

cell是数组,如果您提供数组输入。 getRange方法需要一个字符串作为输入。

解决方案:

  • map数组为单个值

参考文献:

代码段1:

function retValue(cell){
  if(cell.map) {
    return cell.map(retValue);
  } else {
    var cellRang = SpreadsheetApp.getActive().getRange(cell);
    return cellRang.getValue();
  }
}

代码段2:

请注意,在上一个代码段中,您要对输入数组中的每个单元格调用getValue() 1次。这非常慢。更好的方法是将其称为批处理:

=retValues("A1:B4")
function retValues(cell){//modified
  var cellRang = SpreadsheetApp.getActive().getRange(cell);
  return cellRang.getValues();//modified
}
  • 请注意:
    • 仅对getValues()进行了1次呼叫。
    • Formula返回一个数组,而没有显式使用=ARRAYFORMULA()。默认情况下,所有自定义公式都是数组公式,但是需要将它们配置为在应用脚本中将值作为数组返回。