(Gスプレッドシート)ROW関数による連番の作成と注意点

 Googoleスプレッドシートには数列を生成するための関数がなく、代わりにROW関数がよく用いられます。
 特に表に連番を付与する際に利用されるケースが多いですが、データの追加・削除が行われる場合にはこの方法が適しないこともあります。
 また、セルの参照に依存するやり方なので、表外の行の削除等にも影響を受ける場合があります。
  • ROW関数を使って連番、さらには数列を生成することができます。
  • 途中の行を削除しても欠番を生じないのがメリットですが、データの性質によってはこの方法が適切でない場合があります。
  • また、ROW関数の性質上、参照先のセルや行が削除された場合等に番号が変わってしまうことがあります。対策例としてはINDIRECT関数を併用することが挙げられます。

手順

ROW関数による連番の作成

f:id:accs2014:20190608125053p:plain:right:w600

 2つの同じ内容の表があります。ROW関数を用いてこれらの表に1から5の連番を付与します。
 やり方は次の通りです。

 左の表:B5:B9の各セルに次のように記します。

=ROW()-4

「ROW()」により、そのセルの行番号が得られます。表の1行目の行番号が5ですので、4を差し引くことで番号が1から始まるようになります。

 右の表:E5セルに次のように記します。

=ARRAYFORMULA(ROW(1:5))

「1:5」つまり1行目から5行目の行番号を一挙に取得してARRAYFORMULA関数で並べるというものです。
 始まりと終わりの数字を直接指定できるので、一般にはこちらの方が使いやすいかと思います。また、「=TRANSPOSE(ARRAYFORMULA(ROW(1:5)))」とすれば数字を横に並べることもできます。
 

f:id:accs2014:20190608125051p:plain:right:w600

 実行結果です。
 とにかく1,2,3…n…という連番を作ることさえできれば、奇数の列(2n-1)を作ったり、同じ番号が3つずつ続く列(roundup(n/3))を作ったりすることも簡単なので、連番を作れるというのはとても便利で重要な機能です。

行を削除した時などに生じる問題

f:id:accs2014:20190608125049p:plain:right:w600

 さて、上記により作成した表から、行番号7の行を削除します。
 これにより両方の表から、番号が「3」で氏名が「加藤 三郎」の行が削除されます。

f:id:accs2014:20190608125047p:plain:right:w600

 削除後の様子です。
 左の表では「5」がなくなり表にフィットするような結果になります。右の表では「5」が表外に残ります。いずれも「3」が欠番になることはありません。
 この「欠番が出ないこと」が1つのメリットではあるのですが、「斉藤 四郎」「井上 五郎」の2名に着目すると、この2名の番号は削除前と比べて1つずつずれて、それぞれ「3」「4」になっています。
 これが注意すべきポイントです。この番号の意味が、納品書の明細番号のような「ただの行番号」であればよいのですが、各個人に与えられる不変のIDのようなものであれば問題ですので、このような番号の与え方が適当かどうか事前に判断する必要があります。

 

f:id:accs2014:20190608125045p:plain:right:w600

 もう一つ、さらに注意すべきなのはROW関数が表の外での操作に影響を受けることです。
 いったん表をもとに戻して、今度は行番号2の行を削除してみます。2つの表の外での操作ですので、2つの表に影響があってほしくはないのですが……

f:id:accs2014:20190608125130p:plain:right:w600

 左の表は番号「0」からの開始となり、右の表では「5」の番号がなくなってしまいました。
 ROW関数がそのセルの行番号、あるいは参照先の行番号に依存しているので当然なのですが、一見無関係に見える操作でデータが破壊されてしまうのは大きな問題です(この結果は参照を絶対参照にしても変わりません)。

 なお、これらの注意点は行を削除したときだけでなく、追加したときにも共通するものです。

 

INDIRECT関数による対策の例

f:id:accs2014:20190608125128p:plain:right:w600

 2つの注意点を挙げましたが後者はなかなか深刻で、これが解決できないようではROW関数での採番自体お勧めできるものではありません。
 そこで一つの対策として、ROW関数の引数にINDIRECT関数をはさみ、参照先アドレスを文字列化してしまうことが挙げられます。
 具体的には次のようになります。

=ARRAYFORMULA(ROW(INDIRECT("1:5")))

INDIRECT関数をはさむことで、「1:5」というセル参照が「"1:5"」という文字列に変わりますので、セルや行の操作の影響を受けなくなります。

f:id:accs2014:20190608125125p:plain:right:w600

 改めて行番号2の行を削除してみます。

f:id:accs2014:20190608125123p:plain:right:w600

 今度は何も変わりません。
 なお、行番号7の行を削除した場合の結果は最初の例の右の表と同じです(「5」が残る)。