在Google Docs电子表格中,我正在寻找类似=EVAL(A1)
的内容,其中A1设置为"=1+2"
。
我发现在MS Excel中有一个EVALUATE()
函数(它看起来有点难以正确使用)。但我在Google Docs中找不到任何类似的东西。
我也搜索了整个function list,但没有找到任何有用的东西...
发布于 2013-04-30 21:16:46
不,谷歌表格中没有与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
。
发布于 2016-11-22 04:20:41
简短的回答
正如前面提到的previously,Google Sheets没有内置的评估函数,但Google Sheets可以扩展以添加此函数。幸运的是,可以使用一些SocialCalc文件来简化这一过程。
脚本
在Google spreadsheet上,我分享了我的进展。此时,我添加了我认为需要的SocialCalc文件、几个函数和几个测试用例。
NOTES:
使用
链接文件上的EVALUATE函数可以用作自定义函数。
示例1
A1:'=1+2
(请注意使用撇号使Google Sheets将公式视为字符串。
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
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
发布于 2016-01-07 15:56:37
我知道这是一个古老的帖子。我只是想知道,为什么没有人建议:
myCell.getValue();
这将为您提供myCell中公式的结果(在您的示例中为3)。
如果要将结果写入单元格(而不是公式),可以使用:
function fixFormula(myCell) {
myCell.setValue(myCell.getValue());
}
https://stackoverflow.com/questions/16303680
复制相似问题