web-dev-qa-db-ja.com

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

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

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

x0より小さい場合は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
)
18
Pacerier

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

6

簡潔な答え

現時点では、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関数に置き換える必要があります。

参照資料

4
Rubén

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

//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. カスタム関数でaccess配列要素を使用できる場合、store配列の要素も使用できますか?もしそうなら、どのように?

  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.

3
Andrew