LoginSignup
1
2

More than 5 years have passed since last update.

【Googleスプレッドシート】複数の条件に一致するレコードごとに連番を振る

Posted at

一般的に使うケースはあまり無いかもしれません。
ですが、ゲーム開発でデータ管理をしようと自分はよく使います。

こんな表でモンスターを管理したい

Name Id Attribution Rank Serial
Slime 100 1 1 0
Mermaid 101 1 1 1
Slime 102 1 1 2
Alligator 103 1 2 0
Lizardman 104 1 2 1
Merman 105 1 2 2
Blue Demon 106 1 3 0
Shark Man 107 1 3 1
Sea Dragon 108 1 3 2
Goblin 200 2 1 0
Pumpkin head 201 2 1 1
Fire Lizard 202 2 1 2
Red Demon 203 2 2 0
Dragon Puppy 204 2 2 1
Goblin Sherman 205 2 2 2
カラム名 説明
Name モンスターの名前
Id 一意な値
Attribution 属性
Rank ランク
Serial 属性、ランクごとの連番

※条件付き書式で色付けたりすると見やすい
image.png

IdとかSerialを自動で振りたい

開発中だとモンスターのレコードを増やしたり減らしたり、属性やランクを変更したり、が何度も発生します。

その都度IdやSerialを手動で振り直すのは面倒です。そこで、スプレッドシートの関数を使って自動で振られるようにします。

Idの振り方(条件ごとに連番)

Idの採番ルールは、百の位が属性、十の位以外が連番なります。
なので、属性ごとに連番が振られるように関数を使います。

使えるのはCOUNTIF(範囲, 条件)です。
公式ドキュメント

今回のケースではC2セルに次の関数を入れて使います。
=COUNTIF(C$2:C2,C2)+C2*100-1
範囲の開始を1行目のレコードで固定にするため、C$2を開始として、終了を自分のセルC2にしているのがポイントです。
1の位が0から始まって欲しいので最後に-1をしてます。

Serialの振り方(複数条件ごとに連番)

Serialの採番ルールは、属性とランクが同じモンスターごとに連番になります。
今度は複数の条件を見る必要があるので、COUNTIF(範囲, 条件)は使えません。

代わりにCOUNTIFS(条件範囲1, 条件1, [条件範囲2, 条件2, ...])を使います。
公式ドキュメント

今回のケースではC2セルに次の関数を入れて使います。
=COUNTIFS(C$2:C2,C2,D$2:D2,D2)-1
まず条件範囲1, 条件1には、Idと同じようにC列Attributionを設定します。
次に、条件範囲2と条件2を設定します。
D列でも範囲の開始を1行目のレコードで固定にするため、D$2を開始として、終了を自分のセルD2にしているのがポイントです。
1の位が0から始まって欲しいので最後に-1をしてます。

これで貼り付けたスクリーンショットのような表が完成します。

注意点

1.レコードの順番を入れ替えるとズレる
条件のセル位置はズレるのに範囲(条件範囲)のセル位置は変わらないため、数値がズレてしまいます。データを編集後、ゲームに流し込む前には一度正しい関数を貼り付け直す必要があります。

2.リリース後はIdを変えない
当然の話ですが、リリース後にIdを変えるとプレイヤーのデータが不整合を起こす可能性があります。

今回のようにモンスターだとあまり問題がないかもしれませんが、プレイヤーが所有するアイテムや装備品だと持ち物が入れ替わるため非常にまずいです(データの持ち方によります)。
モンスターを仲間にできるシステムがあると装備品と同様の問題が発生します。

動的なId採番はあくまで開発中の仕組みと割り切って活用しましょう。

1
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
2