アルアカ - Arcadia Academia

Arcadia Academiaは「エンジニアリングを楽しむ」を合言葉に日本のデジタル競争力を高めることをミッションとするテックコミュニティです。

【第2回】AppSheetのRefで親子連携!在庫管理アプリで学ぶテーブル連携の基本

Featured image of the post

「AppSheetでアプリは作れたけど、データがバラバラで使いにくい…」

「関連する情報をどうやって連携させればいいの?」

もしあなたが第1回でシンプルな在庫管理アプリを作成し、次にデータの「つながり」に課題を感じているなら、この第2回はあなたのためのものです。AppSheetの真価は、複数のテーブル(スプレッドシートのシート)を連携させ、リッチなデータ構造を構築できる点にあります。

今回は、第1回で作成した「物品マスタ」と「在庫管理」の2つのテーブルを題材に、AppSheetにおけるデータ連携の要となるRef型に焦点を当てます。Refの基本から、逆参照デレファレンス、そしてIs part ofといった応用テクニックまで、徹底的に解説します。この記事を読み終える頃には、データが有機的に連携し、より実用的な在庫管理アプリがあなたの手元で動き出すはずです。さあ、AppSheetのデータ連携の奥深さを探求しましょう!


[目次を開く]

本記事でできること(完成イメージ)

  • AppSheetのRef型(参照)の概念と、複数テーブル間のデータ連携の重要性を理解できます。
  • 物品マスタ在庫管理テーブルを連携させ、関連データをアプリに表示できます。
  • 逆参照(Reverse Reference)を使って、親テーブルから子テーブルの関連データを一覧表示できます。
  • デレファレンス(Dereference)の仕組みを理解し、関連テーブルの列データを活用できます。
  • Is part ofプロパティの役割を理解し、データの親子関係を適切に設定できます。
  • より実用的で、データの整合性が保たれたAppSheetアプリを構築する基礎を習得できます。

AppSheetにおけるRef(参照)の基本

AppSheetで複数のデータソース(スプレッドシートのシート)を連携させる際に、最も重要となるのがRef(リファレンス、参照)型です。これはリレーショナルデータベースにおける外部キーのような役割を果たし、異なるテーブル間の関係性を定義します。

Ref型とは?なぜ必要か?

Ref型は、あるテーブルの列が、別のテーブルの特定の行を指し示すためのデータ型です。例えば、第1回で作成した「在庫管理」テーブルの各レコードは、どの「物品マスタ」の物品に関する情報なのかを示す必要があります。この「どの物品か」を明確にするのがRef型です。

なぜRef型が必要なのでしょうか?

  1. データの整合性: 物品マスタに存在しない物品IDが在庫管理テーブルに入力されるのを防ぎます。これにより、データの誤入力を減らし、信頼性を高めます。
  2. データの一貫性: 物品マスタで物品名や型式が変更された場合、Ref型で連携していれば、在庫管理テーブル側の表示も自動的に更新されます。データの二重管理や不整合を防ぎます。
  3. アプリの利便性: 在庫管理の入力フォームで物品IDを選択する際、物品マスタから選択肢をドロップダウンリストとして表示できます。また、選択した物品IDに基づいて、物品名や型式などの関連情報を自動的に表示させることができます。
  4. 効率的なデータ構造: 物品マスタに登録されている情報を在庫管理テーブルに重複して持たせる必要がなくなります。これにより、スプレッドシートの容量を節約し、管理を簡素化できます。

物品マスタと在庫管理テーブルの連携

第1回で作成したスプレッドシート「在庫管理」には、以下の2つのシート(テーブル)があります。

  • 物品マスタ: 物品の基本情報(ID, 物品名, 型式, 物品の種類)
  • 在庫管理: 各物品の在庫状況(連番, ID, 物品名, 型式, 物品の種類)

ここで、「在庫管理」テーブルのID列が、「物品マスタ」テーブルのID列を参照するように設定します。これにより、「在庫管理」テーブルの各行が、どの「物品マスタ」の物品に対応するのかが明確になります。

Image in a image block

この関係性をAppSheetで定義することで、アプリはより賢く、より使いやすくなります。次のセクションでは、実際にAppSheetエディタでRef型を設定し、その効果を確認していきましょう。

Ref型の設定と確認

それでは、実際にAppSheetエディタでRef型を設定し、その動作を確認していきましょう。第1回で作成したAppSheetアプリを編集モードで開いてください。

在庫管理テーブルの物品名列をRef型に設定

