AppSheetの作り方:スプレッドシートから業務アプリを作る

公開 書いた人 大林 諒

AppSheetのアプリは、元にするスプレッドシートの形でほぼ決まります。表が整っていれば、アプリの下書きは数分で出来上がり、あとは列の型と画面を直すだけです。この記事では、作る前のスプレッドシートの整え方から、アプリの作成、列の型と参照の設定、入力フォーム、自動化での通知、共有とデプロイまでを順に書きます。読み終わると、講師がスマホで出席を付けるアプリが1つ動いている状態になります。前提は、Google Workspaceの会社のアカウントがあり、管理者がAppSheetとGoogleドライブを有効にしていることです。AppSheetが何で、どのプランで使えるかは「AppSheetとは:料金・できること、スプレッドシートとの違い」で書いています。

この記事の内容
  1. 先に決めること
  2. 作るものの一覧
  3. 手順
  4. 応用
  5. できないことと、その代わり
  6. よく詰まるところ
  7. 次にやること

先に決めること

作り始める前に、次の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のヘルプの表記です。

表列型設定のポイント
出席出席IDText初期値に UNIQUEID()。画面には出さない
出席レッスンRef参照先はレッスンの表
出席会員Ref参照先は会員の表
出席出欠Enum選択肢は「出席」「欠席」「振替」
出席写真画像任意。料理の仕上がりを撮る
出席メモLongText複数行のメモ
出席入力者Email初期値に USEREMAIL()
出席入力日時DateTime初期値に NOW()
レッスン日付Date日付として読ませる
レッスン担当講師Email講師の会社のメールアドレス
会員状態Enum「在籍」「休会」「退会」

手順

1. スプレッドシートを整える

AppSheetは、シートの1行目を列の名前として読みます。PCのブラウザで次のように整えます。

  1. 新しいスプレッドシートを作り、名前を「出席入力アプリ」にする
  2. シートを3つ作り、名前を「会員」「レッスン」「出席」にする
  3. 各シートの1行目に、上の表の列名を左から入れる
  4. 1行目より上にタイトルや説明の行を置かない。A1から表を始める
  5. セルの結合をすべて解除する
  6. 会員とレッスンのシートに、本番のデータか、試しの行を3〜5行入れる
  7. 会員IDとレッスンIDには、重ならない値を入れる(例: M001、L20261101-1)
  8. 日付の列は、2026/11/01 の形で入れ、セルの表示形式を日付にする
  9. 出席のシートは1行目だけにしておく。AppSheetが型を判断できるように、試しの行を1行入れてもよい

見出しの名前は、AppSheetが型を判断する手がかりになります。「日付」「メール」「電話番号」のように、中身が分かる名前にしておくと、自動で選ばれる型が合いやすくなります。

ヘルプには、AppSheetにつなぐスプレッドシートではフィルタを使わないよう書かれています。フィルタで隠れた行が更新に出ないことがあるからです。受付が絞り込んで見たいときは、各自のフィルタ表示を使います。

整えたスプレッドシート。「会員」「レッスン」「出席」の3つのシートと、1行目の見出し
整えたスプレッドシート。「会員」「レッスン」「出席」の3つのシートと、1行目の見出し

2. アプリを作る

スプレッドシートからアプリを作るには、2つの入口があります。

スプレッドシートから作る場合は次のとおりです。

  1. 整えたスプレッドシートを開く
  2. GoogleスプレッドシートのAppSheetのアドオンを開く
  3. アドオンのペインで「Go」を押す。ヘルプでは、これでスプレッドシートがAppSheetのアプリに自動で変換される
  4. AppSheetのエディタが開き、アプリの下書きが作られる

AppSheetの画面から作る場合は次のとおりです。

  1. ブラウザで appsheet.com を開き、会社のアカウントでログインする
  2. 「My Apps」の画面で「+ Create」をクリックする
  3. 自分のデータから始める方法を選び、Googleスプレッドシートを選ぶ
  4. 整えたスプレッドシートを選ぶ

どちらの入口でも、最初は1つ目のシートだけがアプリに読み込まれることがあります。残りのシートは、エディタの「データ(Data)」で表を追加して読み込みます。

  1. 左のメニューで「データ(Data)」を開く
  2. 表を追加するボタンを押す
  3. 同じスプレッドシートを選び、「レッスン」と「出席」のシートを追加する
AppSheetのエディタ。左のメニューの「データ」と、追加した3つの表
AppSheetのエディタ。左のメニューの「データ」と、追加した3つの表

エディタの左のメニューには「データ」「アプリ」「アクション」「自動化」「セキュリティ」「設定」「管理」などが並びます。表と列の設定は「データ」、画面の設定は「アプリ」、通知は「自動化」、共有の範囲は「セキュリティ」、デプロイは「管理(Manage)」です。変更したら右上の「save」で保存します。保存しないと、プレビューにも反映されません。

3. キーと列の型を直す

