Есть ли способ оценить формулу, которая хранится в ячейке?

В таблице 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, которые, как мне кажется, требуются, и несколько функций, и несколько тестовых примеров.

ПРИМЕЧАНИЯ:

  • В программе Google Таблицы недоступны определенные функции, такие как FILTER, UNIQUE, среди других, а также другие функции, такие как SIGN.
  • Я думаю, что файл SocialCalc должен быть заменен на https://github.com/marcelklehr/socialcalc, поскольку он выглядит недавно обновленным. H/T в eddyparkinson (см. fooobar.com/questions/603331/...)

Использование

Функция 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:

  1. выделите ячейки или столбцы с формулами
  2. перейти Редактировать → Найти и заменить...
  3. установите флажок "И искать в формулах"
  4. заменить "=" на "=="
  5. заменить обратно "==" на "="
  6. в том же окне "Найти и заменить" снимите флажок "И искать в формулах"

формулы оценю! :)

Ответ 6

Преобразовать столбец выражений, которым не предшествует '+.

92/120
67/85

и т.д.