AppSheetでアプリを作っているときに、キーに1,2,3,4,,,,,というようなプラス1づつ増える連番の数字を設定したいことがあります。
ここではカラムに連番を設定する方法についてまとめています。
MAX関数を使う
指定したカラムの数値が1づつ増えるように設定するには、MAX関数を使うことで実現できます。結論的には、「INITIAL VALUE」に以下の式を記述します。※「FORMULA」ではありません。
MAX (テーブル名[カラム名])+1
これで連番の設定が完了です。
EDITABLE?をオフにする
カラムで連番に設定したものをキーに設定していたり、あるいは完全に固有で書き換え不可にする場合には、EDITABLE?のチェックも外しておく必要があります。
ただチェックを外すことでも対応可能ですが、明示的に「EDITABLEではない!」ということを示すために以下のように設定するとよりわかりやすくなります。
この設定をするには、カラムの設定メニューを開いて、「Editable?」の数式に「= false」と記載します。
右上の「Done」をクリックすれば設定完了です。
以下では、ここで使用した数式の解説をします。
数式は何をしているか?MAX関数とは何か
ここで使っているMAX関数とは引数で指定したリスト中から、最大の値を返す関数です。
MAX(リスト)
今回使用した数式は以下になります。
MAX (テーブル名[カラム名])+1
MAXの引数のリストとして、テーブル名[カラム名]
を指定しています。これは、指定したテーブルの中のカラムにあるすべてのデータを指しています。
MAX関数で最大値をとりだし、その値に「+1」するという処理になります。
実例
例えば、「ユーザー一覧テーブル」の「Noカラム」の現在の最大値を取得し、それに+1した値を設定するには以下のようにINITAL VALUEに数式を記述します。
MAX (ユーザー一覧[No])+1
MAX関数のそのほかの使い方
参考としてMAX関数のそのほかの使い方を紹介しておきます。
数値をベタ打ちで指定
使うことはないと思いますが、LIST関数を使って数字や文字列をベタ打ちすることもできます。
MAX(LIST(1, 2, 3))
SELECTとの併用
MAX関数をSELECT関数と一緒に使うことがよくあります。
MAX(SELECT(テーブル名[カラム名], 条件式, [重複の有無]))
実例1
例えば、条件式を「true」、重複の有無を省略すると次のような記述になります。
MAX(SELECT(テーブル名[カラム名], true))
これは、指定したテーブルの中のカラムにあるすべてのデータを指しています。すなわち以下と全く同じです。
MAX (テーブル名[カラム名])
実例2
条件式で他のカラムの値が〇〇の行だけを選択することもできます。
MAX(SELECT(ユーザ一覧[No], [都道府県]="東京", true))
これは、ユーザー一覧テーブルの都道府県カラムの値が「東京」となるもので、同じくユーザー一覧テーブルのNoカラムの値を重複除外でリスト化し、MAX関数で最大値を表示する数式です。
実例3
更に複雑なものだと以下のような数式があります。(//番号は解説で分かりやすくするためのものです。コピペする場合は削除してください)
MAX( //5
SELECT( //4
販売[割引額],
AND( //3
NOT([顧客].[従業員?]), //1
([販売日] > ( EOMONTH(TODAY(), -2) + DAY(TODAY()))) //2
)
)
)
SELECT関数では、第一引数で指定したテーブル名が他の引数のカラムの元となるテーブルとして引き継がれます。
このため、販売テーブルにおいて、(1)顧客カラムの参照先(ref先)の従業員カラムの値がtrueでない、すなわち従業員以外の顧客で (2) 販売日カラムの値が1か月以内の、(3)両方の条件を満たす、(4)割引額カラムの値のリストを取得し、(5)最大値を求める という処理になります。
連番をキーに設定するときの注意点
なお、複数人が同時にAppSheetを利用する場合は、MAX関数を使って連番のidを設定する方法は推奨されていません。
同時に登録があった場合、同じ数値が設定されてしまう可能性があるためです。
一意の値を生成してくれる「UNIQUEID関数」や「RANDBETWEEN関数」を使用します。
シートの行番号に対応した「_RowNumber」も行の追加や削除で番号が変わるリスクがあるため、KEYとしての設定は推奨されていません。
(参考)AppSheet Help What is a key?