AppSheetのアプリは、元にするスプレッドシートの形でほぼ決まります。表が整っていれば、アプリの下書きは数分で出来上がり、あとは列の型と画面を直すだけです。この記事では、作る前のスプレッドシートの整え方から、アプリの作成、列の型と参照の設定、入力フォーム、自動化での通知、共有とデプロイまでを順に書きます。読み終わると、講師がスマホで出席を付けるアプリが1つ動いている状態になります。前提は、Google Workspaceの会社のアカウントがあり、管理者がAppSheetとGoogleドライブを有効にしていることです。AppSheetが何で、どのプランで使えるかは「AppSheetとは:料金・できること、スプレッドシートとの違い」で書いています。
先に決めること
作り始める前に、次の3つを決めます。ここが決まっていないと、途中で表の形を変えることになり、アプリ側の設定を何度もやり直します。
1つ目は、表の分け方です。1つのシートに何でも並べず、「会員」「レッスン」「出席」のように、ものごとの単位で表を分けます。出席の表に会員の氏名やコースまで書き写すと、会員が名前を変えたときに直す場所が増えます。出席の表には会員IDだけを置き、氏名は会員の表から引きます。この「IDで別の表を引く」のが、AppSheetの参照(Ref)です。
2つ目は、行を見分けるIDの列です。AppSheetは、表の行を「キー」と呼ぶ列の値で見分けます。ヘルプには、キーは行ごとに一意で、行がある間は変わらないことが求められると書かれています。氏名や日付はキーに向きません。同じ名前の会員がいる、同じ日にレッスンが2つある、で重なるからです。どの表にも、最初の列にIDの列を置きます。
3つ目は、アプリを持つアカウントです。AppSheetのアプリは基本的に作った人のアカウントで動きます。講師の誰かの個人の判断で作らず、代表か、会社の共有の管理用アカウントで作ります。元のスプレッドシートも、同じアカウントから開ける場所に置きます。
作るものの一覧
サンプル料理教室の出席入力アプリでは、次の3つの表を使います。スプレッドシートは1つのファイルに3つのシートを作ります。
| シート | 列(左から) | キー | 参照(Ref) | 誰が入れるか |
|---|---|---|---|---|
| 会員 | 会員ID・氏名・ふりがな・コース・状態・電話番号 | 会員ID | なし | 受付がスプレッドシートで入れる |
| レッスン | レッスンID・日付・開始時刻・メニュー・担当講師 | レッスンID | なし | 受付がスプレッドシートで入れる |
| 出席 | 出席ID・レッスン・会員・出欠・写真・メモ・入力者・入力日時 | 出席ID | レッスン→レッスン、会員→会員 | 講師がアプリで入れる |
列の型は、アプリで次のように設定します。型の名前はAppSheetのヘルプの表記です。
| 表 | 列 | 型 | 設定のポイント |
|---|---|---|---|
| 出席 | 出席ID | Text | 初期値に UNIQUEID()。画面には出さない |
| 出席 | レッスン | Ref | 参照先はレッスンの表 |
| 出席 | 会員 | Ref | 参照先は会員の表 |
| 出席 | 出欠 | Enum | 選択肢は「出席」「欠席」「振替」 |
| 出席 | 写真 | 画像 | 任意。料理の仕上がりを撮る |
| 出席 | メモ | LongText | 複数行のメモ |
| 出席 | 入力者 | 初期値に USEREMAIL() | |
| 出席 | 入力日時 | DateTime | 初期値に NOW() |
| レッスン | 日付 | Date | 日付として読ませる |
| レッスン | 担当講師 | 講師の会社のメールアドレス | |
| 会員 | 状態 | Enum | 「在籍」「休会」「退会」 |
手順
1. スプレッドシートを整える
AppSheetは、シートの1行目を列の名前として読みます。PCのブラウザで次のように整えます。
- 新しいスプレッドシートを作り、名前を「出席入力アプリ」にする
- シートを3つ作り、名前を「会員」「レッスン」「出席」にする
- 各シートの1行目に、上の表の列名を左から入れる
- 1行目より上にタイトルや説明の行を置かない。A1から表を始める
- セルの結合をすべて解除する
- 会員とレッスンのシートに、本番のデータか、試しの行を3〜5行入れる
- 会員IDとレッスンIDには、重ならない値を入れる(例:
M001、L20261101-1) - 日付の列は、
2026/11/01の形で入れ、セルの表示形式を日付にする - 出席のシートは1行目だけにしておく。AppSheetが型を判断できるように、試しの行を1行入れてもよい
見出しの名前は、AppSheetが型を判断する手がかりになります。「日付」「メール」「電話番号」のように、中身が分かる名前にしておくと、自動で選ばれる型が合いやすくなります。
ヘルプには、AppSheetにつなぐスプレッドシートではフィルタを使わないよう書かれています。フィルタで隠れた行が更新に出ないことがあるからです。受付が絞り込んで見たいときは、各自のフィルタ表示を使います。

