【AppSheetで出退勤管理・第2回】スマホのGPSと打刻時刻を自動取得!不正を防ぐスプレッドシート設計ルール

前回(第1回)は、Google WorkspaceのBusiness StarterプランからAppSheetを正しく起動し、スプレッドシートのデータから「出退勤打刻アプリ」の原型をわずか3クリックで自動生成する手順を解説しました。

しかし、初期状態のアプリを開いてみると、出勤した「日時」や「位置情報」を、スタッフがキーボードを使って自分の手で入力しなければならない画面になっています。これでは「いつでも、どこからでも嘘の打刻ができてしまう」ため、企業の勤怠管理としては使い物になりません。

結論から言うと、アプリの入力画面から「手入力の要素」を完全に排除し、AppSheetの関数である『NOW()』と『HERE()』を正しく組み込むことで、ボタンを押した瞬間の「正確な時刻」と「スマホのGPS位置情報」を人の手を介さずに裏側で強制的に自動記録できます。ただし、Business Starterの「30GB容量制限」を守り抜くためには、絶対に画像などの重いデータを組み込まないデータ設計の工夫が必要です。

本連載の第2回となる今回は、不正打刻を100%防止するための自動取得機能の実装手順と、Starterプランをパンクさせないためのデータ設計ルールを、どこよりも細かく画面のステップに沿って解説します。

なぜ「手入力」はダメなのか?勤怠管理における自動取得の重要性

一般的なWebのフォームや簡易的なツールでは、日付や時間の欄をクリックするとカレンダーや時計が表示され、そこからユーザーが時間を選んで入力する仕様が多く見られます。しかし、実務の「出退勤管理」において、この仕様は2つの大きな問題を引き起こします。

  • 不正打刻の温床になる:遅刻したスタッフが、後からスマホの画面上で「9:00」と時間を巻き戻して入力することが物理的に可能になってしまいます。
  • 現場の入力負担が増える:毎日の出勤時・退勤時に、いちいちカレンダーから日付を選んで現在時刻をスクロールして合わせるという作業は、現場のスタッフにとって大きなストレスであり、打刻漏れの原因になります。

AppSheetで作成するアプリの強みは、「スマートフォンが持っている内部情報(時計やGPSセンサー)に直接アクセスし、その値を強制的にデータベースへ書き込めること」にあります。

今回は、AppSheetの「Initial Value(初期値)」という機能を活用します。これは「データ入力画面を開いた瞬間に、最初から特定の値を自動で入れておく」という非常に強力な設定です。ここに特別な命令(関数)を仕込んでいきましょう。

【実践】打刻時刻を完全に自動化する「NOW()」関数の設定手順

第1回で解説した通り、個人のGoogleアカウントと会社アカウントの混在(バッティング)によるアプリの紛失やライセンスエラーを防ぐため、必ずPCで「シークレットウィンドウ」を開き、そこから会社のWorkspaceアカウントでAppSheetの開発画面(エディタ)にアクセスしてください。

https://www.appsheet.com/からログインが完了したら、ボタンを押した瞬間の日時を自動取得する設定を以下の手順で進めていきます。

データのカラム(列)設定画面を開く

  • 開発画面の左端にあるナビゲーションメニューから、[Data](テーブルの形のアイコン)をクリックします。
  • 画面中央に、前回読み込ませた「出退勤打刻マスター」が表示されていることを確認します。

「日時」のデータ型を修正する

  • 一覧の中から 「日時」 という行を探します。
  • その右側にある [TYPE] というドロップダウンメニューをクリックします。初期状態では「Text」や「Date」になっている場合があります。
  • メニューの中から、日付と時間の両方を記録できる 「DateTime」 を選択します。

「Initial Value」に関数を仕込む

  • 「日時」の行を右側へスクロールしていくと、[Initial Value] という項目(または数式を入力するための鉛筆マーク)があります。
  • その入力欄をクリックすると、数式エディタ(Expression Assistant)が開きます。
  • 入力エリアに、すべて半角の大文字で NOW() と入力します。
  • 画面左下に緑色のチェックマークが表示されたことを確認し、右下の [Save] ボタンを押してポップアップを閉じます。

手入力を「禁止」にする

  • 「日時」の行にある [Editable](編集可能)というチェックボックスを探します。
  • このチェックボックスのチェックを外して オフ(空白) にします。
  • これにより、画面を開いた瞬間に現在時刻が自動入力され、かつスタッフがその時間を指でタップして書き換えることが不可能になります。

【実践】スマホのGPSから現在地を固定する「HERE()」関数の設定手順

次に、スタッフが「本当に会社(または現場)にいるのか」を担保するために、スマートフォンのGPSから位置情報を自動取得する設定を行います。

「位置情報」のデータ型をGPS用に変更する

  • 先ほどと同じColumnsの一覧画面から、今度は 「位置情報」 の行を探します。
  • [TYPE] のドロップダウンメニューをクリックし、一覧の中から 「LatLong」(緯度経度を扱う専用の型)を選択します。

GPS情報を自動で掴む関数を設定する

  • 「位置情報」の行の [Initial Value] の入力欄をクリックして、数式エディタを開きます。
  • 入力エリアに、すべて半角の大文字で HERE() と入力します。
  • 緑色のチェックマークを確認し、右下の [Save] をクリックして閉じます。

