2014年3月2日日曜日

Google スプレッドシートで「配列数式」に与える「範囲」を誤ると、無限ループに陥る

1. カスタム関数で無限ループに陥る場合

Google スプレッドシートで「配列数式」を使うメリットは、「行」を追加した場合、自動的に再計算がされること。

しかし、数式に与える「範囲」、セルの「位置」に注意しないと無限ループに陥る。

例えば、列を与えると、そのコピーを返す関数があるとする。

SnapCrab_No-0829

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 列にコピーされた。

SnapCrab_No-0830

ここで誤って B2 セル

=copyColumn(A:A)

を入力したとする。その結果、行が無限に増殖してしまう。

SnapCrab_No-0831

なぜなら、copyColumn に与える範囲は A 列 であり、固定された行数を指定していない。そのため、

  1. A1 ~ A9 の値が B2 ~ B10 にコピーされる。
  2. シートに一行追加される。
  3. A10 セルの値が B11 にコピーされる。
  4. A:A の示す範囲は、最初より 1 行多くなった。
  5. そのため、copyColumn の処理が更に進む。

このように、無限ループに陥り、行が限りなく増殖してしまう。

 

2. ARRAYFORMUAL で行の増殖

カスタム関数と同じように、ARRAYFORMUAL 関数でも同じことが言える。

例えば、A 列の値を 2 倍した結果を B 列に表示したい。

B1 セル

=arrayformula(A:A * 2)

と入力する。

SnapCrab_No-0832

これに対して、B2 セル

=arrayformula(A:A * 2)

と入力すると、B2 セルの右肩に三角のマークが表示される。

注意: この結果の 1 つ以上のエントリを表示できません。表示するには、このセルを選択して Ctrl+E を押してください。

注意書きに従い、Ctrl + E を押すと、行が増殖していく。

SnapCrab_No-0833

 

関連記事