web-dev-qa-db-ja.com

セルに保存されている数式を評価する方法はありますか?

Googleドキュメントのスプレッドシートで、=EVAL(A1)のようなものを探しています。A1は_"=1+2"_に設定されています。

MS ExcelにはEVALUATE()関数があることを知りました(適切に使用するのは少し難しいようです)。しかし、Googleドキュメントでは同様のものが見つかりませんでした。

関数リスト も検索しましたが、役に立ちませんでした...

20
Michael Krupp

いいえ、GoogleスプレッドシートにはExcelのEVALUATE()に相当するものはありません。

この記事の背後には長い歴史があります。たとえば this old post を参照してください。

(質問に示されているように)単純な数学にのみ興味がある場合は、 カスタム関数 を使用して簡単に計算できます。

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

たとえば、A1では、=doMath(A1)を別のセルに配置すると、_3_になります。

16
Mogsdad

短い答え

前述のように 以前は ですが、Googleスプレッドシートには組み込みのEVALUATE関数はありませんが、Googleスプレッドシートを拡張してこの関数を追加することができます。幸いなことに、いくつかのSocialCalcファイルを使用して、これを簡単にすることができます。

脚本

Googleスプレッドシート 進捗状況を共有しています。この時点で、必要だと思われるSocialCalcファイルといくつかの関数、およびいくつかのテストケースを追加しました。

[〜#〜]メモ[〜#〜]

  1. FILTER、UNIQUEなどのGoogleスプレッドシート固有の関数は、SIGNなどの他の関数と同様、SocialCalcでは使用できません。
  2. 最近更新されそうなので、SocialCalcファイルは https://github.com/marcelklehr/socialcalc のファイルに置き換える必要があると思います。 eddyparkinsonへのH/T( https://stackoverflow.com/a/16329364/1595451 を参照)

用途

リンクされたファイルの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

5
Rubén

数式をコピーして貼り付けます:

「jQuery.sheet」から必要な数式をコピーして貼り付けることができます。へ移動:

https://github.com/Spreadsheets/WickedGrid

すべて「オープンソース」のように見える

問題を修正しない

また、「スクリプトで標準のスプレッドシート関数を使用できるようにする」の問題は「修正されない」とマークされています https://code.google.com/p/google-apps-script-issues/issues/detail? id = 26

EthercalcEthercalcと呼ばれるGoogleのようなオープンソーススプレッドシートがあります

GUIコード: https://github.com/audreyt/ethercalc

数式: https://github.com/marcelklehr/socialcalc

デモ-砂嵐について: https://apps.sandstorm.io/app/a0n6hwm32zjsrzes8gnjg734dh6jwt7x83xdgytspe761pe2asw

2
eddyparkinson

これは古い記事です。私はただ疑問に思っています、なぜ誰も提案しませんでした:

myCell.getValue();

これにより、myCellの数式の結果(例では3)が得られます。

(数式ではなく)結果をセルに書き込む場合は、次のように使用できます。

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

Googleスプレッドシートで数式を評価するための簡単なハック:

  1. 数式でセルまたは列を選択する
  2. 編集->検索と置換...
  3. 「数式でも検索」をチェック
  4. 「=」を「==」に置き換えます
  5. 「==」を「=」に戻す
  6. 同じ[検索と置換]ウィンドウで、[数式でも検索]をオフにします

数式が評価されます! :)

1
ksuhaster

単純な数学(A1: "(1 + 2)* 9/3"など)を評価する場合は、クエリを使用できます。

=query(,"Select "&A1&" label "&A1&" ''",0)
0
TheMaster

`+が前に付いていない式の列を変換します。

92/120
67/85

等.

0
bbneo