将自定义函数应用于整个公式(不使用arrayformula())

时间:2014-11-18 19:46:03

标签: function google-apps-script google-sheets

我需要帮助将函数应用于整个列。我知道拖动右下方的手柄会复制它,但是我拖动/突出显示。但我希望它适用于整个专栏。我也知道ARRAYFORMULA()函数。但它只能用于基本的公式和功能(至少据我所知)。那么是否有一些函数(即APPLYALL(范围,函数))允许我在列中应用公式。还是由我来做?是否有可能为ARRAYFORMULA函数定制一个函数并让它以这种方式工作?感谢所有帮助。

这是一段代码。参数都是字符串,它由E2中的单元格调用。因此,对于E2,它看起来像开始(C2,D2)"对于E3来说,它看起来像开始(C3,D3)和#34;等等。

function toStart(model,type) {
  if (model == "E340") {return E340Price(type)}     //Calls same function add OR op
  else if (model == "E342") {return E340Price(type)} //""                         ""
  else if (model == "E350") {return E350Price(type)}
  else if (model == "T644") {return T644Price(type)}
  else if (model == "C532") {return C532Price(type)}
}

function E340Price (type){
  if (type == "Toner") {return 89.00;} //Use global constants for prices?
  else if (type == "Photoconductor") {return 65.00;}
  else if (type == "Toner/Photoconductor") {return 144.00;}
}   

2 个答案:

答案 0 :(得分:2)

您可以更快更有效地复制公式。 例如:

var lastRow = ThisSheet.getLastRow();
ThisSheet.getRange("E2").setFormula("=toStart(C2,D2)");
ThisSheet.getRange("E2").copyTo(ThisSheet.getRange("E2:E"+lastRow));

然后,公式将根据行号自动缩放。我希望你的问题能够得到解决。

编辑:getLastrow应该是getLastRow()而setFormula实际上是setFormula()而不是setFormula =

答案 1 :(得分:1)

您可以启用范围功能。诀窍是检查你的参数是否是一个数组,然后你只需遍历所有单元格。 为了简化,我使用一个只有一个参数的函数myFunctionCanRange(x)。 实际计算数据的函数是myFunction(x)。

代码片段:

function myFunctionCanRange(x) {
  if ( Array.isArray(x)) {
    var result = [];
    for( var i=0; i < x.length, i++) {
      var temp = [];
      for ( var j=0; j < x[i].length, j++) {
        temp.push(myFunction(x[i][j]);
      }
      result.push(temp)
     }
     return result;
    }
  else
    return myFunction(x);
}

现在您可以通过两种方式调用它:

  

= myFunctionCanRange(C3)

但也是:

  

= ARRAYFORMULA(myFunctionCanRange(C3:C))