Googleスプレッドシートの数式に一時変数を保存する方法は?


19

Googleスプレッドシートで次のような式を作成しようとしています。

if (x < 0, x + 1, x)

if x0return よりも小さい場合、returnを意味しx + 1ますx

ただし、xそれ自体は式A1 + B1です。だから私は結局:

if ((A1 + B1) < 0, (A1 + B1) + 1, (A1 + B1))

(A1 + B1)を一時変数に保存して、xこれを行うにはどうすればよいですか?:

x = (A1 + B1);
if (x < 0, x + 1, x);

スプレッドシートの現在の式は次のようになります。

if(
    timevalue(Sheet1!$D10)-timevalue(min(filter(Sheet1!$D$2:$D$99,Sheet1!$A$2:$A$99=A10,Sheet1!$E$2:$E$99=E10))))
    < 0,
    1 +
    timevalue(Sheet1!$D10)-timevalue(min(filter(Sheet1!$D$2:$D$99,Sheet1!$A$2:$A$99=A10,Sheet1!$E$2:$E$99=E10))))
    ,
    timevalue(Sheet1!$D10)-timevalue(min(filter(Sheet1!$D$2:$D$99,Sheet1!$A$2:$A$99=A10,Sheet1!$E$2:$E$99=E10))))
)

私はこのように短くて管理しやすいようにしようとしています:

x = timevalue(Sheet1!$D10) - timevalue(min(filter(Sheet1!$D$2:$D$99,Sheet1!$A$2:$A$99=A10,Sheet1!$E$2:$E$99=E10))));
if(
    x
    < 0,
    1 +
    x
    ,
    x
)

1
@pnuts、うーん、変数は式の一部です。セルはRAMではなくビジネスデータを格納するためのものであるため、一時的な変数としてセルをハッキングすることは汚い解決策のように感じます。
Pacerier 14

1
@pnuts、セルに保存されていなければ、どこに保存されていてもかまいません。セルは、ビジネスデータを格納するためのものです。
Pacerier 14

1
@pnuts、スクリプトソリューションは、次善策として考えられます。データがセルに表示されない限り、実行可能なソリューションです。
14

回答:


6

私はしばしば、頻繁に使用される計算の変数としてセルを使用し、実際には「名前付き範囲」を使用してそれらに名前を付けます。開発しようとしている式について考えるのが簡単になります。これらのセルを表示したくない場合は、非表示にすることができます。


より良いものが登場するまで、これを選択されたソリューションとして採用します。
Pacerier

4

短い答え

現時点では、Googleスプレッドシートには、セルや範囲の参照ではなく、数式で定義された変数に名前を割り当てる機能がありません。これらの種類の変数で数式を使用するには、代わりにカスタム関数を使用します。

Googleスプレッドシートのカスタム関数

カスタム関数は、Google Apps ScriptsバインドプロジェクトまたはGoogleスプレッドシートアドオンで定義されます。これらは値を返すためにのみ使用でき、電子メールの送信などのタスクを自動化するためには使用できません。

カスタム関数はJavaScript関数に似ており、JSDOCを使用して、オートコンプリートなどの組み込み関数機能を追加し、ポップアップ式ヘルパーを表示できます。また、カスタムエラーメッセージを含めることもできます。

質問に示されている場合、セルに表示される式の望ましい構造は、次の構造を持つ必要があります

if(x < 0, 1 + x, x)

どこxがカスタム関数である可能性があります。

以下は、JSDOCを使用するカスタム関数の簡単な例です。

/**
* Returns the cell value of the specified row in column A of Sheet1.
* @param {number}   row_number   Input the row number.
* @return The cell value of the specified row in column A of Sheet1.       
* @customfunction
*/
function z(row_number) {
  if(typeof(row_number) != 'number') 
    throw new Error("A row number is required");
  return SpreadsheetApp
           .getActiveSheet()
           .getRange("Sheet1!A"+row_number)
           .getValue();
}

質問で指定された構造を持つ上記のカスタム関数を使用した式は、次のようになります

=if(z(10) < 0, 1 + z(10), z(10))

row() 定数の代わりに、数式が配置される行を入力として使用できます。

質問で提示された明示的な式を「エミュレート」するには、組み込みの式をJavasScript / Google Apps Script関数に置き換える必要があります。

参照資料


JSの代わりにGoogleスプレッドシートの関数を使用してカスタム関数を定義することは可能でしょうか?私はこの方向で何も見つけなかったので、私はそれを疑います。
アンデルステッド

@anderstood:現時点では不可能です。参照してくださいstackoverflow.com/questions/3686061/...
ルベン・

3

私はこれにいくつかの試みをしています(特に長い数式の場合、これは非常に便利な機能になると思います。これまでに書いたことは次のとおりです。

//array to store variables
var variables = [];

//Wrap a formula with "D_VAR0()" for later use
function D_VAR0(formula) {
  variables.push(formula);
}

//Write "VAR0" to access the 0th element of variables[] (which could be a long formula)
function VAR0() {
  return variables[0];
}

理論的には、これは次のような複雑なセル式を単純化するのに役立ちます。

=IF((A2+B2)/B3<16, (A2+B2)/B3, ((A2+B2)/B3)*45)

これに:

=IF(D_VAR0((A2+B2)/B3)<16, VAR0, VAR0*45)

追加しD_VAR#'sVAR#'s必要に応じて複数の変数宣言と呼び出しを可能にするためにスクリプトに書き込むことができます。

ただし、D_VAR0ラップされた変数をvariables []配列に適切に保存していないようです。

配列内の要素を手動で入力すると、VAR0はその要素にアクセスしてアクティブセルに戻すことができます。例えば:

var variables = ["test"];

//results in the active cell being set to "test"
function VAR0() {
     return variables[0];
}

これにより、2つの質問が残ります。以下が可能であれば、カスタム関数を介して一時変数を宣言して呼び出すことが可能だと思います。

  1. カスタム関数が配列要素にアクセスできる場合、要素を配列に格納できますか?もしそうなら、どのように?

  2. カスタム関数が要素を配列に格納できる場合、それらは同じセル内の同じ連続式内でのみアクセス可能ですか?または、別のセルにある同じ保存変数にアクセスできますか?例:

Cell A1 = D_VAR0(sum(3,5))

Cell D4 = VAR0() //would this return 8 in cell D4? It hasn't worked in my testing.

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.