Googleスプレッドシートに問題があります。スクリプトエディターを使用してカスタム関数を作成し、渡すパラメーターが既知の(定数)値である場合にのみ正常に実行されます。
パラメーターが非決定的関数である場合、Thinking...
テキストが表示され、評価は完了しません。
非決定的関数とは、呼び出されるたびに結果が異なる可能性がある関数を意味します(例:Rand()
、Now()
)。
これを説明するために、2つの例を示します。
コードは次のとおりです。
function plusOne(i) {
return i + 1;
}
予想どおり、セルに=plusOne(5)
と入力すると、結果は6
になります。
ただし、=plusOne(Rand())
と入力すると、1から2の間のランダムな結果が得られると予想されます(ドキュメントではRand()
と述べているように) ")
式=plusOne(Rand())
は評価を終了せず、セルは "Thinking ..."状態のままです。
function gimmeMonth(date) {
return date.getMonth() + 1;
}
繰り返しますが、定数パラメーターでこれを呼び出すと、正常に機能します。たとえば、セル2012-08-31
にA1
と入力すると、式=gimmeMonth(A1)
は期待される結果8
を返します。
ただし、=gimmeMonth(now())
は評価されませんが、この場合、組み込みのmonth()
関数は正常に機能します(=month(now())
は期待される結果を返します)。
avoid cache にするために、カスタム関数呼び出しに非決定的なパラメーターを追加できる必要があります。
他の誰かがこの問題を抱えていますか?誰もそれを解決できましたか?
私はいくつかの研究を行ってきましたが、それは古い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;
}