AppSheet SELECT関数の使い方完全ガイド|構文・_THISROW・応用パターンまで徹底解説

AppSheet SELECT関数の使い方完全ガイド|構文・_THISROW・応用パターンまで徹底解説 AppSheet Editor アイキャッチ画像

ノーコードアプリ構築ツール「AppSheet」において、データ検索・抽出の要となるのがSELECT関数です。AppSheetでアプリを開発する際、条件に合うデータを抽出したり、動的なドロップダウンリストを作成したり、データを自動集計したりする場面で必ずと言っていいほど使用します。

この記事では、AppSheet初心者から中級者向けに、SELECT関数の基本的な書き方から、最重要概念である[_THISROW]の使い方、ANY・COUNT・SUMといった他の関数との組み合わせ、Valid_Ifでの実戦活用法、そしてアプリの動作が重くならないためのパフォーマンス改善テクニックまで詳しく解説します。

AppSheetにおけるSELECT関数の基礎知識

SELECT関数は、テーブル(またはビュー/スライス)から、特定の条件を満たすレコードの指定カラムの値をリスト(List)形式で抽出して返す関数です。

SQLのSELECT [カラム名] FROM [テーブル名] WHERE [条件]にとても近い役割を持っています。AppSheetでは、画面の入力制限(Valid_If)、仮想列(Virtual Column)での集計、アクションの実行対象指定など、多岐にわたる場所で利用されます。

注意ポイント: SELECT関数の返り値は常に「リスト型(List)」です。該当する値が1つだけであっても、あるいは該当するレコードが0件であっても、戻り値はリスト(空リスト含む)になります。単一の値(TextやRefなど)として扱いたい場合は、ANY()関数などと組み合わせる必要があります。

SELECT関数の基本構文と引数の意味

SELECT関数の基本構文は以下の通りです。

SELECT( テーブル名[抽出カラム名] , [絞り込み条件式] , [重複を削除するかどうか] )

各引数の詳細と書き方は以下の通りです。

