【问题标题】:How to evaluate a spreadsheet formula within a custom function?如何在自定义函数中评估电子表格公式?
【发布时间】:2014-11-07 16:05:52
【问题描述】:

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

如何在自定义函数中评估电子表格函数,例如“eval” 像这样工作的函数:

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

有可能吗?

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

【问题讨论】:

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


【解决方案1】:

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

【讨论】:

    【解决方案2】:

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

    //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("");     
    

    【讨论】:

      【解决方案3】:

      我得到了这个工作。使用设定值就可以了。因此是这样的:

      function MyFun1(){
        SpreadsheetApp.getActiveSpreadsheet().getActiveSheet().getRange('A1').setValue(Myfun2())
      }
      
      function MyFun2(){
         return "=SIN(45)+123"
      }
      

      希望这会有所帮助!

      【讨论】:

      • 其实,我下结论太快了……但上面没有评估函数并设置它的值,而是设置公式本身……不是我想要的:(
      • 这很奇怪,因为我目前使用它没有任何问题。单元格为您显示了什么?
      • 单元格显示值,但如果您编辑它,您会看到公式,因此它的行为与常规公式单元格完全相同。我通过使用带有 {contentsOnly:true} 选项的 Range.copyTo 将单元格复制到自身(源和目标范围相同)来解决问题。我在其他 SO 线程之一中找到了解决方案,不确定哪个,所以现在手头没有链接。
      【解决方案4】:

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

      您想获取电子表格中已有的数据,执行计算,然后打印结果,还是想在与电子表格中的数据无关的代码中对计算使用 sin() 函数?

      如果您尝试执行后者,您应该能够通过在您的 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)将电子表格数据加载到内存中的一个(或多个变量)中,执行您的计算,并使用类似的功能将最终结果打印到电子表格中。

      如果这有帮助,请告诉我。

      【讨论】:

      • SIN 函数只是一个示例,我希望能够在自定义函数中使用所有电子表格函数。 (查询、pmt、nper 等...)
      【解决方案5】:

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

      这是我肮脏的解决方法 - 您可以简单地将活动单元格的值或显示值存储在一个变量中,然后根据自己的喜好使用它,而不是在 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);
        }
      }
      

      【讨论】:

        【解决方案6】:

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

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

        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”以自动更新返回值。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2011-02-08
          • 1970-01-01
          • 1970-01-01
          • 2021-06-30
          • 1970-01-01
          相关资源
          最近更新 更多