🏢

【AppSheet】会社の組織図を管理するアプリ

2023/05/18に公開

はじめに

うちの会社は、組織変更や人事異動が半年に1度くらいのペースで行われる。
そのたびに人事の担当者は通達文を作成したり、組織図の作り直しを行い、システムの担当者は基幹システムのデータの変更を告示前1週間ほどの納期で、夜を徹して行っている。
また、ワードやエクセルなどで作成された書類は、部署単位の共有フォルダーに散在しており、ツールの選択や作り方は人それぞれで、引継ぎもままならない状況で、前任者が作った書類に翻弄される日々が繰り返されている。
そんな中、社内では「効率化」や「時短」をスローガンに「DX推進プロジェクト」なんかが立ち上げられ、あらたな業務が付与されるが、現業に追われそれどころではなく、社外のシステムベンダーに泣きついてはみたものの、何千万円単位の見積りに伺い書を作る気力さえ削がれていく・・・。

前置きが少し長くなったが、「組織図を管理するアプリ」をAppSheetで作ってみることにする。

組織図を確認してみる

会社の概要は、地方で製造業を営む中小企業で、大まかには営業部門、間接部門、製造部門の3つの部門から構成されている。
下図に組織の模式図を示す。


組織の模式図

これを階層別に分けてみると、下図のように4つの階層で区分けできることが分かる。


組織を階層に分けた図

今は4つの階層で表現できているが、これ以上階層が増えないとは言い切れないし、新設や廃止の繰り返しで上位の階層と下位の階層を行ったり来たりする部署も出てくるかもしれない。
この「階層の拡張性」がアプリ作りのポイントになりそうである。

データモデルを考えてみる

その1 テーブルのカラムに階層を用意する

まずは、テーブルのカラムに第1階層から第4階層のカラムを用意して、アプリを作成してみる。


Data Table:組織

第1階層から第4階層までのカラムのデータ型はEnum型とし、Allow othe values(列挙されている値以外の値の入力を認める)とAuto-complate other values(列挙されている値以外の値を自動で追加する)にチェックを入れておき、一度、入力した部署名を再選択できるようにしておく。


階層カラムのデータ型の設定

バーチャルカラム(VC)で、VC組織名に最下階層の部署名を取得するようにし、これをラベルに設定している。

VC組織名:FORMULA

IFS(
  ISNOTBLANK([第4階層名]), [第4階層名],
  ISNOTBLANK([第3階層名]), [第3階層名],
  ISNOTBLANK([第2階層名]), [第2階層名],
  TRUE, [第1階層名]
)

ビューの設定のGroup byで階層表示にすると、下位の部署の新規登録が少し楽になる。


ビューの設定

実際に組織の模式図にしたがって、部署名を入力してみる。
A~Uまでの部署名を模式図どおりに順序良く入力していったので、階層状に表示され、見やすい感じにはなっているけど、この状態から組織変更が繰り返されると、階層状の見た目は崩れていくと思われる。


Desktop mode(Preview)の画面


組織データが記録されたスプレッドシート

アプリを作成してみて、スプレッドシート内の空欄のセルが目立つのと、自分が人事の担当だったら、おそらくAppSheetでの入力作業より、見た目で分かりやすい、従来通りのエクセルやスプレッドシートを使うだろうと考える。

その2 階層ごとにテーブルを用意し、リレーションを組む

1枚構成のテーブルでカラムに階層をもたせた場合、正直、データベースっぽさが感じられない。
そこで、各階層を4つのテーブルに分けて、上位の階層テーブルとリレーションを組んでみることにする。ここで、「本部」「グループ」「チーム」などの部署の区分を表す名称は選択式で入力することで、手間を省き、誤入力を防ぐ。


データモデル

第1階層は親階層、第2階層以下は子階層になるので上位階層をRefで取得する。


Data Table:第1階層


階層区分カラムのデータ型の設定


Data Table:第2階層


ID第1階層カラムのデータ型の設定


階層名カラムのデータ型の設定


階層区分カラムのデータ型の設定

