1. カスタム関数で無限ループに陥る場合
Google スプレッドシートで「配列数式」を使うメリットは、「行」を追加した場合、自動的に再計算がされること。
しかし、数式に与える「範囲」、セルの「位置」に注意しないと無限ループに陥る。
例えば、列を与えると、そのコピーを返す関数があるとする。
A 列の値を B 列にコピーするための関数を、以下のように定義した。
function copyColumn(col){ var result = []; for (var i = 0; i < col.length; i++){ result[i] = [col[i]]; } return result; }
B1 セルに
=copyColumn(A:A)
を入力する。その結果、A 列の値を B 列にコピーされた。
ここで誤って B2 セルに
=copyColumn(A:A)
を入力したとする。その結果、行が無限に増殖してしまう。
なぜなら、copyColumn に与える範囲は A 列 であり、固定された行数を指定していない。そのため、
-
A1 ~ A9 の値が B2 ~ B10 にコピーされる。
-
シートに一行追加される。
-
A10 セルの値が B11 にコピーされる。
-
A:A の示す範囲は、最初より 1 行多くなった。
-
そのため、copyColumn の処理が更に進む。
このように、無限ループに陥り、行が限りなく増殖してしまう。
2. ARRAYFORMUAL で行の増殖
カスタム関数と同じように、ARRAYFORMUAL 関数でも同じことが言える。
例えば、A 列の値を 2 倍した結果を B 列に表示したい。
B1 セルに
=arrayformula(A:A * 2)
と入力する。
これに対して、B2 セルに
=arrayformula(A:A * 2)
と入力すると、B2 セルの右肩に三角のマークが表示される。
注意: この結果の 1 つ以上のエントリを表示できません。表示するには、このセルを選択して Ctrl+E を押してください。
注意書きに従い、Ctrl + E を押すと、行が増殖していく。
0コメント:
コメントを投稿