申請・承認ワークフローを
GASとスプレッドシートで作る手順
Excelとメールで回している稟議・経費・備品などの申請業務を、サーバー代のかからない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様式をそのまま活かす設計にも対応しています。
関連するサービス・記事
ラスタージの業務システム開発の対応範囲と進め方を紹介します。
業務システム開発・DX化支援を見る →
GAS+スプレッドシートで運用費がかからない仕組みと向き不向きを解説します。
月額運用費0円の業務システムを見る →
申請承認を含む6つの例と、向かないケースの見分け方です。
GASで作れる業務システムの例と向かないケース →
AIの下書きを承認してから実行する設計の記事です。
GASでAIの処理を人の承認後に実行する方法 →
作ったあとの運用・引き継ぎのルールをまとめています。
GAS業務システムの属人化を防ぐ5つの運用ルール →
見積もりの前提と費用の決まり方を説明しています。
ラスタージの料金・費用の考え方 →
Services
ラスタージ(Lustage)は、低コストの業務システム開発・DX化支援・AIチャットボット導入・GAS開発・Webサイト制作を、月額運用費0円の仕組みで承っています。
関連する記事
Official Docs
この記事で扱ったサービスの公式ドキュメントです。仕様や上限値は変わることがあるため、実装前に最新の内容をご確認ください。