第3階層、第4階層のテーブル設定は、第2階層と同じ要領のなので割愛する。
ビューの設定は、Desktop modeのままでも良かったが、第3階層と第4階層が1つのビューにタブ分けして表示されるため、ここでは分かりやすいようにdashboard形式で4つの階層を並べて表示させてみる。
なお、第1階層から第4階層までの各ビューはMENU NAVIGATIONに設定する。


ビューの設定

その1と同様に、組織の模式図にしたがって、部署名を入力してみる。
上位の階層から順を追って入力できるため、入力に関するストレスはその1よりも少なく感じられる。


組織図ビュー(dash boardタイプ)の画面


組織データが記録されたスプレッドシート


Data:Relationships

スプレッドシートの空欄のセルはなくなって、データベースっぽくはなってきたが、やはり同じテーブルを4つ作成するのは面倒くさい。
実際には、組織が新設されたり廃止されたりして階層が増減することも考えられるので、その都度、テーブルを作り直さないといけない気がする。
自分がシステムの担当だったら、やっぱりエクセルやスプレッドシートでいいやと思ってしまうだろう。

その3 自己参照型のデータモデルを考えてみる

その2の第2階層から第4階層を見てみると、テーブルの構造は同じことの繰り返しである。
色々と調べているうちに、自己参照型のデータモデルがあることを知り、ある部署に対し直近の親の部署のIDを記録させていけば、1つのテーブルで表現することができることが分かった。
また、一般的な企業においては、原則として指揮命令系統は一元化することが決められており、1つの親部署に対し複数の子部署は存在するが、その逆で1つの子部署に対し2つ以上の親部署は存在しないことになっている(社内プロジェクトや委員会などは除外する)。


自己参照型のデータモデル

そういえば、AppSheetのRef型は自分自身のテーブルを参照することができただろうか?
ID親組織のデータ型をRef型にすると、自動的にSource tableに自身のテーブル名(「組織」)が入っている。
果たして、このまま進めていいものかどうか?
「案ずるより産むが易し」ともいうし、とにかくアプリを作ってみる。


Data Table:組織


ID親組織カラムのデータ型の設定


階層区分カラムのデータ型の設定

ここで、いつもYouTube動画『読み書きパソコン』でお世話になっている🥒さん一押しのSelect()関数を使って、親の親組織(VC親親組織)、さらにはその上の親組織(VC親親親組織)をバーチャルカラム(VC)で取得できるか、試しにやってみる。

VC親親組織:FORMULA

ANY(
  SELECT(組織[ID親組織], [ID組織]=[_THISROW].[ID親組織],TRUE)
)

VC親親親組織:FORMULA

ANY(
  SELECT(組織[ID親組織], [ID組織]=[_THISROW].[VC親親組織],TRUE)
)

ビューの設定は、Group byでVC親親親組織、VC親親組織、VC親組織のグループで階層表示させ、Column orderで、親子関係が分かりやすいようにカラムの表示順を調整する。


ビューの設定

念のため、リレーションがどのようになっているか確認してみる。
自身のテーブル(青い四角形)内に「can have many」と表記されており、これが自己参照しているということだろうか。


Data:Relationships

その1・その2と同様に、組織の模式図にしたがって、部署名を入力してみる。
とりあえず上位の階層から順を追って入力していったほうが、作業性は良さそう。
自己参照も上手く機能しているようだし、Select()で取得したVC親親組織、VC親親親組織も取得に成功している(Select関数()って、すごい)。
ビューの設定には改善の余地があるが、プロトタイプとしてはまずまずではなかろうか。


組織ビュー(dash boardタイプ)の画面


組織データが記録されたスプレッドシート

一番の驚きは、組織データが記録されたスプレッドシートのシンプルさではないだろうか。
無駄なセルも少なく、簡潔に組織の階層を管理されているので、組織が新設されたり廃止されたりして階層が増減したとしても、テーブルを作り直す必要もなく、メンテナンス性も良さそうである。

最後に

今回は、AppSheetを使って会社の組織図を管理する3つのアプリを作ってみた。
参考までにサンプルを公開したが、有料プランへ変更するよう警告がきたので、中止します。

Discussion