如何评估自定义函数中的电子表格公式?

时间:2014-11-07 16:05:53

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

在电子表格中,我可以在单元格中输入=SIN(45)+123,然后对其进行评估。

如何在自定义函数中评估电子表格函数,例如“eval” 功能如下:

function myFunc() {
  return Sheet.eval("=SIN(45)+123")
}

有可能吗?

请注意,我并不特别关心SIN函数,我想要的是能够访问完整的电子表格函数库(PMTQUERY,{{ 1}}等等。)

6 个答案:

答案 0 :(得分:6)

来自Apps-Script的

电子表格功能

不可能 - 这已被多次询问过。建议您检查google-apps-script问题列表以查看是否有任何更改。但最后我检查过,没有办法做到,他们没有计划添加它。 https://code.google.com/p/google-apps-script-issues/issues/list

Ethercalc - java脚本电子表格公式

如果需要,您可以随时复制" ethercalc"因为它有电子表格公式的java脚本版本。 https://github.com/audreyt/ethercalc

答案 1 :(得分:3)

我得到了这个工作。使用设定值可以解决问题。因此这样的事情:

function MyFun1(){
  SpreadsheetApp.getActiveSpreadsheet().getActiveSheet().getRange('A1').setValue(Myfun2())
}

function MyFun2(){
   return "=SIN(45)+123"
}

希望这有帮助!

答案 2 :(得分:1)

我认为您需要将此问题分为两个不同的问题。

是否要获取电子表格中已有的数据,执行计算,然后打印结果,或者是否要在与电子表格中的数据无关的代码中使用sin()函数?< / p>

如果您尝试执行后者,则应该可以使用Google Apps脚本中的Math.sin()来引用电子表格功能。有关在JavaScript中使用sin()函数的详细信息,请查看此文章:http://www.w3schools.com/jsref/jsref_sin.asp

如果您尝试使用前者,那么您应该使用readRows()函数(此处提供更多信息:http://gassnippets.blogspot.com/2012/11/create-your-first-google-apps-script.html)将电子表格数据加载到变量(或变量)中在内存中,执行计算,并使用类似的功能将最终结果打印到电子表格中。

如果有帮助,请告诉我。

答案 3 :(得分:1)

我遇到了这个问题,试图找到一种方法来评估函数的一部分,就像在Excel中一样。

这是我的脏解决方法 - 您可以简单地将activecell的值或显示值存储在变量中,而不是在msgbox中输出结果,并根据自己的喜好使用它。

但请注意,该函数将暂时覆盖当前所选单元格中的所有内容,并且需要在结果可用之前重新计算工作表。因此,如果您需要评估多个单元格值,它就不是一个可行的解决方案。

function evalPart() {
  var ui = SpreadsheetApp.getUi();
  myPart = Browser.inputBox("Enter formula part:", ui.ButtonSet.OK_CANCEL);
  if (myPart != "cancel") {
    myActiveCell = SpreadsheetApp.getActiveSpreadsheet().getActiveCell();
    myBackup = myActiveCell.getFormula();
    myActiveCell.setFormula(myPart);
    Browser.msgBox("Result of \\n \\n" + myPart + " \\n \\n " + myActiveCell.getDisplayValue());
    myActiveCell.setFormula(myBackup);
  }
}

答案 4 :(得分:1)

我知道这是一个老问题,但这可能会对某人有所帮助。 只需将公式分配给一个范围,然后获取值即可。

//asign a formula to the range
var range = sheet.getRange("A1").setFormula("=SUM(D1:D100)");
//get the result
var result  = range.getValue();
//clean up
range.setFormula("");     

答案 5 :(得分:0)

我不知道是否可以使用高级功能。但是,它可以使用一些常见且易于理解的函数,例如(求和,减去等)。

以下是我在脚本本身完成计算后用来设置值的代码。

function MyFun1() {
SpreadsheetApp.getActiveSpreadsheet().getActiveSheet().getRange('A1').setValue(MyFun2());
}

function MyFun2() {
var one = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("Dashboard");
var two = one.getRange('A2').getValue();
var three = one.getRange('A3').getValue(); return two*three;
}

不要忘记在Myfun1()上添加触发器“onEdit”以自动更新返回值。