Googleカレンダー×スプレッドシートで承認フローを自動化する方法:最新ガイド
会議や出張、現場調査などの日程調整において、「申請 → 承認 → カレンダー登録」という一連の流れを手作業で行っていませんか? 承認者がメールを受け取り、承認状況を確認して予定をカレンダーに転記する作業は、少人数でも意外と時間が取られます。そこで、GoogleカレンダーとGoogleスプレッドシートを連携させ、Google Apps Script(GAS)を使って承認フローを自動化する方法を解説します。設定を一度作れば、以後の予定申請と承認作業が大幅に効率化されます。
この記事で分かること
- 手動で行っている日程調整の課題と自動化のメリット
- Googleスプレッドシートで承認フローを管理するための準備
- Google Apps Scriptを利用したメール通知・承認・カレンダー自動登録の実装方法
- 複数承認者やリマインダー対応など応用的なカスタマイズ方法
- セキュリティやエラーハンドリングなど運用で押さえるべきポイント
1. 手動承認の課題と自動化のメリット
多くの企業では、会議や出張の予定をメールやチャットで申請し、上長が内容を確認して承認し、最終的に予定をカレンダーに登録する……という手順を踏んでいます。この方法には以下のような問題があります。
- 承認漏れや二重予約のリスク
メールの見落としや同じ時間帯への別予定の登録など、手作業ゆえにミスが発生しやすい。 - 進捗把握が難しい
申請がどの段階にあるのかを一覧で把握しづらく、承認済みか否かが分からないまま予定を入れてしまうことがある。 - 承認者・申請者双方の手間
申請者は承認を待つ間に他の調整が進められず、承認者はメールを確認してカレンダーに登録するという作業が発生する。
これらの問題は、GoogleスプレッドシートとGoogleカレンダーをGASで連携させることで解消できます。申請情報はスプレッドシートに集約され、承認者への通知メールに記載されたリンクからワンクリックで承認/否認を行えるため、登録作業はほぼ自動化されます。結果的に、誤入力や承認待ちの状態を減らし、双方のコミュニケーションコストを下げることができます。
2. スプレッドシートの準備と構成
まずは承認フローの情報を管理するスプレッドシートを作成します。以下のような列を用意すると運用しやすくなります。
列名 | 説明 |
---|---|
申請日 | 申請が登録された日付 |
申請者 | 予定を申請した人の名前 |
件名 | 予定のタイトル(例:顧客打ち合わせ) |
開始日時 | 予定の開始日時 |
終了日時 | 予定の終了日時 |
場所 | 予定の場所 |
承認状況 | 未承認/承認済み/否認 |
イベントID | GoogleカレンダーのイベントID(承認後自動記録) |
申請者メールアドレス | 承認通知を送るためのメールアドレス |
ポイントは、承認状況やイベントIDなどの運用情報を同一シートに入れておくことです。イベントIDを記録しておくと、同じ申請を重複して登録してしまうことを防げますし、後でイベントを削除したい場合などにも活用できます。
3. GASで実装する承認フロー自動化
3.1 承認依頼メール送信のスクリプト
新しい申請が追加されたら、承認者にメールを自動送信し、申請内容と承認/否認のリンクを表示します。以下のコードでは、承認者のメールアドレスやWebアプリのURLを設定し、HTMLメールを使用して見やすさを改善しています。
// 承認者のメールアドレス(複数人の場合はカンマ区切り)
const APPROVER_EMAILS = ['approver1@example.com', 'approver2@example.com'];
// 新しい申請があれば承認依頼を送信
function onFormSubmit(e) {
const sheet = e.source.getSheetByName('申請一覧');
const row = e.range.getRow();
const values = sheet.getRange(row, 1, 1, 8).getValues()[0];
const [申請日, 申請者, 件名, 開始日時, 終了日時, 場所] = values;
// WebアプリのURLを取得
const baseUrl = ScriptApp.getService().getUrl();
const rowParam = encodeURIComponent(row);
const approveUrl = `${baseUrl}?action=approve&row=${rowParam}`;
const denyUrl = `${baseUrl}?action=deny&row=${rowParam}`;
// HTML形式でメール本文を作成
const htmlBody = `
<p><strong>${申請者}</strong>さんから以下の予定申請がありました。</p>
<ul>
<li><strong>件名:</strong>${件名}</li>
<li><strong>日時:</strong>${開始日時} 〜 ${終了日時}</li>
<li><strong>場所:</strong>${場所}</li>
</ul>
<p>承認または否認を選択してください。</p>
<p>
<a href="${approveUrl}" style="background:#4CAF50;color:#fff;padding:8px 12px;text-decoration:none;border-radius:4px;">承認する</a>
<a href="${denyUrl}" style="background:#F44336;color:#fff;padding:8px 12px;text-decoration:none;border-radius:4px;">否認する</a>
</p>
`;
MailApp.sendEmail({
to: APPROVER_EMAILS.join(','),
subject: `【予定承認依頼】${件名} - ${申請者}`,
htmlBody: htmlBody
});
// シートに未承認ステータスと申請者のメールアドレスを記録
sheet.getRange(row, 7).setValue('未承認');
sheet.getRange(row, 9).setValue(Session.getActiveUser().getEmail());
}
主な改善ポイント
- メール本文をHTML化し、承認ボタンと否認ボタンを見やすく配置。
- 承認者が複数いる場合も、配列にして送信可能。
- 申請者のメールアドレスをスクリプトから取得し、後の通知に利用。
- 申請時に未承認ステータスを明示的に入力しておく。
3.2 承認/否認処理とカレンダー登録
メールのリンクがクリックされるとWebアプリが呼び出され、指定の行の承認状況を更新しつつ、承認の場合はカレンダーに自動登録します。また、申請者に結果を通知します。
function doGet(e) {
const action = e.parameter.action;
const row = parseInt(e.parameter.row, 10);
const sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName('申請一覧');
const data = sheet.getRange(row, 1, 1, 9).getValues()[0];
const [申請日, 申請者, 件名, 開始日時, 終了日時, 場所, 承認状況, イベントID, 申請者メール] = data;
// 承認済みや否認済みの申請に対しては処理を行わない
if (承認状況 === '承認済み' || 承認状況 === '否認') {
return ContentService.createTextOutput('この申請はすでに処理されています。');
}
// 承認処理
if (action === 'approve') {
try {
// イベントが重複していないか確認
if (!イベントID) {
const calendar = CalendarApp.getDefaultCalendar();
const event = calendar.createEvent(
件名,
new Date(開始日時),
new Date(終了日時),
{ location: 場所, description: `申請者: ${申請者}` }
);
// 承認結果とイベントIDを記録
sheet.getRange(row, 7).setValue('承認済み');
sheet.getRange(row, 8).setValue(event.getId());
// 申請者に承認通知を送信
MailApp.sendEmail({
to: 申請者メール,
subject: `【承認済】${件名}`,
body: `${申請者}さんの予定申請が承認され、カレンダーに登録されました。\n日時: ${開始日時} 〜 ${終了日時}\n場所: ${場所}\n\nご確認ください。`
});
}
return ContentService.createTextOutput('承認処理が完了し、カレンダーに登録しました。');
} catch (error) {
// エラー発生時に詳細を返す
Logger.log(error);
return ContentService.createTextOutput('承認処理中にエラーが発生しました。シートで状態を確認してください。');
}
}
// 否認処理
if (action === 'deny') {
sheet.getRange(row, 7).setValue('否認');
// 申請者へ否認メール送信
MailApp.sendEmail({
to: 申請者メール,
subject: `【否認】${件名}`,
body: `${申請者}さんの予定申請は否認されました。`
});
return ContentService.createTextOutput('申請を否認しました。');
}
return ContentService.createTextOutput('無効な操作です。');
}
主な改善ポイント
- 承認済みまたは否認済みの申請に対する重複処理を防止。
- イベントIDを記録し、承認済みかどうかを判定。
- 承認者と申請者へ適切なメールを自動送信。
- エラー発生時にはログを出力し、ユーザーへメッセージを返す。
3.3 Webアプリとしてのデプロイ方法
このスクリプトを実行するには、Google Apps ScriptプロジェクトをWebアプリとしてデプロイする必要があります。手順は以下の通りです。
- スクリプトエディタで「デプロイ」→「新しいデプロイ」を選択。
- 種類を「ウェブアプリ」に設定し、説明を記入。
- 「アクセスできるユーザー」を「自分のみ」または「ドメイン内のユーザー」に設定。公開範囲を限定することで安全性が高まります。
- 「実行するユーザー」を「自分」に設定することで、承認者がスクリプトの権限を継承します。
- デプロイ後に表示されるURLを取得し、スクリプト内の
baseUrl
として使用します。
4. 応用編:複数承認者やリマインダーへの拡張
基本的なワークフローに加えて、組織の運用に合わせて以下のような機能も追加可能です。
- 複数段階の承認
列を追加し、それぞれの承認者が承認したか否かを順番に処理。承認済みになった段階で次の承認依頼メールを送信する仕組みを作れば、多段階承認が実現できます。 - リマインダー通知
時間ベースのトリガー(ClockTrigger
)を利用し、承認が一定時間行われない場合にリマインダーを自動送信。承認者のうっかり忘れを防げます。 - SlackやChatでの通知
組織でチャットツールを使っている場合、Webhookを通じてチャネルに承認依頼を通知することで、承認者の反応率を高められます。 - 申請フォームとの連携
Googleフォームやサードパーティのフォームサービスと連携して、申請をフォーム経由にすることで入力の統一やファイル添付が可能になります。 - アクセス権限の管理
スプレッドシートの閲覧権限を申請者のみ・承認者のみなど細かく設定し、承認情報の漏えいを防止します。
5. 運用時の注意と最適化のポイント
セキュリティと権限管理
GASはGoogleアカウントの権限で実行されるため、デプロイ時の設定を誤ると意図しないユーザーが処理できてしまうことがあります。実行するユーザー
を必ずスクリプトの所有者にし、アクセスできるユーザー
を必要最低限に抑えましょう。また、承認用URLは一意な識別子やトークンを含めることで第三者による不正なアクセスを防止できます。
エラーハンドリングとログ管理
現場で運用していくと、予定のダブルブッキングや通信エラーなど予期せぬ事象が発生することがあります。try-catch
構文を用いて例外を捕捉し、Logger.log()
やログシートに詳細を記録することで、問題発生時の原因調査が容易になります。
パフォーマンス最適化
大規模なシートを扱う場合、毎回シートを読み書きする処理は時間がかかります。必要な列だけを取得し、まとめて更新するなど、バッチ処理を意識した書き方にすると処理速度が向上します。また、PropertiesService
を用いて設定値や一時的なデータを保存することで、シートアクセスを減らせます。
6. まとめ:自社の承認プロセスをスマートに
GoogleスプレッドシートとGoogleカレンダー、そしてGoogle Apps Scriptを組み合わせると、申請から承認、カレンダー登録までをほぼ自動で完結させるワークフローを簡単に構築できます。承認者はメールのリンクをクリックするだけで処理できるため、作業時間が大幅に短縮。スプレッドシートに承認履歴が残るので、後からの確認や監査にも対応できます。
この仕組みは、休暇申請や出張申請、会議室予約、設備予約など幅広い用途に応用可能です。カスタマイズ次第で多段階承認やリマインダー送信、チャット通知など、より高度な業務プロセスにも対応できます。
業務の属人化を防ぎ、確実なフローと記録を残せる承認システムは、組織の生産性向上に直結します。ぜひ本記事を参考に、自社の承認プロセスをスマートに自動化してみてください。