=EVAL(A1)
的东西,其中A1设置为"=1+2"
。我发现在MS Excel中有一个
EVALUATE()
函数(似乎有点棘手),但我在Google Docs中找不到类似的东西。我还通过功能列表进行了搜索,但没有找到任何有用的信息...
=EVAL(A1)
的东西,其中A1设置为"=1+2"
。EVALUATE()
函数(似乎有点棘手),但我在Google Docs中找不到类似的东西。我知道这是一篇旧帖子,但我很好奇为什么没有人提出以下建议:
myCell.getValue();
这将给出您的单元格中公式的结果(在您的例子中为3)。
如果您想将结果写入单元格(而不是公式),您可以使用以下代码:
function fixFormula(myCell) {
myCell.setValue(myCell.getValue());
}
如先前所述,Google Sheets没有内置的EVALUATE函数,但可以通过扩展Google Sheets来添加此功能。幸运的是,一些SocialCalc文件可用于简化此过程。
在Google电子表格上,我分享了我的进展情况。目前,我添加了我认为所需的SocialCalc文件、几个函数和多个测试用例。
注意事项:
链接文件上的EVALUATE函数可以用作自定义函数。
A1:'=1+2
(请注意使用撇号使公式被Google Sheets视为字符串)。
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
如果你想计算简单的数学表达式(例如A1: "(1+2)*9/3"),可以使用查询语句:
=query(,"Select "&A1&" label "&A1&" ''",0)
查询语句中的基本数学计算会由query
进行评估。
'=+1+1+1'
的单元格,加上 Replace(A1; 1; 1; "")
可以得出总数 - 谢谢! - SandraBYROW
。 - TheMasterREDUCE
: =REDUCE(2^99,A1:B2,LAMBDA(a,c,MIN(a, query(,"Select "&c&" label "&c&" ''",0) )))
这将计算 A1:B2
中的最小值。 - TheMaster复制并粘贴公式:
也许你可以从“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
演示 - 在sandstorm上: https://apps.sandstorm.io/app/a0n6hwm32zjsrzes8gnjg734dh6jwt7x83xdgytspe761pe2asw0
在Google电子表格中评估公式的简单技巧:
公式将得到评估!:)
这里有一个技巧。在所需单元格中插入公式,然后获取该单元格的值并用此新值替换已插入的公式。
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);
}
如何仅转换未以“+”开头的表达式列?
92/120 67/85
等等。