【问题标题】:How to use a custom function with an ArrayFormula如何使用带有 ArrayFormula 的自定义函数
【发布时间】:2019-09-15 15:12:59
【问题描述】:

我想编写一个可以在 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 中工作?

【问题讨论】:

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


    【解决方案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:

    请注意,在前面的 sn-p 中,您对输入数组中的每个单元格调用 getValue() 1 次。这是非常缓慢的。更好的方法是批量调用它:

    =retValues("A1:B4")
    
    function retValues(cell){//modified
      var cellRang = SpreadsheetApp.getActive().getRange(cell);
      return cellRang.getValues();//modified
    }
    
    • 请注意:
      • 只拨打了 1 次到 getValues() 的电话。
      • 公式返回一个未显式使用=ARRAYFORMULA() 的数组。默认情况下,所有自定义公式都是数组公式,但需要将它们配置为在应用脚本中以数组形式返回值。

    【讨论】:

    • Snippet 1 有点解决了这个问题,尽管正如你所指出的那样它很慢。对于 sn-p 2,我必须输入“A1:B4”作为输入,但如果我将公式复制到另一个单元格,它不会更新它,因为它是一个字符串。那么,不输入=retValues("A1:B4"),如何输入=retValues(A1:B4),不带引号?
    • @Adriano 您的retAddress 应该可以正常工作。 =retAddress(A1:B4) 或只是 =arrayformula(a1:b4) 有什么问题?我添加了引号,因为您想提供 =ADDRESS() 的结果,一个字符串到脚本。如果您仍有问题,请提出一个包含足够详细信息的新问题。
    • 我的意思是,作为输入 A1:B4 传递实际上将传递二维数组中这些单元格的值,而不是地址本身,这就是我一直使用=address() 的原因。但是您的回答与=ArrayFormula()=address() 配合得很好,所以谢谢。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-11-19
    • 1970-01-01
    • 2012-10-30
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多