web-dev-qa-db-ja.com

カスタム関数への非決定的パラメーター

Googleスプレッドシートに問題があります。スクリプトエディターを使用してカスタム関数を作成し、渡すパラメーターが既知の(定数)値である場合にのみ正常に実行されます。

パラメーターが非決定的関数である場合、Thinking...テキストが表示され、評価は完了しません。

非決定的関数とは、呼び出されるたびに結果が異なる可能性がある関数を意味します(例:Rand()Now())。

これを説明するために、2つの例を示します。

1.数値に1を加算する関数

コードは次のとおりです。

function plusOne(i) {
  return i + 1;
}

予想どおり、セルに=plusOne(5)と入力すると、結果は6になります。

ただし、=plusOne(Rand())と入力すると、1から2の間のランダムな結果が得られると予想されます(ドキュメントではRand()と述べているように) "

=plusOne(Rand())は評価を終了せず、セルは "Thinking ..."状態のままです。

2.日付から月を取得する関数

function gimmeMonth(date) {
  return date.getMonth() + 1;
}

繰り返しますが、定数パラメーターでこれを呼び出すと、正常に機能します。たとえば、セル2012-08-31A1と入力すると、式=gimmeMonth(A1)は期待される結果8を返します。

ただし、=gimmeMonth(now())は評価されませんが、この場合、組み込みのmonth()関数は正常に機能します(=month(now())は期待される結果を返します)。

これが必要な理由

avoid cache にするために、カスタム関数呼び出しに非決定的なパラメーターを追加できる必要があります。

他の誰かがこの問題を抱えていますか?誰もそれを解決できましたか?

6

私はいくつかの研究を行ってきましたが、それは古いMS Excelバージョンからであっても、古い問題のようです。

最も簡単な方法は、独自のランダム化関数を作成することです。この方法では、ランダムな値は再生成されません。以前と同じ方法で使用します=plusOne(myRandom())

function plusOne(i) {
  return i + 1;
}

function myRandom() {
  # Some function
  return Math.random();
}

短くすることもできます=myRandom()

function myRandom() {
  # Some function
  return Math.random() + 1;
}
5