在庫管理テーブルの物品名列をRef型に設定することで、この列が物品マスタテーブルの物品名列を参照するようになります。

  1. AppSheetエディタの左側メニューから「Data」→「Tables」を選択します。
  2. 在庫管理テーブルをクリックし、「Columns」タブを開きます。
  3. 物品名列を探し、そのTypeRefに変更します。
  4. Ref型を選択すると、追加で「Source table」の選択肢が表示されます。ここで、参照先のテーブルとして物品マスタを選択します。
Image in a image block
  1. 設定を保存(画面右上のDONEをクリック)します。これで、在庫管理テーブルの物品名列は物品マスタテーブルの物品名列を参照するようになりました。アプリのプレビュー画面で、在庫管理テーブルのFormビューを開いてみてください。物品名列がテキスト入力欄ではなく、物品マスタに登録されている物品名(ラベル列として設定した物品名が表示されているはずです)を選択するドロップダウンリストになっているはずです。

関連列(物品名, 型式, 物品の種類)の自動取得

物品名列をRef型に設定した上で、在庫管理テーブル内の物品名型式物品の種類といった列を、参照先の物品マスタテーブルの対応する列から自動的に値を取得するように設定することができます。これらの列で、FORMULAを設定していきます。

  1. 在庫管理テーブルの「Columns」タブで、物品名型式物品の種類を以下のような式に設定します。
    [物品名].[物品名]  // 物品名列の場合
    [物品名].[型式]    // 型式列の場合
    [物品名].[物品の種類] // 物品の種類列の場合

    この式は「物品名列が参照している物品マスタテーブルの行から、物品名(または型式物品の種類)の値を引っ張ってくる」という意味になります。

    Image in a image block

逆参照(Reverse Reference)で関連データを表示する

Ref型を設定することで、在庫管理テーブルから物品マスタの情報を参照できるようになりました。今度はこの関係性を逆方向から見てみましょう。つまり、物品マスタの各物品が、どの在庫管理レコードで使われているか(=どの在庫があるか)を表示する方法です。これをAppSheetでは「逆参照(Reverse Reference)」と呼びます。

物品マスタから在庫管理を参照する

Ref型を設定すると、AppSheetは自動的に参照元のテーブル(この場合は物品マスタ)に、参照先のテーブル(在庫管理)への「逆参照」の列を追加します。この列は通常、Related [参照先テーブル名]という名前のVirtual Columnとして生成されます。

  1. AppSheetエディタの「Data」→物品マスタテーブルをクリックします。
  2. Related 在庫管理テーブルという名前の列(またはそれに類する名前)が自動的に追加されていることを確認します。この列のTypeListになっており、Element typeRefReferenced table name在庫管理テーブルとなっているはずです。
    Image in a image block

    このRelated 在庫管理テーブル列は、物品マスタの各行に対応する在庫管理テーブルのレコードのリストを保持しています。つまり、「この物品マスタの物品には、現在これらの在庫レコードが存在する」という関係性を示しています。

関連リストの追加と表示

このRelated 在庫管理列は、物品マスタのDetailビューで「関連リスト」として表示することができます。これにより、特定の物品の詳細情報を見ながら、その物品の現在の在庫状況を一覧で確認できるようになります。

  1. AppSheetエディタの左側メニューから「Views」→「System Generated」→物品マスタのDetailビュー(通常は物品マスタ_Detailのような名前)を探してクリックします。
  2. 「View Options」セクションにある「Column order」の項目を確認します。ここにRelated 在庫管理テーブルsが追加されているはずです。もし追加されていない場合は、「Manual」→「Add」ボタンから手動で追加します。
    Image in a image block

デレファレンス(Dereference)で関連データを活用する

前のセクションで、在庫管理テーブルの物品名型式物品の種類の各列に[物品名].[物品名]のような式を設定しました。この[参照列].[参照先テーブルの列名]という記法こそが、AppSheetにおける「デレファレンス(Dereference)」です。

[物品名].[型式]の仕組み

デレファレンスは、Ref型で参照している別のテーブルの特定の列の値を、現在のテーブルで直接利用するための強力な機能です。具体的には、以下の手順で動作します。

  1. [物品名]:これは在庫管理テーブル物品名列を指します。この物品名列はRef型であり、物品マスタテーブルの特定の行を参照しています。
  2. .(ドット):これは「参照先の行の」という意味です。
  3. [型式]:これは参照先の物品マスタテーブルの型式列を指します。

つまり、[物品名].[型式]という式は、「在庫管理テーブルの現在の行が参照している物品マスタの行の型式列の値を取得する」という意味になります。これにより、在庫管理テーブルに型式のデータを重複して持つことなく、物品マスタの最新の型式を常に表示できるようになります。

計算式での活用例