2. アプリを作る
スプレッドシートからアプリを作るには、2つの入口があります。
スプレッドシートから作る場合は次のとおりです。
- 整えたスプレッドシートを開く
- GoogleスプレッドシートのAppSheetのアドオンを開く
- アドオンのペインで「Go」を押す。ヘルプでは、これでスプレッドシートがAppSheetのアプリに自動で変換される
- AppSheetのエディタが開き、アプリの下書きが作られる
AppSheetの画面から作る場合は次のとおりです。
- ブラウザで appsheet.com を開き、会社のアカウントでログインする
- 「My Apps」の画面で「+ Create」をクリックする
- 自分のデータから始める方法を選び、Googleスプレッドシートを選ぶ
- 整えたスプレッドシートを選ぶ
どちらの入口でも、最初は1つ目のシートだけがアプリに読み込まれることがあります。残りのシートは、エディタの「データ(Data)」で表を追加して読み込みます。
- 左のメニューで「データ(Data)」を開く
- 表を追加するボタンを押す
- 同じスプレッドシートを選び、「レッスン」と「出席」のシートを追加する

エディタの左のメニューには「データ」「アプリ」「アクション」「自動化」「セキュリティ」「設定」「管理」などが並びます。表と列の設定は「データ」、画面の設定は「アプリ」、通知は「自動化」、共有の範囲は「セキュリティ」、デプロイは「管理(Manage)」です。変更したら右上の「save」で保存します。保存しないと、プレビューにも反映されません。
3. キーと列の型を直す
表を読み込むと、AppSheetは列の型とキーを自動で選びます。ヘルプによると、キーは左の列から順に、一意の値を持つ列が選ばれます。見つからなければ列を組み合わせた計算のキーを作り、それもなければ行番号がキーになります。行番号のキーは、行の移動や削除、同時の入力で番号が変わるので勧められていません。エディタも警告を出します。
出席の表で、次のように直します。
- 「データ」で「出席」の表を開き、列の一覧を出す
- 「出席ID」の列で、キーの欄にチェックが入っているかを確かめる
- 「出席ID」の初期値(Initial value)に
UNIQUEID()を入れる - 「出席ID」の表示(Show)を外し、入力フォームに出ないようにする
- 「レッスン」の型を「Ref」にし、参照先(Source table)に「レッスン」を選ぶ
- 「会員」の型を「Ref」にし、参照先に「会員」を選ぶ
- 「出欠」の型を「Enum」にし、選択肢に「出席」「欠席」「振替」を入れる
- 「入力者」の初期値に
USEREMAIL()、「入力日時」の初期値にNOW()を入れる - 「save」で保存する
キーの値は、行を作るときに1回だけ決まる初期値で入れます。ヘルプは、キーを数式(App formula)で計算しないよう書いています。数式にすると、行を直すたびにキーが変わるおそれがあるからです。
Refの列には、参照先の行のキーの値が入ります。出席のシートの「会員」の列に入るのは「M001」のような会員IDで、氏名ではありません。アプリの画面では会員の名前で選べるように、会員の表で「氏名」を行の表示名(ラベル)にしておきます。
- 「データ」で「会員」の表を開く
- 「氏名」の列で、ラベル(Label)にチェックを入れる
- 「レッスン」の表でも、「日付」か「メニュー」をラベルにする
Refを作ると、参照先の表には、反対向きの一覧の列が自動で足されます。会員の表に「その会員の出席」の一覧が仮想の列として付き、会員の詳細の画面で出席の履歴が見られるようになります。この列の中身は REF_ROWS() の式で、名前は変えられます。

