Googleカレンダー×スプレッドシートで承認フローを自動化する方法:最新ガイド

    
\ この記事を共有 /
Googleカレンダー×スプレッドシートで承認フローを自動化する方法:最...

会議や出張、現場調査などの日程調整において、「申請 → 承認 → カレンダー登録」という一連の流れを手作業で行っていませんか? 承認者がメールを受け取り、承認状況を確認して予定をカレンダーに転記する作業は、少人数でも意外と時間が取られます。そこで、GoogleカレンダーとGoogleスプレッドシートを連携させ、Google Apps Script(GAS)を使って承認フローを自動化する方法を解説します。設定を一度作れば、以後の予定申請と承認作業が大幅に効率化されます。


この記事で分かること

  • 手動で行っている日程調整の課題と自動化のメリット
  • Googleスプレッドシートで承認フローを管理するための準備
  • Google Apps Scriptを利用したメール通知・承認・カレンダー自動登録の実装方法
  • 複数承認者やリマインダー対応など応用的なカスタマイズ方法
  • セキュリティやエラーハンドリングなど運用で押さえるべきポイント

1. 手動承認の課題と自動化のメリット

多くの企業では、会議や出張の予定をメールやチャットで申請し、上長が内容を確認して承認し、最終的に予定をカレンダーに登録する……という手順を踏んでいます。この方法には以下のような問題があります。

  • 承認漏れや二重予約のリスク
    メールの見落としや同じ時間帯への別予定の登録など、手作業ゆえにミスが発生しやすい。
  • 進捗把握が難しい
    申請がどの段階にあるのかを一覧で把握しづらく、承認済みか否かが分からないまま予定を入れてしまうことがある。
  • 承認者・申請者双方の手間
    申請者は承認を待つ間に他の調整が進められず、承認者はメールを確認してカレンダーに登録するという作業が発生する。

これらの問題は、GoogleスプレッドシートとGoogleカレンダーをGASで連携させることで解消できます。申請情報はスプレッドシートに集約され、承認者への通知メールに記載されたリンクからワンクリックで承認/否認を行えるため、登録作業はほぼ自動化されます。結果的に、誤入力や承認待ちの状態を減らし、双方のコミュニケーションコストを下げることができます。


2. スプレッドシートの準備と構成

まずは承認フローの情報を管理するスプレッドシートを作成します。以下のような列を用意すると運用しやすくなります。

列名説明
申請日申請が登録された日付
申請者予定を申請した人の名前
件名予定のタイトル(例:顧客打ち合わせ)
開始日時予定の開始日時
終了日時予定の終了日時
場所予定の場所
承認状況未承認/承認済み/否認
イベントIDGoogleカレンダーのイベント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>
      &nbsp;
      <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アプリとしてデプロイする必要があります。手順は以下の通りです。

  1. スクリプトエディタで「デプロイ」→「新しいデプロイ」を選択。
  2. 種類を「ウェブアプリ」に設定し、説明を記入。
  3. 「アクセスできるユーザー」を「自分のみ」または「ドメイン内のユーザー」に設定。公開範囲を限定することで安全性が高まります。
  4. 「実行するユーザー」を「自分」に設定することで、承認者がスクリプトの権限を継承します。
  5. デプロイ後に表示されるURLを取得し、スクリプト内のbaseUrlとして使用します。

4. 応用編:複数承認者やリマインダーへの拡張

基本的なワークフローに加えて、組織の運用に合わせて以下のような機能も追加可能です。

  • 複数段階の承認
    列を追加し、それぞれの承認者が承認したか否かを順番に処理。承認済みになった段階で次の承認依頼メールを送信する仕組みを作れば、多段階承認が実現できます。
  • リマインダー通知
    時間ベースのトリガー(ClockTrigger)を利用し、承認が一定時間行われない場合にリマインダーを自動送信。承認者のうっかり忘れを防げます。
  • SlackやChatでの通知
    組織でチャットツールを使っている場合、Webhookを通じてチャネルに承認依頼を通知することで、承認者の反応率を高められます。
  • 申請フォームとの連携
    Googleフォームやサードパーティのフォームサービスと連携して、申請をフォーム経由にすることで入力の統一やファイル添付が可能になります。
  • アクセス権限の管理
    スプレッドシートの閲覧権限を申請者のみ・承認者のみなど細かく設定し、承認情報の漏えいを防止します。

5. 運用時の注意と最適化のポイント

セキュリティと権限管理

GASはGoogleアカウントの権限で実行されるため、デプロイ時の設定を誤ると意図しないユーザーが処理できてしまうことがあります。実行するユーザーを必ずスクリプトの所有者にし、アクセスできるユーザーを必要最低限に抑えましょう。また、承認用URLは一意な識別子やトークンを含めることで第三者による不正なアクセスを防止できます。

エラーハンドリングとログ管理

現場で運用していくと、予定のダブルブッキングや通信エラーなど予期せぬ事象が発生することがあります。try-catch構文を用いて例外を捕捉し、Logger.log()やログシートに詳細を記録することで、問題発生時の原因調査が容易になります。

パフォーマンス最適化

大規模なシートを扱う場合、毎回シートを読み書きする処理は時間がかかります。必要な列だけを取得し、まとめて更新するなど、バッチ処理を意識した書き方にすると処理速度が向上します。また、PropertiesServiceを用いて設定値や一時的なデータを保存することで、シートアクセスを減らせます。


6. まとめ:自社の承認プロセスをスマートに

GoogleスプレッドシートとGoogleカレンダー、そしてGoogle Apps Scriptを組み合わせると、申請から承認、カレンダー登録までをほぼ自動で完結させるワークフローを簡単に構築できます。承認者はメールのリンクをクリックするだけで処理できるため、作業時間が大幅に短縮。スプレッドシートに承認履歴が残るので、後からの確認や監査にも対応できます。

この仕組みは、休暇申請や出張申請、会議室予約、設備予約など幅広い用途に応用可能です。カスタマイズ次第で多段階承認やリマインダー送信、チャット通知など、より高度な業務プロセスにも対応できます。

業務の属人化を防ぎ、確実なフローと記録を残せる承認システムは、組織の生産性向上に直結します。ぜひ本記事を参考に、自社の承認プロセスをスマートに自動化してみてください。

Copyright©サンスクエア株式会社,2021All Rights Reserved.