現在地の書き換えを禁止する

  • 「位置情報」の行の [Editable] のチェックボックスを探し、こちらもチェックを外して オフ にします。
  • これにより、スタッフが「自宅にいながら会社の場所のピンを打つ」といった不正が完全にできなくなり、スマホのGPSが検知したリアルタイムの場所しか保存できなくなります。

すべての設定を保存する

  • 画面の右上にある青色の [Save](またはセーブ) ボタンを必ずクリックしてください。
  • 画面が一度読み込み直され、エディタの右側にある「プレビュー画面」が最新状態に更新されます。

【実務の落とし穴】Business Starterで絶対に守るべき「30GB容量制限」を意識したデータ肥大化対策

ここで、実務上の超重要セキュリティ・コスト対策をお伝えします。

AppSheetの打刻アプリを作っていると、社内から「不正防止のために、打刻した本人の顔写真をインカメラで撮影させて、その画像データも一緒に保存したい」という要望が上がることが非常によくあります。技術的には、AppSheetのTYPEを「Image」にするだけで、スマホのカメラと連動した写真撮影機能を3分で実装できます。

しかし、Business Starterプランを契約している企業は、この「写真撮影(Image型)」の誘惑に絶対に負けてはいけません。

なぜ写真を保存してはいけないのか?

前回の記事でも触れた通り、Business StarterプランのGoogleドライブ容量は、1ユーザーあたりわずか30GBしかありません。 もし社内メンバー50人が、毎日「出勤時」と「退勤時」の計2回、スマホのカメラで撮影した写真をアプリ経由でアップロードし続けるとどうなるでしょうか。

スマホの写真は1枚あたり数MBの容量があります。これが毎日100枚ずつ会社のGoogleドライブ(アプリ所有者のドライブ)に蓄積されていくと、わずか数ヶ月で30GBの容量上限を突破してパンクします。

容量がパンクすると、AppSheetが動かなくなるだけでなく、会社のすべてのGmailの送受信が強制ストップし、通常の業務ファイルも保存できなくなるという社内大パニックを引き起こします。

テキストデータだけなら「数万件」でも数MB

今回のように、『NOW()』による時間(テキスト)と、『HERE()』による緯度経度(数字の並び)のデータだけで運用すれば、1回の打刻に必要な容量は1KB(キロバイト)にも満たない超軽量データで済みます。 これであれば、メンバー全員が毎日何年も打刻を繰り返して数万件、数十万件のデータがスプレッドシートに溜まったとしても、消費する容量は合計でわずか数MB〜数十MB程度です。30GBの容量を圧迫することは一生ありません。

【G Cafeの鉄則】 Business StarterでAppSheetを運用する際は、「画像やファイル(PDF等)のアップロード機能は一切使わず、テキストと数値の管理に徹する」こと。これが、追加コストを発生させず、社内システムを絶対にパンクさせないための最も重要なデータ設計ルールです。

【もっと学びたい人へ】数式やデータ設計を深く学べるおすすめ参考書

「『NOW()』や『HERE()』のような関数(数式)の使いこなし方や、AppSheetのより実践的なデータ設計について、もっと深く体系的に知りたい!」という方に向けて、ステップアップに最適な一冊をご紹介します。

📖 Google AppSheet ではじめるノーコードアプリ開発入門

【おすすめポイント】 今回の記事で解説した「データ型(DateTimeやLatLong)」の仕組みや、AppSheet内で使える便利な「関数(Expression)」の応用例が分かりやすく網羅されています。これ一冊をマスターすれば、出退勤管理だけでなく、在庫管理やタスク管理など、自社のあらゆる業務に合わせた高度なアプリ設計ができるようになります。

次回の予告:第3回「ワンタップ打刻画面の作り方」へ

お疲れ様でした!連載第2回の今回は、出退勤アプリの信頼性を100%にするための裏側の仕組み(バックエンド)を構築しました。

今回の重要ステップをおさらいしましょう。

  1. Initial Value(初期値)に『NOW()』を仕込み、時間を自動取得させた
  2. Initial Valueに『HERE()』を仕込み、スマホのGPSから現在地を自動で掴ませた
  3. 『Editable』をオフにすることで、現場のスタッフによるデータの改ざん・不正を完全にブロックした
  4. Starterプランの30GB制限を守るため、写真は扱わない軽量なデータ設計を徹底した

裏側のデータ自動取得はこれで完璧ですが、現在のアプリの見た目は、まだ「顧客データ」の入力画面のようになっており、文字が小さく、現場のスタッフが「出勤」なのか「退勤」なのかをいちいち選ぶのが少し面倒なUI(画面デザイン)のままです。

そこで次回の第3回は、「【AppSheetで出退勤管理・第3回】出勤・退勤はワンタップ!現場が絶対に迷わないタイムカード画面の作り方」をお届けします。 アプリを開いたら、目の前にドーンと大きな「出勤」「退勤」のボタンがあり、それをスマホでワンタップするだけで打刻がすべて一瞬で終わるような、極限まで無駄を削ぎ落とした「現場ファースト」のタイムカード画面にカスタマイズする手順を詳しく解説します。

Related posts

【AppSheetで出退勤管理・第5回】無料でプラン・ドメインの壁を越える!作成したアプリの「オーナー権限」を安全に譲渡する全手順

【AppSheetで出退勤管理・第4回】徹底検証:Starterで作った打刻アプリはStandardの人や個人Gmailの人でも使える?

【AppSheetで出退勤管理・第3回】出勤・退勤はワンタップ!現場が絶対に迷わないタイムカード画面の作り方