引数必須 / 任意説明
テーブル名[抽出カラム名]必須Table[Column]抽出したい値が入っているテーブルとカラムを指定します。(例: 顧客[顧客ID]
[絞り込み条件式]任意Yes/No (Boolean)抽出の条件を指定します。TRUEと評価された行のみ抽出されます。省略した場合は全件が抽出されます。
[重複を削除するかどうか]任意Yes/No (Boolean)TRUEを指定すると重複する値を排除したユニークなリストを返します。省略時はFALSE(重複あり)となります。

SELECT関数の基本的な使い方と具体例

理解を深めるために、代表的な条件設定の例を見てみましょう。

全件のリストを取得する場合

第2引数の条件式を省略すると、指定したカラムの全データをリストとして取得します。

SELECT(商品[商品名])

結果: リスト ("りんご", "みかん", "バナナ", "りんご")

重複を除外して全件取得する場合

第3引数にTRUEを指定すると、重複が排除されます。

SELECT(商品[カテゴリ], TRUE, TRUE)

※第2引数を入れずに重複除外を行いたい場合、第2引数にTRUE(=全行を対象とする条件)を指定します。

特定の静的条件で絞り込む場合

「在庫数が10個以下」の商品IDのみを抽出する例です。

SELECT(商品[商品ID], [在庫数] <= 10)

[_THISROW]を使った現在行の参照(最重要ポイント)

SELECT関数を使う上で最もつまずきやすいのが、「現在操作中の行の値」と比較したい場合です。

たとえば、「注文フォームに入力中の顧客IDと同じ、過去の注文履歴」を取得したい場合、単に [顧客ID] = [顧客ID] と書くと、SELECT対象のテーブルの顧客ID同士を比較してしまい、常にTRUEになってしまいます。

そこで使用するのが [_THISROW] です。

SELECT( 注文[注文ID] , [顧客ID] = [_THISROW].[顧客ID] )

この式の評価イメージは以下のようになります。

  • [顧客ID] : SELECTで検索している「注文」テーブルの各行の顧客ID
  • [_THISROW].[顧客ID] : 現在開いている画面・フォーム・処理対象の「顧客ID」

親テーブル(顧客)と子テーブル(注文)の連携や、フォーム入力時の動的フィルタリングでは、[_THISROW]の理解が不可欠です。

集計関数・他関数との組み合わせパターン

SELECT関数は、単体で使うよりも他の関数と組み合わせることで真価を発揮します。

ANY関数・LOOKUP関数との組み合わせ(単一値の取得)

SELECT関数はリストを返すため、特定条件に合う値「1つ」を取り出したいときはANY()で囲みます。

ANY( SELECT( 社員[メールアドレス] , [社員番号] = [_THISROW].[担当社員番号] ) )

※なお、主キー(Key)による検索で1つの値を取得する場合は、AppSheet組み込みのLOOKUP()関数を使う方が簡潔に記述できます。

COUNT関数・SUM関数との組み合わせ(集計・カウント)

特定の条件に該当するレコードの件数や合計値を算出するパターンです。

件数のカウント(COUNT):

COUNT( SELECT( 案件[案件ID] , AND([担当者ID] = [_THISROW].[社員ID], [ステータス] = "進行中") ) )

合計値の算出(SUM):

SUM( SELECT( 注文明細[金額] , [注文ID] = [_THISROW].[注文ID] ) )

AppSheet開発での主な活用シーン

ドロップダウンリストの動的制御(Valid_If)

フォーム入力時、「選択したカテゴリに属する商品だけをドロップダウンに表示したい」場合、商品の選択欄のValid_If属性にSELECT関数を設定します。

SELECT( 商品[商品ID] , [カテゴリ] = [_THISROW].[選択カテゴリ] )

仮想列(Virtual Column)でのデータ集計

顧客テーブルに仮想列「合計購入金額」を作成し、関連する注文テーブルの金額をリアルタイムで集計表示させることができます。

SUM( SELECT( 注文[合計金額] , [顧客ID] = [_THISROW].[顧客ID] ) )

アクション(Action)での対象レコード抽出

「一括で特定のステータスを更新する」ようなアクション(Data: execute an action on a set of rows)を実行する際、対象行を指定するためにSELECT関数を使用します。

SELECT関数を使う際の注意点とパフォーマンストラブル対策

SELECT関数は強力ですが、乱用するとAppSheetアプリの動作(同期速度や画面切り替え)が著しく低下する原因になります。

  • 仮想列(Virtual Column)での多重SELECTに注意:
    仮想列に配置されたSELECT関数は、アプリ内の全行×全仮想列で計算されます。データ数が数千件を超えると、アプリ起動やデータ同期が非常に重くなります。
  • Slices(スライス)の活用:
    あらかじめFilter条件を設定したSliceを作成しておき、SELECT(スライス名[カラム名], 条件)とすることで、検索対象の行数を減らし高速化できます。
  • Ref関係とREF_ROWS()の利用:
    親テーブルと子テーブルがRef(参照関係)で正しく結ばれている場合、AppSheetは自動的にRelated 注文sのようなREF_ROWS()列を作成します。自作のSELECT関数を使わずに、標準のREF_ROWS()を利用する方が処理が最適化されます。

まとめ

AppSheetのSELECT関数について、基礎から実践活用まで解説しました。

  • SELECT関数は、条件に合ったデータをリスト型で取得する。
  • フォームや親テーブルのカラムと比較する場合は[_THISROW].[カラム名]が必須。
  • 単一値はANY()、集計はCOUNT()SUM()と組み合わせる。
  • パフォーマンス低下を防ぐため、仮想列での乱用を避け、Ref関係やSliceも活用する。

SELECT関数をマスターすると、AppSheetで構築できる業務アプリの自由度が格段に上がります。ぜひ自社のアプリ開発で活用してみてください。