AppSheet ランニングコストを低減した多段承認フロー

紙で運用している日報・週報の承認業務を電子化したいという要望はよく頂く相談の1つです。

課題点

その際にご相談頂くポイントは、大きく2つに分類されます。

  • 運用:これまでの紙運用から大きく変えると現場が混乱するので、現状の運用をできるだけそのままアプリにしたい
  • 費用:全員がアカウントを持っていないため、コスト増とならないようにしたい

今回は、ある程度の自由度を持った承認フローの作成を紹介したいと思います。

最終的には、以下のようなAppsheetが完成します。

お問い合わせ

多少、難易度の高い内容もありますので、もし本内容について自社での構築依頼など、詳細を確認したい場合は、お問い合わせ よりお願い致します!

ご相談内容

今回作成するサンプルとしては、当時頂いたご相談内容を元にしたいと思います。

  • これまで通り、承認は、部署内の上位役職者ができるようにしたい
  • ただし、役職が1つ上の社員は承認して良いか、それより上の社員が飛び越えて承認は出来ないようにしたい
  • また部署ごとの所属人数が異なるため、2~6段階で可変の承認段階が必要
  • また、産休などで長期間不在となる場合もあるため、その時はその上の役職の社員が承認出来る必要がある
  • 全員がアカウントを持っていないため、コスト増とならないようにしたい

多段承認フォローの基本的な考え方

承認回数を可変に設定できる承認フローをAppSheetで実現するための、設計方針です。まずは要望から必要となる機能を考えます。

  1. 承認は部署をまたいでは出来ない→部署を判別するために部署マスタが必要
  2. 承認は役職が上位の者が行う→役職を判別するために役職マスタが必要
  3. 部署に所属する従業員は、所属する部署と役職をもちマスタで管理する。
  4. アカウントを持たないユーザも判別できるよう、従業員にはIDとパスワードを持たせ、UserSettingsを使った判定を行う。
  5. 部署によって承認回数が異なる→部署ごとの承認段階を決めるマスタが必要
  6. 長期不在に備えた承認者変更が必要→上記の承認段階は固定ではなく可変である必要がある。

テーブル設計としは、以下のテーブルが必要となります。

  • マスタ
    • 部署
    • 役職
    • 部署別承認段階
    • 従業員
  • トランザクション
    • 日報
    • 日報承認ログ

上記のテーブルを、1つずつ検討していきます。

テーブル設計

マスタ

まずはマスタデータから検討していきます。

1.部署

従業員が配属される部署を管理するマスタです。承認者も部署をまたがって承認することが出来ないよう制御するために必要となります。

部署ID部署名
B1管理部
B2公共事業部
B3金曜事業部
B4産業事業部
2.役職

組織上の役職を管理するマスタです。上位の役職者が、自身の部下の日報を承認できるよう制御するために必要となります。

どちらが上位の役職であるかを判定するために、「承認権限」項目を用いて判定します。

役職役職名承認権限
M6代表取締役80
M5本部長70
M4部長60
M3部長代理50
M2課長40
M1課長代理30
T3係長20
T2主任10
T1担当0
3.従業員

会社に所属する従業員を管理するマスタです。従業員には所属する「部署」と、職位を表す「役職」をもたせます。

これにより、ログインしたユーザごとに、誰を承認出来るかを判定し、制御することが出来ます。

従業員ID従業員名メールアドレスパスワード部署役職
J001AさんA@m.comAAAAB2M6
J002BさんB@m.comBBBBB2M5
J003CさんC@m.comCCCCB2M4
J004DさんD@m.comDDDDB2M3
J005EさんE@m.comEEEEB2M2
J006FさんF@m.comFFFFB2M1
J007GさんG@m.comGGGGB2T4
J008HさんH@m.comHHHHB2T3
J009IさんI@m.comIIIIB2T2
J010JさんJ@m.comJJJJB2T1

また従業員にはIDとパスワードを持たせ、UserSettingsの機能で簡易ログイン機能を実装します。詳細な実装方法は別の記事をご参考いただければと思います。

4.部署別承認段階

部署ごとに所属人数が異なるため、承認する回数や初回承認者の権限も変えたいとの要望ですので、それを実現するために部署ごとに、承認段階と承認権限をもたせます。

このマスタが今回の肝です。

部署ID部署名承認段階承認権限
B2公共事業部110
B2公共事業部220
B2公共事業部230
B2公共事業部340
B2公共事業部450
B2公共事業部560
B2公共事業部670
B3金曜事業部130
B3金曜事業部240
B3金曜事業部350
B3金曜事業部460

トランザクション

各担当者が作成する日報についてです。ポイントは日報の承認ログを残すためのテーブルを用いるところです。

1.日報

日報ですので、いつ・だれが報告したか分かるように、作成者と日付をもうけます。また作業時間の管理のために作業の開始時刻・終了時刻も保持します。

日報ID作成者日付開始時刻終了時刻報告
1cfad838J0102024/11/248:50:0017:00:00予定どおり
7b87a0e7J0102024/11/248:50:0017:09:001日遅延
eca702e3J0082024/11/248:50:0020:34:001日前倒し
2.日報承認ログ

日報の承認ログを残すためのテーブルです。このテーブルを用いて、各日報がどういう状態かを判定します。

まず、「承認区分」をもたせ「承認/非承認」が分かるようにします。合わせて、誰が承認したかを後で追えるように、「承認者」も持たせます。

非承認の際は、なぜ非承認となり、何を修正しないといけないか作成者が分かるように「コメント」を残せるようにします。

また、「部署」「承認段階」を持たせることで、次に承認できる人が誰かを判定できるようにします。

