it-swarm.com.ru

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

В электронной таблице Google Docs я ищу что-то вроде =EVAL(A1), где A1 имеет значение "=1+2".

Я обнаружил, что в MS Excel есть функция EVALUATE() (которая кажется немного сложной для правильного использования). Но я не смог найти ничего похожего в Google Docs.

Я также искал через список функций , но не смог найти ничего полезного ... 

17
Michael Krupp

Нет, в Google Sheets нет эквивалента EVALUATE() в Excel.

За этим стоит долгая история, см. этот старый пост например.

Если вы просто заинтересованы в простой математике (как показано в вашем вопросе), это можно легко сделать с помощью пользовательской функции .

function doMath( formula ) {
  // Strip leading "=" if there
  if (formula.charAt(0) === '=') formula = formula.substring(1);
  return eval(formula)
}

Например, с вашим A1, поместите =doMath(A1) в другую ячейку, и это будет 3.

13
Mogsdad

Короткий ответ

Как уже упоминалось ранее , Google Sheets не имеет встроенной функции EVALUATE, но Google Sheets можно расширить, чтобы добавить эту функцию. К счастью, некоторые файлы SocialCalc могут быть использованы для облегчения этого.

Скрипт

В таблица Google я делюсь своими успехами. В это время я добавил файлы SocialCalc, которые, на мой взгляд, требуются, и несколько функций, и несколько тестовых случаев.

ЗАМЕТКИ

  1. Специальные функции Google Sheets, такие как FILTER, UNIQUE и другие, недоступны в SocialCalc, а также другие функции, такие как SIGN.
  2. Я думаю, что файл SocialCalc должен быть заменен на тот, который находится на https://github.com/marcelklehr/socialcalc , как он выглядит, чтобы быть обновленным в последнее время. H/T для eddyparkinson (см. https://stackoverflow.com/a/16329364/1595451 )

Пользы

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

5
Rubén

Скопируйте и вставьте формулы:

Может быть, вы можете скопировать и вставить нужные формулы из "jQuery.sheet". Переехал в:

https://github.com/Spreadsheets/WickedGrid

Похоже, все "с открытым исходным кодом"

Не могу решить проблему

Также: вопрос «Включить сценарии для использования стандартных функций электронных таблиц» помечен как «Не удается исправить», см. https://code.google.com/p/google-apps-script-issues/issues/detail?id= 26

Ethercalc Существует электронная таблица с открытым исходным кодом, похожая на Google, которая называется Ethercalc.

Код GUI: https://github.com/audreyt/ethercalc

Формулы: https://github.com/marcelklehr/socialcalc

Демонстрация - на песчаной бури: https://apps.sandstorm.io/app/a0n6hwm32zjsrzes8gnjg734dh6jwt7x83xdgytspe761pe2asw0

2
eddyparkinson

Я знаю это старый пост. Мне просто интересно, почему никто не предложил:

myCell.getValue();

Это даст вам результат формулы в myCell (3 в вашем примере).

Если вы хотите записать результат в ячейку (вместо формулы), вы можете использовать:

function fixFormula(myCell) {
    myCell.setValue(myCell.getValue());
}
2
am2124429

Простой способ оценить формулы в электронной таблице Google:

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

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

0
ksuhaster