34

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

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

関数リストも検索しましたが、役立つものは見つかりませんでした...

4

9 に答える 9

7

簡潔な答え

前述のとおり、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
      }
    }
  }
}

式1.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

于 2016-11-22T04:20:41.493 に答える
2

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

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

https://github.com/Spreadsheets/WickedGrid

すべて「オープンソース」のようです

問題を修正しない

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

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

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

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

デモ - 砂嵐: https://apps.sandstorm.io/app/a0n6hwm32zjsrzes8gnjg734dh6jwt7x83xdgytspe761pe2asw0

于 2013-05-02T02:21:26.310 に答える
0

これがトリックです。必要なセルに数式を挿入し、そのセルの値を取得して、既に挿入されている数式をこの新しい値に置き換えます。

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);
}
于 2021-08-21T06:58:40.717 に答える