4. 入力フォームを作る
表を読み込むと、AppSheetは一覧の画面と入力フォームを自動で作ります。講師が使いやすいように、入力フォームの並びと出し方を直します。
- 左のメニューで「アプリ(App)」を開き、画面(ビュー)の一覧を出す
- 出席の一覧の画面を開き、並べ替えを「入力日時」の新しい順にする
- 出席の入力フォームを開き、列の並びを「レッスン」「会員」「出欠」「写真」「メモ」にする
- 「入力者」「入力日時」は表示を外す。初期値で自動で入る
- 「save」で保存し、右側のプレビューで新しい出席を1件入れてみる
日付・選択肢・写真は、列の型で入力欄が決まります。
- Dateの列はカレンダーから日付を選ぶ欄になる
- Enumの列はボタンかプルダウンで1つ選ぶ欄になる。複数選ぶならEnumList
- 画像の列は、スマホではカメラで撮るか、端末の写真を選ぶ欄になる
- Yes/Noの列はスイッチになる
- 署名の列は指でサインを書く欄になる
レッスンの選択肢を、今日のレッスンだけに絞ることもできます。「レッスン」の列の入力の制限(Valid if)に、次のような式を入れます。
SELECT(レッスン[レッスンID], [日付] = TODAY())
この式は、レッスンの表から日付が今日の行のレッスンIDだけを選択肢にします。列名にスペースや記号を入れていると式が書きにくくなるので、列名は短い日本語にしておくと楽です。

5. 講師に見せる行を絞る
講師には、自分が担当するレッスンの出席だけを見せます。レッスンの表の「担当講師」に講師の会社のメールアドレスを入れておき、セキュリティ フィルタで絞ります。
- 左のメニューで「セキュリティ」を開く
- 「レッスン」の表のセキュリティ フィルタに、次の式を入れる
- 「save」で保存する
OR([担当講師] = USEREMAIL(), USEREMAIL() = "daihyo@sample-cooking.example")
USEREMAIL() は、アプリにログインしている人のメールアドレスを返します。講師は自分の担当分だけ、代表のアカウント(例として daihyo@sample-cooking.example)は全部が見えます。受付にも全部を見せるなら、OR の中に受付のアドレスを足します。会員の電話番号は、出席入力のアプリでは使わないので、会員の表の「電話番号」の列の表示を外しておきます。セキュリティ フィルタはCoreのプランに含まれる機能です。
6. 自動化(ボット)で通知を送る
振替の出席が入ったら、受付にメールで知らせる自動化を作ります。AppSheetの自動化は、ボット(bot)・イベント・プロセス・タスクの組み合わせです。ボットが自動化の単位で、イベントがきっかけ、プロセスがその後にする手順の並び、タスクがメールの送信のような1つ1つの作業です。
- 左のメニューで「自動化(Automation)」を開く
- 「Bots」で新しいボットを作り、名前を「振替の通知」にする
- イベントの種類を「アプリ」にし、表を「出席」にする
- データ変更の種類(Data change type)で「追加」を選ぶ
- 条件(Condition)に
[出欠] = "振替"を入れる - プロセスにステップを足し、タスクの種類でメールの送信を選ぶ
- 宛先に受付のアドレス(例:
info@sample-cooking.example)を入れる - 件名に「振替の連絡」、本文に会員とレッスンの値を差し込む
- 「save」で保存し、ボットの画面の「Test」で動きを確かめる
メールの本文には、列の値を <<[会員].[氏名]>> のような形で差し込めます。Refの列から、参照先の表の列をたどって引けます。
イベントの種類には、アプリでの変更のほかに、決まった日時に動かす「スケジュール設定」、Googleフォームの回答、Google Chatのアプリの操作などがあります。毎朝8時にその日のレッスンの一覧を講師に送る、という使い方はスケジュール設定で作ります。通知の送り先は、メールのほかに、スマホのプッシュ通知、SMS、Google Chatのメッセージ、Webhookが選べます。LINEや外のサービスに送りたいときは、Webhookでn8nに送り、n8nから先へ流します。
ここで1つ注意があります。アプリでの変更をきっかけにするイベントは、アプリから入れた行で動きます。受付がスプレッドシートを直接開いて振替の行を足しても、このボットは動きません。スプレッドシートの変更で動かすには、ヘルプにある外部の構成が別に要ります。振替を受付が入れるときも、アプリから入れる運用にしておくと分かりやすいです。

