見出し画像

フリーアドレスの混沌を制す!スプレッドシートで作った座席予約システムを使いやすくしてみた話

こんにちは、分析屋二代目業務効率化隊長の野口です。

いつもご利用いただきありがとうございます。

今回はフリーアドレス制を導入している分析屋で実際に活用している座席予約表を紹介します。従来の座席予約表では、社員間の連携がうまくいかず、不都合やトラブルが多々ありました。この状況に対処するため、スプレッドシートを用いて複数の関数を使った独自の関数を組み込みました。このブログでは、座席予約に関する社員の不満を解消するための改善し、円滑な運用を実現するための具体的な方法をご紹介します。Excelの上級レベルのINDIRECT関数の実際の活用方法まで、実践的なノウハウをお届けしますので、ぜひご一読ください。


背景

以前は、スプレッドシート上で表の形で予約状況を表示していました。これはこれで便利でしたが、予約が増えるにつれて使いづらくなっていました。

従来の方法では、予約表の入力と、当日の席の確認までの流れに様々な不便があり、その結果スムーズな予約管理が難しくなっていました。

具体的には、

  • 行ヘッダーに時刻(日付&AMPM)を入れ、入力シートを1シートで運用していた

  • セルの中に各自で「氏名(席番号)」と記入していた

  • 入力シートを見ても席番号が会社のどの席に対応してるのかわかりにく

などの状態だったため、多くの社員が使いづらさを感じていました。

課題

これまでのシートを用いた運用では、様々な不満がありました。
「予約はしたけどどこに座ればいいのかわからない」「同じ座席のダブルブッキングが知らない間に起きていて困った」「特定の座席でしか作業ができない業務なのに座席が埋まってて別日にずらすしかなかった」等々...
座席予約するタイミングが社員でバラバラのため、リアルタイム性があるスプレッドシートを活用してもうまく運用として機能していませんでした。

解決した結果

そこでこれらの課題を精査することで、
時刻(日付&AMPM)を行ヘッダー、座席番号を列ヘッダーとした表形式の入力シートをスプレッドシートで作成し、運用ルールの周知徹底やレイアウト調整をすることで入力の手間を省きました。
同時に、今誰がどの座席を予約しているのか、予約した座席はどこなのかを一目で確認できるようにすることで当日の座席予約に関するトラブルを解消しました。

やり方

座席予約表を効率化できた方法をステップ1~4に分けて解説します。

ステップ 1: テーブルデータの設計

まず、座席予約表で最も大切なことは「社員の入力の手間にならないこと」これにつきます。すなわち「7月18日にあの座席を予約したい」というニーズに即した入力導線をスプレッドシートで表現しなければなりません。
これまでのスプレッドシートは月をまたいでも下の行に予約の名前を書いていたため、運用期間が長くなるほど入力のスクロール量が増えていくというのが課題となっていました。
そのため、スクロール量を一定量に抑えつつ入力をさせる必要がありました。
そのためにはシートを切り替えるか数日前の行を非表示にするか等の対策が必須だったため、今回は月ごとにシートを分けることでスクロール量を抑えることにしました。
※検索範囲や今後の運用も考慮し、30日ある月でも31日分記入できるシートで作成

一部変更した実際に使用しているシートです。このようなシートを1月~12月までの12シート用意しています。

ステップ 2: 「本日の座席」シートの導入

次に、今この座席は予約されているのか、誰が予約していたのか等のリアルタイムの情報を可視化するために「本日の座席」というシートを新規作成しました。
これまでの運用では座席予約表を当日見て(もしくは前日までにどの座席を予約したか把握しておいて)予約した座席に座る、という流れを行っていました。
しかし、座席予約表を都度チェックするのが手間だという課題がありました。
私はこのシートの導入によって、「今」「誰が」「どの座席」を予約しているのかを一目で分かるようにしようと考えました。
そこで私はINDIRECT関数を使うことで、この課題を解決しました。

ステップ 3: INDIRECT関数の使用

