在 Google Docs 电子表格中,我正在寻找类似=EVAL(A1)
A1 设置为"=1+2"
.
我发现在 MS Excel 中有一个EVALUATE()
函数(正确使用似乎有点棘手)。但我在 Google Docs 中找不到类似的东西。
我还搜索了功能列表,但找不到任何有用的...
在 Google Docs 电子表格中,我正在寻找类似=EVAL(A1)
A1 设置为"=1+2"
.
我发现在 MS Excel 中有一个EVALUATE()
函数(正确使用似乎有点棘手)。但我在 Google Docs 中找不到类似的东西。
我还搜索了功能列表,但找不到任何有用的...
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
.
如前所述,Google Sheets没有内置的 EVALUATE 功能,但可以扩展 Google Sheets 以添加此功能。幸运的是,可以使用一些 SocialCalc 文件来简化此操作。
在Google 电子表格上,我正在分享我的进度。这时我添加了我认为需要的 SocialCalc 文件和几个函数,以及几个测试用例。
注意事项:
链接文件上的 EVALUATE 函数可以用作自定义函数。
A1:('=1+2
请注意使用撇号使公式被 Google 表格视为字符串。
B1公式:
=EVALUATE(A1)
B1显示值:
3
要“评估”这样的公式=VLOOKUP(2,A1:B3,2)
,此时我们需要使用“高级”参数。请参见以下示例:
B1:'=VLOOKUP(2,A1:B3,2)
C1公式:
=EVALUATE(B1,"data","A1:B3")
C1显示值:
B
/**
*
* 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
}
}
}
}
https://github.com/DanBricklin/socialcalc/blob/master/formula1.js
https://github.com/DanBricklin/socialcalc/blob/master/socialcalcconstants.js
https://github.com/DanBricklin/socialcalc/blob/master/socialcalc-3.js
我知道这是一个旧帖子。我只是想知道,为什么没有人建议:
myCell.getValue();
这将为您提供 myCell 中公式的结果(在您的示例中为 3)。
如果要将结果写入单元格(而不是公式),可以使用:
function fixFormula(myCell) {
myCell.setValue(myCell.getValue());
}
如果你想计算简单的数学(比如 A1: "(1+2)*9/3"),你可以使用查询:
=query(,"Select "&A1&" label "&A1&" ''",0)
复制并粘贴公式:
也许您可以从“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
评估谷歌电子表格中的公式的简单技巧:
公式将评估!:)
只转换前面没有“+”的表达式列怎么样?
92/120 67/85
等等
这是诀窍。在所需的单元格中插入公式,然后检索该单元格值并用这个新值替换已经插入的公式。
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);
}
这有点骇人听闻,但这行得通
var cell = sheet.getRange("A1");
var formula = cell.getFormula();
cell.setFormula(formula);
var fileCell = cell.getValue();