申請・承認ワークフローを
GASとスプレッドシートで作る手順

Excelとメールで回している稟議・経費・備品などの申請業務を、サーバー代のかからないGASで仕組み化する方法を、動くコードと一緒に解説します。

|著者: (ラスタージ代表)|対象: 業務システム / GAS / ワークフロー

Table of Contents

Excelとメールの申請業務で起きがちな問題

申請書をExcelで作ってメールに添付し、承認者が確認して返信する。この流れは小さな会社ではよくありますが、「今どの案件が誰の手元にあるか分からない」「承認の履歴が個人のメールに埋もれる」「最新版のファイルがどれか分からない」といった問題が出やすくなります。

ラスタージ(Lustage)の業務システム開発でも、申請承認の仕組み化は相談の多いテーマです。専用のワークフロー製品は月額費用がかかるため、申請の種類や人数が限られているなら、GASとGoogleスプレッドシートで作る方法が低コストな選択肢になります。

全体の設計:4つの部品だけで作る

必要なのは次の4つだけです。Googleアカウントの範囲で完結するため、サーバーは不要です。

  • Googleフォーム:申請者が入力する画面(スマホからも申請できる)
  • スプレッドシート「申請」:申請内容とステータスを1行1件で管理する台帳
  • スプレッドシート「承認ログ」:いつ・誰が・どう判断したかの追記専用の記録
  • GAS:申請を受けたら承認者へメールし、判断を記録して申請者へ返す処理

ステータスは「承認待ち」「承認」「差戻し」の3つに絞ると、集計も運用も単純になります。

手順1:申請シートとGoogleフォームを用意する

まずフォームの回答先としてスプレッドシートを作り、「申請」シートのA〜D列がフォームの回答(申請日時・申請者メール・件名・金額)になるよう整えます。E列に承認者、F列にステータス、G列に承認日時を足します。F列にはデータの入力規則(プルダウン)で「承認待ち/承認/差戻し」を設定しておくと、入力ミスを防げます。

フォームの設定では「メールアドレスを収集する」をオンにすると、申請者を自動で記録できます。

手順2:申請を受けて承認依頼メールを送る

スプレッドシートの拡張機能からGASを開き、次のコードを貼ります。フォーム送信をきっかけに、金額に応じた承認者へメールを送り、ステータスを「承認待ち」にします。トリガーは「フォーム送信時」のインストーラブルトリガーとして手動で登録します。

const SHEET = '申請';
// 列: A=申請日時 B=申請者メール C=件名 D=金額 E=承認者メール F=ステータス G=承認日時

/** Googleフォーム送信時(インストーラブルトリガー)に実行 */
function onFormSubmit(e) {
  const sh = SpreadsheetApp.getActive().getSheetByName(SHEET);
  const row = sh.getLastRow();
  const approver = lookupApprover_(sh.getRange(row, 4).getValue());
  sh.getRange(row, 5).setValue(approver);
  sh.getRange(row, 6).setValue('承認待ち');

  const url = SpreadsheetApp.getActive().getUrl() + '#gid=' + sh.getSheetId() + '&range=A' + row;
  MailApp.sendEmail(approver, '【承認依頼】' + sh.getRange(row, 3).getValue(),
    '申請内容を確認し、F列を「承認」または「差戻し」にしてください。\n' + url);
}

/** 金額に応じて承認者を決める(例) */
function lookupApprover_(amount) {
  return Number(amount) >= 100000 ? 'director@example.com' : 'manager@example.com';
}

承認者の振り分けは、例のように金額で分ける方法のほか、別シートに部署と承認者の対応表を置いて検索する方法もあります。

手順3:承認・差戻しを記録して申請者へ通知する

承認者がスプレッドシートのF列を「承認」か「差戻し」に変えたら、承認日時と承認者を記録し、申請者へ結果をメールします。セルの編集を検知するため、シンプルトリガーではなく「編集時」のインストーラブルトリガーで登録します(シンプルトリガーではメール送信ができません)。

/** インストーラブルトリガー(編集時)で実行 */
function onApprovalEdit(e) {
  const sh = e.range.getSheet();
  if (sh.getName() !== SHEET || e.range.getColumn() !== 6 || e.range.getRow() < 2) return;

  const status = e.value;
  if (status !== '承認' && status !== '差戻し') return;

  const row = e.range.getRow();
  sh.getRange(row, 7).setValue(new Date());
  // 承認の記録は別シートに追記(編集権限は管理者のみ)
  SpreadsheetApp.getActive().getSheetByName('承認ログ')
    .appendRow([new Date(), row, status, Session.getActiveUser().getEmail()]);

  const applicant = sh.getRange(row, 2).getValue();
  MailApp.sendEmail(applicant, '【' + status + '】' + sh.getRange(row, 3).getValue(),
    '申請が「' + status + '」になりました。');
}

承認ログはシートの保護機能で編集権限を管理者に限定します。承認操作そのものを専用の画面にしたい場合は、HtmlServiceでWebアプリを作る方法もあります。

運用で効く工夫と、GASの制約

  • 承認されないまま2営業日が過ぎた案件に、時間主導トリガーで毎朝リマインドメールを送る
  • 承認者の不在に備えて、代理承認者の列を用意する
  • 同時に複数人が編集しても二重処理しないよう、LockServiceと処理済みフラグを使う
  • メール送信数には1日あたりの上限(クォータ)があるため、大量通知には向かない
  • GASの1回の実行時間には上限があるため、1回の処理を短く保つ

作ったあとに担当者が変わっても困らないよう、トリガーの一覧や設定値を文書化しておくことも重要です。詳しくは属人化を防ぐ運用ルールの記事にまとめています。

向かないケースと、専用製品を選ぶ目安

次のような場合は、GASで無理に作らず専用のワークフロー製品を検討したほうが安全です。

  • 申請者・承認者が数百人規模で、組織変更のたびに承認ルートを更新する
  • 電子帳簿保存法など、法令に沿った厳密な証跡管理が必要
  • 承認ルートが条件によって何段階にも分岐する

一方、申請の種類が数種類で、人数が数人〜数十人、承認ルートが1〜2段階であれば、GASとスプレッドシートで十分に実用的で、月額運用費0円で運用できます。ラスタージでは、現在の申請書様式を活かしながら、費用を抑えた仕組みづくりを行っています。

よくある質問

Googleアカウントの範囲で動かす構成なら、サーバー代などの月額運用費は発生しません。ただしGoogle Workspaceの契約費用や、メール送信数・実行時間の上限(クォータ)は別に考える必要があります。

申請が1日数十件程度までなら実用的な例が多いです。申請者が数百人規模、承認ルートが部署ごとに複雑に分かれる場合は、専用のワークフロー製品のほうが向いています。

代理承認者の列を用意し、一定時間承認されない案件はリマインドメールを送る設計にします。時間主導トリガーで毎朝チェックする方法が簡単です。

承認日時と承認者のメールアドレスを別シートに追記し、そのシートの編集権限を管理者だけにします。厳密な監査が必要な業務は、専用システムの検討をおすすめします。

はい。現在の申請の流れをヒアリングし、GASで作れる範囲と費用の考え方をお伝えします。既存のExcel様式をそのまま活かす設計にも対応しています。

関連するサービス・記事

Official Docs

この記事で扱ったサービスの公式ドキュメントです。仕様や上限値は変わることがあるため、実装前に最新の内容をご確認ください。

申請業務の仕組み化を、 まず相談する。

今の申請の流れをお知らせください。ラスタージの田中達也が、GASで作れる範囲と費用の考え方をお答えします。

業務システム開発を見る