表を読み込むと、AppSheetは列の型とキーを自動で選びます。ヘルプによると、キーは左の列から順に、一意の値を持つ列が選ばれます。見つからなければ列を組み合わせた計算のキーを作り、それもなければ行番号がキーになります。行番号のキーは、行の移動や削除、同時の入力で番号が変わるので勧められていません。エディタも警告を出します。

出席の表で、次のように直します。

  1. 「データ」で「出席」の表を開き、列の一覧を出す
  2. 「出席ID」の列で、キーの欄にチェックが入っているかを確かめる
  3. 「出席ID」の初期値(Initial value)に UNIQUEID() を入れる
  4. 「出席ID」の表示(Show)を外し、入力フォームに出ないようにする
  5. 「レッスン」の型を「Ref」にし、参照先(Source table)に「レッスン」を選ぶ
  6. 「会員」の型を「Ref」にし、参照先に「会員」を選ぶ
  7. 「出欠」の型を「Enum」にし、選択肢に「出席」「欠席」「振替」を入れる
  8. 「入力者」の初期値に USEREMAIL()、「入力日時」の初期値に NOW() を入れる
  9. 「save」で保存する

キーの値は、行を作るときに1回だけ決まる初期値で入れます。ヘルプは、キーを数式(App formula)で計算しないよう書いています。数式にすると、行を直すたびにキーが変わるおそれがあるからです。

Refの列には、参照先の行のキーの値が入ります。出席のシートの「会員」の列に入るのは「M001」のような会員IDで、氏名ではありません。アプリの画面では会員の名前で選べるように、会員の表で「氏名」を行の表示名(ラベル)にしておきます。

  1. 「データ」で「会員」の表を開く
  2. 「氏名」の列で、ラベル(Label)にチェックを入れる
  3. 「レッスン」の表でも、「日付」か「メニュー」をラベルにする

Refを作ると、参照先の表には、反対向きの一覧の列が自動で足されます。会員の表に「その会員の出席」の一覧が仮想の列として付き、会員の詳細の画面で出席の履歴が見られるようになります。この列の中身は REF_ROWS() の式で、名前は変えられます。

出席の表の列の設定。「会員」の型が「Ref」で、参照先が「会員」になっているところ
出席の表の列の設定。「会員」の型が「Ref」で、参照先が「会員」になっているところ

4. 入力フォームを作る

表を読み込むと、AppSheetは一覧の画面と入力フォームを自動で作ります。講師が使いやすいように、入力フォームの並びと出し方を直します。

  1. 左のメニューで「アプリ(App)」を開き、画面(ビュー)の一覧を出す
  2. 出席の一覧の画面を開き、並べ替えを「入力日時」の新しい順にする
  3. 出席の入力フォームを開き、列の並びを「レッスン」「会員」「出欠」「写真」「メモ」にする
  4. 「入力者」「入力日時」は表示を外す。初期値で自動で入る
  5. 「save」で保存し、右側のプレビューで新しい出席を1件入れてみる

日付・選択肢・写真は、列の型で入力欄が決まります。

  • Dateの列はカレンダーから日付を選ぶ欄になる
  • Enumの列はボタンかプルダウンで1つ選ぶ欄になる。複数選ぶならEnumList
  • 画像の列は、スマホではカメラで撮るか、端末の写真を選ぶ欄になる
  • Yes/Noの列はスイッチになる
  • 署名の列は指でサインを書く欄になる

レッスンの選択肢を、今日のレッスンだけに絞ることもできます。「レッスン」の列の入力の制限(Valid if)に、次のような式を入れます。

SELECT(レッスン[レッスンID], [日付] = TODAY())

この式は、レッスンの表から日付が今日の行のレッスンIDだけを選択肢にします。列名にスペースや記号を入れていると式が書きにくくなるので、列名は短い日本語にしておくと楽です。

プレビューでの出席の入力フォーム。レッスン・会員・出欠・写真・メモの欄
プレビューでの出席の入力フォーム。レッスン・会員・出欠・写真・メモの欄

5. 講師に見せる行を絞る

講師には、自分が担当するレッスンの出席だけを見せます。レッスンの表の「担当講師」に講師の会社のメールアドレスを入れておき、セキュリティ フィルタで絞ります。

  1. 左のメニューで「セキュリティ」を開く
  2. 「レッスン」の表のセキュリティ フィルタに、次の式を入れる
  3. 「save」で保存する
OR([担当講師] = USEREMAIL(), USEREMAIL() = "daihyo@sample-cooking.example")

USEREMAIL() は、アプリにログインしている人のメールアドレスを返します。講師は自分の担当分だけ、代表のアカウント(例として daihyo@sample-cooking.example)は全部が見えます。受付にも全部を見せるなら、OR の中に受付のアドレスを足します。会員の電話番号は、出席入力のアプリでは使わないので、会員の表の「電話番号」の列の表示を外しておきます。セキュリティ フィルタはCoreのプランに含まれる機能です。