7. 使う人を追加する
アプリを講師に使ってもらうには、共有でメールアドレスを追加します。
- エディタの上部の共有のアイコンを押し、「Share app」の画面を開く
- 講師のメールアドレスを入れてEnterを押す。3人分くり返す
- 権限で「Use app」を選ぶ。使うだけで、アプリの設定は変えられない
- 招待のメールを送るなら「Notify users」を選び、「Send」を押す
- 送らないなら「Share」を押し、「Done」で閉じる
受付と代表には、設定も直せるように「Edit app」を付けます。ヘルプは、この権限は信頼できる人だけに付けるよう書いています。ドメインの全員に共有するなら、メールアドレスの代わりに sample-cooking.example のようにドメイン名を入れます。この場合、全員の権限は「使う」だけになります。
元のスプレッドシートを講師に共有する必要はありません。アプリは作成者として動き、作成者の権限でスプレッドシートを読み書きします。スプレッドシートを講師に共有しないでおけば、講師がアプリを通さずに表を直すことも防げます。
8. デプロイする
作ったばかりのアプリは「プロトタイプ」の状態です。プロトタイプでも入力はできますが、一部の機能は動かず、自動化のメールも本番どおりには送られません。講師に使ってもらう前にデプロイします。
- 左のメニューの「管理(Manage)」から「Deploy」を開く
- 「Deployment Check」を実行し、出てきた指摘を直す
- 即時のデプロイを選び、デプロイする
- 講師に、AppSheetのアプリを入れて、届いた共有のリンクから開いてもらう
デプロイ後にエディタで直した内容は、講師のアプリが同期したときに反映されます。一時的に止めたいときは「Pause app」、作り直したいときは「Deployment Check」の中の「Return to prototype state」でプロトタイプに戻せます。