デレファレンスは、単に関連データを表示するだけでなく、計算式や条件式の中でも活用できます。例えば、物品マスタ単価という列を追加し、在庫管理テーブルで合計金額を計算したい場合を考えてみましょう。

  1. 物品マスタ単価列を追加: 物品マスタシートに単価というNumber型の列を追加し、ダミーデータを入力します。
    ID,物品名,型式,物品の種類,単価
    ITEM001,抵抗器,10kΩ,電子部品,10
    ITEM002,コンデンサ,0.1μF,電子部品,50
    ITEM003,ドライバーセット,PH2,工具,1500
    ITEM004,はんだごて,HAKKO FX-600,工具,3000
    ITEM005,養生テープ,幅50mm,消耗品,500
  2. 在庫管理テーブル数量列を追加:在庫管理テーブル数量というNumber型の列を追加し、ダミーデータを入力します。
    連番,ID,物品名,型式,物品の種類,数量
    1,ITEM001,抵抗器,10kΩ,電子部品,100	
    2,ITEM002,コンデンサ,0.1μF,電子部品,50	
    3,ITEM003,ドライバーセット,PH2,工具,10	
    4,ITEM004,はんだこて,HAKKO,FX-600,工具,5	
    5,ITEM005,養生テープ,幅50mm,消耗品,20
  3. 在庫管理テーブル合計金額列を追加: 在庫管理テーブル合計金額というNumber型の列を追加します。
    連番,ID,物品名,型式,物品の種類,数量,合計金額
    1,ITEM001,抵抗器,10kΩ,電子部品,100	
    2,ITEM002,コンデンサ,0.1μF,電子部品,50	
    3,ITEM003,ドライバーセット,PH2,工具,10	
    4,ITEM004,はんだこて,HAKKO,FX-600,工具,5	
    5,ITEM005,養生テープ,幅50mm,消耗品,20
  4. 合計金額列のApp formulaを設定: AppSheetエディタで在庫管理テーブル合計金額列のApp formulaに以下の式を設定します。
    [数量] * [物品名].[単価]

この式は、「現在の在庫数(数量)に、参照している物品マスタ単価を掛け合わせる」という意味になります。これにより、各在庫レコードの合計金額が自動的に計算されます。

Image in a image block
Image in a image block

このように、デレファレンスを使いこなすことで、アプリのデータ処理能力と柔軟性が飛躍的に向上します。次のセクションでは、Is part ofプロパティを使って、さらにデータの関係性を明確にする方法を見ていきましょう。

Is part ofプロパティで親子関係を明確にする

AppSheetでは、テーブル間の関係性をさらに明確にするためにIs part ofプロパティを使用できます。これは、あるテーブルのレコードが、別のテーブルのレコードの一部である、という「親子関係」を示すために使われます。親テーブルを削除すると子テーブルも一緒に削除されるようになります。

在庫管理テーブル物品名列をIs part ofに設定

第1回で、在庫管理テーブル物品名型式物品の種類の各列は、物品名列(Ref型)を通じて物品マスタから情報を引っ張ってくるように設定しました。これらの列は、物品マスタのデータの一部として存在するため、Is part ofプロパティを設定するのが適切です。

Is part ofプロパティを設定すると、AppSheetはこれらの列を、親である物品名列(Ref型)の「子」として扱います。これにより、アプリのUI上での表示がより整理され、データの入力フォームなどで、親となる物品名が選択された後に初めて子の情報が表示される、といった挙動を期待できます。

  1. AppSheetエディタの「Data」→在庫管理テーブルをクリックします。
  2. 物品名の列のIs part ofのチェックボックスにチェックを入れます。
    Image in a image block

AppSheet用語表

AppSheetには独自の用語がいくつかあります。ここで、今回の記事で登場した主要な用語をまとめておきましょう。

用語 意味 具体例 初心者の落とし穴
テーブル アプリのデータ構造の基本単位。スプレッドシートのシートがこれに相当します。 物品マスタ, 在庫管理テーブル 列型未設定でデータの不整合が発生する
キー列(Key) 各行を一意に識別するための列。重複は許されません。 物品マスタ.ID, 在庫管理テーブル.連番 重複があるとデータの更新や参照が正しく行えない
ラベル列(Label) アプリ内でその行を代表する表示名として使われる列。 物品マスタ.物品名 適切なラベルを設定しないと一覧性が悪くなる
Enum 事前に定義された選択肢の中から値を選ぶ形式のデータ型。 物品の種類, 保管場所, ステータス スペル揺れや表記ゆれで集計やフィルタリングが困難になる
Ref 別のテーブルの行を参照するためのデータ型。 在庫管理テーブル.物品名 参照先テーブルのキー列とデータ型が一致しないとエラー
逆参照 Ref型で定義された関係性を逆方向から参照する機能。 Related 在庫管理 自動生成される列名が分かりにくいことがある
デレファレンス Ref型で参照している別のテーブルの特定の列の値を、現在のテーブルで直接利用する記法。 [物品名].[物品名] 参照先の列名やデータ型が異なるとエラーになる
Is part of あるレコードが別のレコードの一部であることを示すプロパティ。 在庫管理テーブル.物品名 フォームでの表示順序や入力制御に影響する
UniqueID() 一意のIDを自動生成する関数。 ID連番の初期値 手動入力だと重複や入力ミスが発生しやすい
NOW() 現在の日時を返す関数。 更新日時の初期値 手動入力だと更新日時が不正確になる