6. 自動化(ボット)で通知を送る

振替の出席が入ったら、受付にメールで知らせる自動化を作ります。AppSheetの自動化は、ボット(bot)・イベント・プロセス・タスクの組み合わせです。ボットが自動化の単位で、イベントがきっかけ、プロセスがその後にする手順の並び、タスクがメールの送信のような1つ1つの作業です。

  1. 左のメニューで「自動化(Automation)」を開く
  2. 「Bots」で新しいボットを作り、名前を「振替の通知」にする
  3. イベントの種類を「アプリ」にし、表を「出席」にする
  4. データ変更の種類(Data change type)で「追加」を選ぶ
  5. 条件(Condition)に [出欠] = "振替" を入れる
  6. プロセスにステップを足し、タスクの種類でメールの送信を選ぶ
  7. 宛先に受付のアドレス(例: info@sample-cooking.example)を入れる
  8. 件名に「振替の連絡」、本文に会員とレッスンの値を差し込む
  9. 「save」で保存し、ボットの画面の「Test」で動きを確かめる

メールの本文には、列の値を <<[会員].[氏名]>> のような形で差し込めます。Refの列から、参照先の表の列をたどって引けます。

イベントの種類には、アプリでの変更のほかに、決まった日時に動かす「スケジュール設定」、Googleフォームの回答、Google Chatのアプリの操作などがあります。毎朝8時にその日のレッスンの一覧を講師に送る、という使い方はスケジュール設定で作ります。通知の送り先は、メールのほかに、スマホのプッシュ通知、SMS、Google Chatのメッセージ、Webhookが選べます。LINEや外のサービスに送りたいときは、Webhookでn8nに送り、n8nから先へ流します。

ここで1つ注意があります。アプリでの変更をきっかけにするイベントは、アプリから入れた行で動きます。受付がスプレッドシートを直接開いて振替の行を足しても、このボットは動きません。スプレッドシートの変更で動かすには、ヘルプにある外部の構成が別に要ります。振替を受付が入れるときも、アプリから入れる運用にしておくと分かりやすいです。

自動化のボットの設定。イベントが「出席」の追加、条件が振替、タスクがメールの送信
自動化のボットの設定。イベントが「出席」の追加、条件が振替、タスクがメールの送信

7. 使う人を追加する

アプリを講師に使ってもらうには、共有でメールアドレスを追加します。

  1. エディタの上部の共有のアイコンを押し、「Share app」の画面を開く
  2. 講師のメールアドレスを入れてEnterを押す。3人分くり返す
  3. 権限で「Use app」を選ぶ。使うだけで、アプリの設定は変えられない
  4. 招待のメールを送るなら「Notify users」を選び、「Send」を押す
  5. 送らないなら「Share」を押し、「Done」で閉じる

受付と代表には、設定も直せるように「Edit app」を付けます。ヘルプは、この権限は信頼できる人だけに付けるよう書いています。ドメインの全員に共有するなら、メールアドレスの代わりに sample-cooking.example のようにドメイン名を入れます。この場合、全員の権限は「使う」だけになります。

元のスプレッドシートを講師に共有する必要はありません。アプリは作成者として動き、作成者の権限でスプレッドシートを読み書きします。スプレッドシートを講師に共有しないでおけば、講師がアプリを通さずに表を直すことも防げます。

8. デプロイする

作ったばかりのアプリは「プロトタイプ」の状態です。プロトタイプでも入力はできますが、一部の機能は動かず、自動化のメールも本番どおりには送られません。講師に使ってもらう前にデプロイします。

  1. 左のメニューの「管理(Manage)」から「Deploy」を開く
  2. 「Deployment Check」を実行し、出てきた指摘を直す
  3. 即時のデプロイを選び、デプロイする
  4. 講師に、AppSheetのアプリを入れて、届いた共有のリンクから開いてもらう

デプロイ後にエディタで直した内容は、講師のアプリが同期したときに反映されます。一時的に止めたいときは「Pause app」、作り直したいときは「Deployment Check」の中の「Return to prototype state」でプロトタイプに戻せます。

「Manage」の「Deploy」画面と、デプロイ チェックの結果
「Manage」の「Deploy」画面と、デプロイ チェックの結果

スマホでの使い方(講師の側)

講師のスマホでは次のように使います。Androidは9以降、iOSは12.0以降が対象です。

  1. Google PlayかApp StoreでAppSheetのアプリを入れる
  2. 招待のメールか、受付から届いたリンクを開く
  3. 会社のGoogleアカウントでログインする
  4. 出席の画面で「+」を押し、レッスン・会員・出欠を選んで保存する
  5. 画面の同期のボタンで、入れた内容を送る

キッチンの電波が弱い場合は、エディタの設定で「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とは:料金・できること、スプレッドシートとの違い」に戻ります。

あわせて読む