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

Mic*_*upp 20 google-sheets google-apps-script

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

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

我还搜索了功能列表,但找不到任何有用的东西......

Mog*_*dad 16

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

这个背后有悠久的历史,比如这个老帖子.

如果您只对简单的数学感兴趣(如您的问题所示),那么可以使用自定义函数轻松完成.

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

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


The*_*ter 10

如果你想计算简单的数学(如 A1: "(1+2)*9/3"),你可以使用查询:

=query(,"Select "&A1&" label "&A1&" ''",0)
Run Code Online (Sandbox Code Playgroud)

发送到查询的基本数学select由 进行评估query


am2*_*429 8

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

myCell.getValue();
Run Code Online (Sandbox Code Playgroud)

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

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

function fixFormula(myCell) {
    myCell.setValue(myCell.getValue());
}
Run Code Online (Sandbox Code Playgroud)


Rub*_*bén 5

简短的回答

正如提到以前,谷歌表不具有一个内置的evaluate函数,但谷歌表可以扩展来添加此功能.幸运的是,可以使用一些SocialCalc文件来简化这一过程.

脚本

Google电子表格中,我正在分享我的进展.这时我添加了SocialCalc文件,我认为这些文件是必需的,还有几个函数和几个测试用例.

注意:

  1. Google表格具有FILTER,UNIQUE等特定功能,在SocialCalc以及SIGN等其他功能中不可用.
  2. 我认为SocialCalc文件应该被https://github.com/marcelklehr/socialcalc上的文件取代,因为它最近会更新.H/T到eddyparkinson(参见/sf/answers/1143055511/)

用途

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

例1

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

B1公式:

=EVALUATE(A1)
Run Code Online (Sandbox Code Playgroud)

B1显示值:

3
Run Code Online (Sandbox Code Playgroud)

例2

要"评估"类似的公式=VLOOKUP(2,A1:B3,2),此时我们需要使用"高级"参数.请参阅以下示例:

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

C1公式:

=EVALUATE(B1,"data","A1:B3")
Run Code Online (Sandbox Code Playgroud)

C1显示值:

B
Run Code Online (Sandbox Code Playgroud)

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
      }
    }
  }
}
Run Code Online (Sandbox Code Playgroud)

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