FAQ

Q1: Ref型を設定するメリットは何ですか?

Ref型を設定することで、データの整合性の向上、データの一貫性の確保、アプリの利便性向上、効率的なデータ構造の実現といったメリットがあります。異なるテーブル間のデータを正確に連携させ、入力ミスを防ぎ、最新の情報を常に反映できます。

Q2: 逆参照(Reverse Reference)とは何ですか?

逆参照は、Ref型で定義された関係性を逆方向から参照する機能です。例えば、親テーブル(物品マスタ)から、その親に紐づく子テーブル(在庫管理テーブル)の関連レコードを一覧表示する際に使用します。AppSheetが自動的にRelated [子テーブル名]というVirtual Columnを生成します。

Q3: デレファレンス(Dereference)はどのように使いますか?

デレファレンスは、[参照列].[参照先テーブルの列名]という記法で、Ref型で参照している別のテーブルの特定の列の値を、現在のテーブルで直接利用する機能です。これにより、関連テーブルのデータを現在のテーブルに重複して持たずに活用できます。

Q4: Ref型で参照する際に、特定の条件で絞り込むことはできますか?

はい、Ref型の列のValid IfプロパティにSELECT関数などを使った式を設定することで、参照先の選択肢を特定の条件で絞り込むことができます。これにより、ユーザーはより適切なデータを選択できるようになります。

Q5: Ref型で連携したデータは、スプレッドシート上ではどのように見えますか?

スプレッドシート上では、Ref型の列には参照先のテーブルのキー列の値(この場合は物品マスタの物品名)がそのまま保存されます。AppSheetアプリ内で表示される物品名などの情報は、デレファレンスによって動的に取得・表示されているため、スプレッドシートには直接表示されません。

次回予告

今回は、物品マスタと在庫管理テーブルという2つのテーブルを題材に、Ref型によるデータ連携の基本から、逆参照、デレファレンス、Is part ofといった応用テクニックまでを習得しました。これにより、データが有機的に繋がり、より使いやすく、データの整合性が保たれたアプリへと進化させることができたはずです。

次回は、今回構築したデータ連携の基盤をさらに強固にするための「正規化の基礎」に焦点を当てます。データベース設計の重要な概念である正規化をAppSheetの文脈で理解し、より堅牢で拡張性の高いアプリ構造を設計する方法を解説します。データ構造を最適化することで、アプリのパフォーマンス向上やメンテナンス性の向上にも繋がります。

ノーコード開発は、アイデアを素早く形にするだけでなく、その裏にあるデータ設計の重要性も教えてくれます。この連載を通じて、AppSheetの奥深さを探求し、あなたの業務改善や新しいサービスの創出に役立てていただければ幸いです。ぜひ次回の記事も楽しみにしていてください!

関連記事

📄Arrow icon of a page link【第1回】AppSheetで在庫表から最短テーブル作成!初級エンジニア向け入門ガイド

📄Arrow icon of a page link【第2回】AppSheetのRefで親子連携!在庫管理アプリで学ぶテーブル連携の基本

📄Arrow icon of a page link【第3回】データベース設計入門:在庫管理アプリの要件定義からER図まで

📄Arrow icon of a page link【第4回】AppSheet View入門:基本の使い方と主要6タイプを徹底解説!

📄Arrow icon of a page link【第5回】AppSheet開発を変える!ユースケース図とシーケンス図で処理を俯瞰する

📄Arrow icon of a page link【第6回】ActionとAutomationで業務を徹底的に自動化する

業務効率化・DX推進でお悩みですか?

オンラインセッションで課題を可視化し、最適な解決策をご提案します。

  • DX推進を何から始めればいいかわからない
  • ツール導入を検討している
  • 社内でデジタル人材を育成したい
まずは無料で課題整理

相談は完全無料・オンラインで気軽に

あなたを爆速で成長させるメンタリングプログラムはこちら

メンタープログラムバナー

業務効率化・DX推進のご相談はこちら

伴走支援プログラムの詳細を見る
無料相談はこちら