日報ID日時承認区分承認者部署承認段階権限コメント
7b87a0e711/24/2024 21:09:10承認J001B2
1cfad83811/24/2024 21:09:16非承認J008B2110
1cfad83811/24/2024 21:12:21非承認J009B2110時刻が不正です。

画面

必要最低限の画面構成として、以下の3つを用意します。

ログイン簡易ログイン認証
日報日報作成のための画面
日報一覧自分が作成した日報の一覧
承認待ち一覧部下の承認待ちの日報一覧

ログイン画面

メニューのSettingsをクリックすることで、UserSettingsを開きます。

そこにIDとパスワードを入れてユーザ情報を保存します。

設定の詳細は、以下の記事を参考頂ければと思います。

日報

日報の作成画面です。従業員はこの画面から日報を入力します。

日報一覧

日々入力した日報を確認する画面です。

ログインした(UserSettingsで設定した)アカウントの日報だけを表示する必要があるため、スライスを作成します。

日報テーブルに「ログインユーザ日報」のスライスを作成します。

Row filter conditionには、日報の作成者が一致するデータだけを表示するように設定します。

count(
  filter("日報",
    and(
      [_THISROW].[作成者].[従業員ID]=USERSETTINGS("ID"),
      [_THISROW].[作成者].[パスワード]=USERSETTINGS("Password"))
    )
)>0

これにより、ログインした(UserSettingsで設定した)ごとに表示されるデータ合を出し分けることが可能です。

たとえは「J0080」であれば、

J080のユーザの日報のみが表示されます。

ユーザを「J010」に変えると、

J010のユーザの日報が表示されます。

承認待ち一覧画面

最後に、承認待ち一覧画面です。

ログインユーザに承認(または非承認)をしなければならない日報を表示する画面になります。

承認・非承認ボタンを追加します。このボタンには、部署や役職に応じて、アクションの実行可否を制御する必要があります。

また、承認・非承認ボタンを押すことで「日報承認ログ」に記録を残すようにします。これにより、各日報の承認段階を制御するようにします。

承認ボタン

承認ボタンを押すことで、「日報承認ログ」にデータを追加します。

部署:

any(SELECT(従業員[部署],[従業員ID]=USERSETTINGS("ID")))

承認段階

any(
  SELECT(部署別承認段階[承認段階],
    and(
      [承認権限]=any(
        SELECT(役職[承認権限],[役職]=
          any(
            SELECT(従業員[役職],
              [従業員ID]=USERSETTINGS("ID")
            )
          )
        )
      ),
      [部署ID]=any(
        SELECT(従業員[部署],
          [従業員ID]=USERSETTINGS("ID")
        ) 
      )
    )
  )
)

権限:

any(
  select(
    役職[承認権限],
    [役職]=any(SELECT(従業員[役職],[従業員ID]=USERSETTINGS("ID")))
  )
)

Behaviorの「Only if this condition is true」には、承認段階に応じてアクションの表示・非表示が正しく出るように設定できるようにします。

[承認段階]=any(
  SELECT(部署別承認段階[承認段階],
    and(
      [承認権限]=any(
        SELECT(役職[承認権限],[役職]=
          any(
            SELECT(従業員[役職],
              [従業員ID]=USERSETTINGS("ID")
            )
          )
        )
      ),
      [部署ID]=any(
        SELECT(従業員[部署],
          [従業員ID]=USERSETTINGS("ID")
        ) 
      )
    )
  )
)-1
非承認ボタン

非承認のアクションは、非承認の理由をコメントできるように「非承認ログ_Form」画面を開くようにします。

画面の表示する「Target」に以下の設定します。

LINKTOFORM(
  "日報承認ログ_Form",
  "承認区分","非承認",
  "日報ID",[日報ID],
  "日時",NOW(),
  "承認者",USERSETTINGS("ID"),
  "部署",any(SELECT(従業員[部署],[従業員ID]=USERSETTINGS("ID"))),
  "承認段階",
  any(
  SELECT(部署別承認段階[承認段階],
    and(
      [承認権限]=any(
        SELECT(役職[承認権限],[役職]=
          any(
            SELECT(従業員[役職],
              [従業員ID]=USERSETTINGS("ID")
            )
          )
        )
      ),
      [部署ID]=any(
        SELECT(従業員[部署],
          [従業員ID]=USERSETTINGS("ID")
        ) 
      )
    )
  )
),
  "権限",any(select(役職[承認権限],[役職]=any(SELECT(従業員[役職],[従業員ID]=USERSETTINGS("ID")))))
)

上記の設定を行うことで、「非承認」ボタンをおすと

以下のように承認ログを表示できます。この画面で、コメントを入力することができます。

また承認アクションと同様に、Behaviorの「Only if this condition is true」には、承認段階に応じてアクションの表示・非表示が正しく出るように設定できるようにします。

[承認段階]=any(
  SELECT(部署別承認段階[承認段階],
    and(
      [承認権限]=any(
        SELECT(役職[承認権限],[役職]=
          any(
            SELECT(従業員[役職],
              [従業員ID]=USERSETTINGS("ID")
            )
          )
        )
      ),
      [部署ID]=any(
        SELECT(従業員[部署],
          [従業員ID]=USERSETTINGS("ID")
        ) 
      )
    )
  )
)-1

アプリの完成

アプリが完成しました。

  • 運用:ある程度の自由度を持った承認フローの作成しましたので、これまでの紙運用にできるだけ近づけ、現場の混乱を低減できるのではと思います。
  • 費用:またUserSettingsを利用することで、全員がアカウントを持っていないなくとも利用が出来、コスト低減が出来ると思います。(情報漏洩の観点から社内利用が前提です。)

お問い合わせ

相談やお問合せは、お問い合わせ よりお願い致します!

Comments

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です