34

在 Google Docs 电子表格中,我正在寻找类似=EVAL(A1)A1 设置为"=1+2".

我发现在 MS Excel 中有一个EVALUATE()函数(正确使用似乎有点棘手)。但我在 Google Docs 中找不到类似的东西。

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

4

9 回答 9

27

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

这背后有很长的历史,例如看到这个旧帖子

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

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

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

于 2013-04-30T21:16:46.407 回答
7

简短的回答

如前所述,Google Sheets没有内置的 EVALUATE 功能,但可以扩展 Google Sheets 以添加此功能。幸运的是,可以使用一些 SocialCalc 文件来简化此操作。

脚本

Google 电子表格上,我正在分享我的进度。这时我添加了我认为需要的 SocialCalc 文件和几个函数,以及几个测试用例。

注意事项

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

用途

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

示例 1

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

B1公式:

=EVALUATE(A1)

B1显示值:

3

示例 2

要“评估”这样的公式=VLOOKUP(2,A1:B3,2),此时我们需要使用“高级”参数。请参见以下示例:

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

C1公式:

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

C1显示值:

B

代码.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
      }
    }
  }
}

公式1.gs

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

社会计算常数.gs

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

socialcalc-3.gs

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

于 2016-11-22T04:20:41.493 回答
5

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

myCell.getValue();

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

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

function fixFormula(myCell) {
    myCell.setValue(myCell.getValue());
}
于 2016-01-07T15:56:36.813 回答
3

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

=query(,"Select "&A1&" label "&A1&" ''",0)
于 2020-03-06T21:46:39.893 回答
2

复制并粘贴公式:

也许您可以从“jQuery.sheet”中复制并粘贴您需要的公式。搬去:

https://github.com/Spreadsheets/WickedGrid

看起来都是“开源”

不会解决问题

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

Ethercalc 有一个类似谷歌的开源电子表格,叫做 Ethercalc

图形用户界面代码: https ://github.com/audreyt/ethercalc

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

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

于 2013-05-02T02:21:26.310 回答
1

评估谷歌电子表格中的公式的简单技巧:

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

公式将评估!:)

于 2019-01-11T12:54:48.293 回答
0

只转换前面没有“+”的表达式列怎么样?

92/120 67/85

等等

于 2019-10-16T09:50:45.750 回答
0

这是诀窍。在所需的单元格中插入公式,然后检索该单元格值并用这个新值替换已经插入的公式。

function calculateFormula(row, col){
    var spreadsheet = SpreadsheetApp.getActive();
    var sheet = spreadsheet.getSheetByName("Sheet Name");
    sheet.getRange(row,col).setValue("=sum(D6,C12:C14)");
    sheetData = sheet.getDataRange().getValues();
    var newValue = sheetData[row-1][col-1];
    sheet.getRange(row,col).setValue(newValue);
}
于 2021-08-21T06:58:40.717 回答
0

这有点骇人听闻,但这行得通

  1. 从单元格中获取公式;
  2. 重新设置公式;然后
  3. 从单元格中获取值。
var cell = sheet.getRange("A1");
var formula = cell.getFormula();

cell.setFormula(formula);
var fileCell = cell.getValue();
于 2022-02-06T00:03:08.910 回答