スマホでの使い方(講師の側)
講師のスマホでは次のように使います。Androidは9以降、iOSは12.0以降が対象です。
- Google PlayかApp StoreでAppSheetのアプリを入れる
- 招待のメールか、受付から届いたリンクを開く
- 会社のGoogleアカウントでログインする
- 出席の画面で「+」を押し、レッスン・会員・出欠を選んで保存する
- 画面の同期のボタンで、入れた内容を送る
キッチンの電波が弱い場合は、エディタの設定で「The app can start when offline」を有効にしておき、講師には電波のある場所で1度アプリを開いてもらいます。ヘルプによると、この設定はアプリを端末に入れる前にしておく必要があります。
応用
出席入力が回ったら、同じスプレッドシートに表を足して広げられます。
- 材料の表を足し、講師がレッスンの後に残りの量と冷蔵庫の写真を入れる。残りが決めた量を下回ったら、自動化で代表に知らせる
- 自動化のタスクでGoogle Chatのメッセージを送り、「キッチン」のスペースに材料の不足を流す
- スケジュール設定のイベントで、毎朝その日のレッスンと予約数を講師にメールする
- 出席の表をデータポータル(旧Looker Studio)につなぎ、コースごとの出席率を毎月見る。データポータルは、2026年4月にLooker Studioから名前が変わったGoogleのグラフとレポートの道具
- 自動化のタスクでGASの関数を呼び、出席の数を月謝の請求の表に反映する
列を足したときは、スプレッドシートに列を足してから、エディタの「データ」でその表の列の構成を読み直します。読み直さないと、新しい列はアプリに出ません。
できないことと、その代わり
- 端末に読み込むデータには、圧縮後で5MBか10MB(端末による)の上限がある。出席の表が何年分も貯まったら、前の年度の行を別のスプレッドシートに移す
- AppSheetからの変更では、スプレッドシートのGASの編集時のトリガー(onEdit)が動かない。行が増えたらGASで何かする仕組みは、時間主導のトリガーに変える
- ブラウザではバーコードの読み取り、オフラインでの起動、プッシュ通知が使えない。講師にはスマホのアプリで使ってもらう
- 1回の追加・更新・削除の処理には2分の時間制限があり、そこから動くボットの時間も含まれる。重い計算の列や重いボットを足しすぎない
- デプロイ済みのアプリでも、表の全行に対して動かす処理(For Each Row In Table)は10,000行まで。プロトタイプでは1,000行まで
- ログインなしで外の人に使わせる公開は、Enterprise以外では別の有料プランが要る。体験レッスンの申込はGoogleフォームで受ける
よく詰まるところ
| 症状 | 原因 | 直し方 |
|---|---|---|
| 日付の列が文字(Text)として読まれる | スプレッドシートの日付が文字で入っている、または表のロケールが合っていない | セルの表示形式を日付にし、AppSheet側で型を「Date」に直す。表のローカライズの設定でロケールを日本にする |
| 電話番号の先頭の0が消える | 数値(Number)として読まれた | 型を「Phone」か「Text」に直す |
| アプリで入れた行が、スプレッドシートに出ない | スマホ側でまだ同期していない | アプリの同期のボタンを押す。自動の同期は最大30分おき |
| スプレッドシートに足した列が、アプリに出ない | アプリが列の構成を読み直していない | エディタの「データ」で表の列の構成を読み直し、保存する |
| Refの列で、会員がIDのまま表示される | 会員の表のラベルが設定されていない | 会員の表で「氏名」をラベルにする |
| Refでつながらず、参照先が空になる | 出席のシートに入っている値が、参照先のキーと一致していない | 会員のキーが会員IDかを確かめ、出席のシートには氏名ではなく会員IDを入れる |
| 別の行が書き換わった | キーが重複している、または行番号がキーになっている | キーの列を見直し、UNIQUEID() を初期値にした列をキーにする |
| 振替のメールが届かない | プロトタイプのまま、またはスプレッドシートを直接直した | デプロイする。振替はアプリから入れる。届かないときは「Audit History」で結果を見る |
| ボットの「Test」を押しても何も起きない | ブラウザがポップアップを止めている | ブラウザの設定で appsheet.com のポップアップを許可する |
| 「Request cancelled: took too long to process」と出る | 処理が2分を超えた | 重い計算の列や、行ごとに動く重いボットを減らす |
| 講師のアプリに全員分のレッスンが出る | セキュリティ フィルタが入っていないか、担当講師のアドレスが違う | 担当講師に講師の会社のアドレスを入れ、セキュリティ フィルタの式を見直す |
| 写真の列にカメラが出ない | ブラウザで開いている、または型が画像になっていない | 型を「画像」にし、スマホのAppSheetのアプリで開く |
次にやること
アプリの元になる表をもう一度整えるなら「スプレッドシートで業務の台帳を作る:顧客・予約・在庫」、受付だけが表を直せるように権限と範囲の保護を見直すなら「スプレッドシートの共有と保護:権限・範囲の保護・プルダウン」に進みます。出席のデータを月ごとのグラフにして代表と共有するなら「データポータル(旧Looker Studio)の使い方:スプレッドシートの数字をグラフにして共有する」、料金やプランをもう一度確かめるなら「AppSheetとは:料金・できること、スプレッドシートとの違い」に戻ります。