Есть ли способ оценить формулу, которая хранится в ячейке?
В таблице Google Docs я ищу что-то вроде =EVAL(A1)
, где для A1 задано значение "=1+2"
.
Я обнаружил, что в MS Excel есть функция EVALUATE()
(которая кажется немного сложной для правильного использования). Но я не смог найти ничего похожего в Google Docs.
Я также искал список функций function list, но не смог найти ничего полезного...
Ответы
Ответ 1
Нет, нет эквивалента Excel EVALUATE()
в Google Таблицах.
За этой длинной историей можно увидеть, например, этот старый пост.
Если вас просто интересует простая математика (как показано в вашем вопросе), это можно сделать легко с помощью настраиваемой функции.
function doMath( formula ) {
// Strip leading "=" if there
if (formula.charAt(0) === '=') formula = formula.substring(1);
return eval(formula)
}
Например, с вашим A1, положите =doMath(A1)
в другую ячейку, и это будет 3
.
Ответ 2
Короткий ответ
Как уже упоминалось , Google Таблицы не имеют встроенной функции EVALUATE, но Google Таблицы могут быть расширены, чтобы добавить эту функцию. К счастью, некоторые файлы SocialCalc могут быть использованы для упрощения.
Script
Вкл Таблица Google Я делюсь своим прогрессом. В это время я добавил файлы SocialCalc, которые, как мне кажется, требуются, и несколько функций, и несколько тестовых примеров.
ПРИМЕЧАНИЯ:
Использование
Функция 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
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
Ответ 3
Скопируйте и вставьте формулы:
Возможно, вы можете скопировать и вставить нужные вам формулы из "jQuery.sheet". Перемещено:
https://github.com/Spreadsheets/WickedGrid
Выглядит как "открытый источник"
Не исправлять проблему
Также: Проблема "Включить скрипты для использования стандартных функций электронных таблиц" отмечена как "Исправить Wont", см. https://code.google.com/p/google-apps-script-issues/issues/detail?id=26 p >
Ethercalc
есть Google, как электронная таблица с открытым исходным кодом, называемая Ethercalc
Код GUI:
https://github.com/audreyt/ethercalc
Формулы: https://github.com/marcelklehr/socialcalc
Демонстрация - на песчаной буре:
https://apps.sandstorm.io/app/a0n6hwm32zjsrzes8gnjg734dh6jwt7x83xdgytspe761pe2asw0
Ответ 4
Я знаю это старое сообщение. Мне просто интересно, почему никто не предложил:
myCell.getValue();
Это даст вам результат формулы в myCell (3 в вашем примере).
Если вы хотите записать результат в ячейку (вместо формулы), вы можете использовать:
function fixFormula(myCell) {
myCell.setValue(myCell.getValue());
}
Ответ 5
Простой взлом для оценки формул в электронной таблице Google:
- выделите ячейки или столбцы с формулами
- перейти Редактировать → Найти и заменить...
- установите флажок "И искать в формулах"
- заменить "=" на "=="
- заменить обратно "==" на "="
- в том же окне "Найти и заменить" снимите флажок "И искать в формулах"
формулы оценю! :)
Ответ 6
Преобразовать столбец выражений, которым не предшествует '+.
92/120
67/85
и т.д.