INDIRECT関数は、Excelで文字列として指定されたセル参照や範囲名を実際の参照に変換する関数です。これにより、動的にセルや範囲を参照できます。例えば、INDIRECT("A" & ROW())のように使用すると、行番号に応じてA列の異なるセルを参照できます。数式の柔軟性を高め、複雑な計算や参照を可能にする強力なツールです。

これを応用し、「4月」「11月」といった月の情報だけ入れたシートを作成し、任意のセルに”=MONTH(TODAY())”と記入し、そのセルを参照することで月ごとで参照シートを切り替えることができました。
これによりVLOOKUP関数などを使用する際、参照範囲を複数シートに設定することが可能になりました。

例)R17セルに現在の月を出力する関数である、MONTH(TODAY())を入力した時
【手入力】5月!$F$4:$Y$65
【関数化】INDIRECT($R$17&"月!$F$4:$Y$65")


ステップ 4:関数の組み合わせ 

ステップ1で入力の簡易化、ステップ2で可視化の土台を形成、ステップ3で必要な情報はすべて揃いました。後はこのデータを集約できるような関数を組めば完成です。
と言ってもやることはVLOOKUP関数のような検索系の関数を仕様に沿って組み合わせるだけなので、後は関数が長くなる覚悟があれば行けます。
(今回は複数の行と列を参照したためINDEX関数とMATCH関数の組み合わせで作成しました。)
A1の座席を引っ張って来る関数がこちらになります。


=INDEX(INDIRECT($R$17&"月!$F$4:$Y$65"),MATCH($R$18&$R$20,INDIRECT($R$17&"月!$B$4:$B$65")&INDIRECT($R$17&"月!$C$4:$C$65"),0),MATCH(D$4,INDIRECT($R$17&"月!$F$2:$Y$2"),0))

凄く長いですね。
引数として使用しているものは以下の通りです。
D4  ⇒座席(この関数だとA1と記入したセルを選択しています。)
R17⇒今月
R18⇒今日
R20⇒時刻(AM or PM)

このようにして時刻の変化に伴うように関数を組み込むことで参照範囲を変更しながらリアルタイムの情報を可視化することができました。

運用の注意点とあとがき

運用ルールでお気づきの方もいるかと思いますが、本シートは(スプレッドシートそのものの規約改正等がない限り)永年使用を想定しています。
ただ、シートには「4月」「11月」と月の情報しか入っていません。そのため一年以上の利用となれば既に入力しているシートを来年の月に合わせて初期化する必要があります。
スプレッドシート作成した際にはその課題があり、毎月の作業工数自体は数分でもチリツモで思いのほか工数がとられてしまう、という懸念がありました。
そこで私はGAS(Google Apps Script)も組み合わせ使い実行トリガーを毎月決めた日に設定することで、シート更新を完全自動化することに成功しました。
ですがその話はまた後日...


ここまでお読みいただき、ありがとうございました!
この記事が少しでも参考になりましたら「スキ」を押していただけると幸いです!

株式会社分析屋について

弊社が作成を行いました分析レポートを、鎌倉市観光協会様HPに掲載いただきました。

ホームページはこちら。

noteでの会社紹介記事はこちら。

【データ分析で日本を豊かに】
分析屋はシステム分野・ライフサイエンス分野・マーケティング分野の知見を生かし、多種多様な分野の企業様のデータ分析のご支援をさせていただいております。 「あなたの問題解決をする」をモットーに、お客様の抱える課題にあわせた解析・分析手法を用いて、問題解決へのお手伝いをいたします!

【マーケティング】
マーケティング戦略上の目的に向けて、各種のデータ統合及び加工ならびにPDCAサイクル運用全般を支援や高度なデータ分析技術により複雑な課題解決に向けての分析サービスを提供いたします。

【システム】
アプリケーション開発やデータベース構築、WEBサイト構築、運用保守業務などお客様の問題やご要望に沿ってご支援いたします。

【ライフサイエンス】
機械学習や各種アルゴリズムなどの解析アルゴリズム開発サービスを提供いたします。過去には医療系のバイタルデータを扱った解析が主でしたが、今後はそれらで培った経験・技術を工業など他の分野の企業様の問題解決にも役立てていく方針です。

【SES】
SESサービスも行っております。