有没有办法评估存储在单元格中的公式?

时间:2013-04-30 15:35:00

标签: google-apps-script google-sheets

在Google文档电子表格中,我正在寻找类似=EVAL(A1)的内容,其中A1设置为"=1+2"

我发现在MS Excel中有一个EVALUATE()函数(使用起来似乎有点棘手)。但我在Google文档中找不到类似内容。

我还搜索了function list,但找不到任何有用的内容......

7 个答案:

答案 0 :(得分:16)

不,Google表格中没有与Excel EVALUATE()相同的内容。

这个背后有悠久的历史,例如this old post

如果您只是对简单的数学感兴趣(如您的问题所示),可以使用custom function轻松完成。

function doMath( formula ) {
  // Strip leading "=" if there
  if (formula.charAt(0) === '=') formula = formula.substring(1);
  return eval(formula)
}

例如,使用您的A1,将=doMath(A1)放在另一个单元格中,它将是3

答案 1 :(得分:5)

简短回答

正如前面提到的previously,Google表格没有内置的EVALUATE功能,但Google表格可以扩展为添加此功能。幸运的是,可以使用一些SocialCalc文件来简化这一过程。

脚本

Google spreadsheet我分享我的进度。这时我添加了我认为需要的SocialCalc文件以及一些函数和几个测试用例。

注意

  1. Google表格中包含FILTER,UNIQUE等特定功能在SocialCalc以及其他功能(如SIGN)中不可用。
  2. 我认为SocialCalc文件应该由https://github.com/marcelklehr/socialcalc上的文件替换,因为它最近会更新。 H / T到eddyparkinson(见https://stackoverflow.com/a/16329364/1595451
  3. 用途

    链接文件上的EVALUATE函数可用作自定义函数。

    示例1

    A1:'=1+2(请注意使用撇号使公式被Google表格视为字符串。

    B1公式:

    =EVALUATE(A1)
    

    B1显示值:

    3
    

    示例2

    To" EVALUATE"像=VLOOKUP(2,A1:B3,2)这样的公式,此时我们需要使用" advanced"参数。请参阅以下示例:

    B1:'=VLOOKUP(2,A1:B3,2)

    C1公式:

    =EVALUATE(B1,"data","A1:B3")
    

    C1显示值:

    B
    

    Code.gs

    /**
     *
     * Evaluates a string formula
     *
     * @param {"=1+1"}  formula   Formula string 
     * @param {"Tests"} sheetName Target sheet. 
     * @param {"A1"}    coord     Target cell. 
     * 
     * @customfunction
     *
     */
    function EVALUATE(formula,sheetName,coord){
      // SocialCalc Sheet object
      var scSheet = new SocialCalc.Sheet();
      if(sheetName && coord){
        // Pass values from a Google sheet to a SocialCalc sheet
        GS_TO_SC(scSheet,coord,sheetName);
      }
      var parseinfo = SocialCalc.Formula.ParseFormulaIntoTokens(formula.substring(1));
      var value = SocialCalc.Formula.evaluate_parsed_formula(parseinfo,scSheet,1); // parse formula, allowing range return
      if(value.type != 'e'){
        return value.value;
      } else {
        return value.error;
      }
    }
    /**
     *
     * Pass the Google spreadsheet values of the specified range 
     * to a SocialCalc sheet
     *
     * See Cell Class on socialcalc-3 for details
     *
     */
    function GS_TO_SC(scSheet,coord,sheetName){
      var ss = SpreadsheetApp.getActiveSpreadsheet();
      if(sheetName){
        var sheet = ss.getSheetByName(sheetName);
        var range = sheet.getRange(coord);
        } else {
          var range = ss.getRange(coord);
      }
      var rows = range.getNumRows();
      var columns = range.getNumColumns();
      var cell,A1Notation,dtype,value,vtype;
      // Double loop to pass cells in range to SocialCalc sheet
      for(var row = 1; row <= rows; row++){
        for(var column = 1; column <= columns; column++){
          cell = range.getCell(row,column);
          A1Notation = cell.getA1Notation();
          value = cell.getValue();
          if(cell.isBlank()){
            dtype = 'b';
            vtype = 'b';
          } else {
            switch(typeof value){
              case 'string':
                dtype = 't';
                vtype = 't';
                break;
              case 'date':
              case 'number':
                dtype = 'v'
                vtype = 'n';
                break;
            }
          }
          scSheet.cells[A1Notation] = {
            datavalue: value,
            datatype: dtype,
            valuetype: vtype
          }
        }
      }
    }
    

    formula1.gs

    https://github.com/DanBricklin/socialcalc/blob/master/formula1.js

    socialcalcconstants.gs

    https://github.com/DanBricklin/socialcalc/blob/master/socialcalcconstants.js

    socialcalc-3.gs

    https://github.com/DanBricklin/socialcalc/blob/master/socialcalc-3.js

答案 2 :(得分:2)

复制并粘贴公式:

也许你可以从“jQuery.sheet”复制并粘贴你需要的公式。移至:

https://github.com/Spreadsheets/WickedGrid

看起来都是“开源”

不解决问题

此外:“启用脚本以使用标准电子表格功能”问题标记为“无法修复”,请参阅https://code.google.com/p/google-apps-script-issues/issues/detail?id=26

<强> Ethercalc 谷歌就像开源电子表格名为Ethercalc

GUI代码: https://github.com/audreyt/ethercalc

公式:https://github.com/marcelklehr/socialcalc

演示 - 关于沙尘暴: https://apps.sandstorm.io/app/a0n6hwm32zjsrzes8gnjg734dh6jwt7x83xdgytspe761pe2asw0

答案 3 :(得分:2)

我知道这是一篇旧帖子。我只是想知道,为什么没有人建议:

myCell.getValue();

这将为您提供myCell中公式的结果(在您的示例中为3)。

如果要将结果写入单元格(而不是公式),可以使用:

function fixFormula(myCell) {
    myCell.setValue(myCell.getValue());
}

答案 4 :(得分:0)

简单的方法即可评估Google电子表格中的公式:

  1. 选择带有公式的单元格或列
  2. 转到“编辑”->“查找并替换...”
  3. 选中“也在公式中搜索”
  4. 将“ =“替换为” ==”
  5. 将“ ==“替换为“ =”
  6. 在同一“查找和替换”窗口中,取消选中“也在公式中搜索”

公式将进行评估! :)

答案 5 :(得分:0)

转换一列不带+的表达式。

...
bucket.query(query, function(err, rows, meta) {
    for (row in rows) {
      if(row.phonenumber == req.body.phonenumber) {
        res.status(500).json({status:"error", resCode: 500, msg:"users Already exist"});

      }
    }
}

答案 6 :(得分:0)

如果要评估简单的数学运算(例如A1:“(1 + 2)* 9/3”),则可以使用查询:

=query(,"Select "&A1&" label "&A1&" ''",0)