採用業務、手作業だらけじゃないですか?

ミドリ(surprised): タツヤさん、うちの人事部の人が「採用シーズンになると毎日残業」って嘆いてたんですけど、何がそんなに大変なんですか?

タツヤ(smiling): 採用業務って、意外と「考える仕事」より「事務作業」のほうが圧倒的に多いんだよ。具体的に何をやってるか見てみよう。

業務内容所要時間(1件あたり)
応募受付メール確認、情報をスプレッドシートに転記5〜10分
受領確認メール応募者に「受け取りました」メールを送信3〜5分
面接日程調整候補日を面接官に確認→応募者に提案→調整15〜30分
評価シート作成面接ごとに評価フォームを準備5〜10分
合否通知結果をメールで通知5〜10分
入社書類準備各種書類のテンプレートを個別に作成20〜30分

ミドリ: 1人の応募者に対して、これ全部やるんですか? 月30人応募が来たら……。

タツヤ: 単純計算で月20〜30時間は事務作業だけで消える。しかもミスが許されない。宛名間違えたら大惨事だからね。

ミドリ: それ全部GASで自動化できるんですか?

タツヤ: ほぼ全部できる。しかもGoogle Workspaceの中で完結するから、追加コストゼロ。順番に見ていこう。

ステップ1:応募管理スプレッドシートを作る

ミドリ: まず何から始めればいいですか?

タツヤ: 応募者情報を一元管理するスプレッドシートを作る。これが全自動化の起点になる。

タツヤ: シートの構成はこう。

内容
A応募IDAPP-2026-001
B応募日2026-03-15
C氏名山田太郎
Dメールアドレス[email protected]
E応募ポジションフロントエンドエンジニア
Fステータス書類選考中 / 面接調整中 / 面接済み / 内定 / 不採用
G面接日時2026-03-20 14:00
H面接官佐藤一郎
I評価スコア4.2 / 5.0
J備考ポートフォリオ確認済み

ミドリ: Google Formsから応募を受け付ければ、自動でシートに入りますよね?

タツヤ(nodding): その通り。さらにGASのトリガーを使えば、新しい行が追加された瞬間に自動処理が走る。

ステップ2:自動返信メールの設定

ミドリ: 応募が来たら最初に何を自動化しますか?

タツヤ(nodding): まず受領確認メール。応募者は「ちゃんと届いたかな」って不安なんだよ。即レスが基本。

function onFormSubmit(e) {
  const response = e.namedValues;
  const name = response['氏名'][0];
  const email = response['メールアドレス'][0];
  const position = response['応募ポジション'][0];

  // 応募IDを生成
  const sheet = SpreadsheetApp.getActiveSheet();
  const row = sheet.getLastRow();
  const appId = `APP-${new Date().getFullYear()}-${String(row).padStart(3, '0')}`;
  sheet.getRange(row, 1).setValue(appId);
  sheet.getRange(row, 6).setValue('書類選考中');

  // 受領確認メールを送信
  const subject = `【応募受付完了】${position}へのご応募ありがとうございます`;
  const body = `${name} 様\n\n`
    + `この度は${position}ポジションにご応募いただき、\n`
    + `誠にありがとうございます。\n\n`
    + `応募ID: ${appId}\n\n`
    + `書類選考の結果は、5営業日以内にご連絡いたします。\n\n`
    + `株式会社○○ 採用担当`;

  GmailApp.sendEmail(email, subject, body);
}

ミドリ: フォーム送信と同時にメールが飛ぶんですね。応募者からしたら「対応が早い会社だな」って好印象ですよね。

タツヤ: 採用ブランディングの観点でも大事。レスポンスの速さは企業イメージに直結する。

ステップ3:面接日程の自動調整

ミドリ: 一番面倒な日程調整はどう自動化するんですか?

タツヤ: Google Calendarとの連携がカギ。面接官のカレンダーから空き時間を自動取得して、候補日を応募者にメール送信する。

function suggestInterviewSlots(interviewerEmail, daysAhead = 7) {
  const calendar = CalendarApp.getCalendarById(interviewerEmail);
  const now = new Date();
  const endDate = new Date(now.getTime() + daysAhead * 24 * 60 * 60 * 1000);

  // 営業時間内(10:00-18:00)の空き枠を取得
  const slots = [];
  const current = new Date(now);
  current.setHours(10, 0, 0, 0);
  if (current < now) current.setDate(current.getDate() + 1);

  while (current < endDate) {
    if (current.getDay() !== 0 && current.getDay() !== 6) { // 平日のみ
      for (let hour = 10; hour <= 16; hour++) {
        const slotStart = new Date(current);
        slotStart.setHours(hour, 0, 0, 0);
        const slotEnd = new Date(slotStart.getTime() + 60 * 60 * 1000);

        const events = calendar.getEvents(slotStart, slotEnd);
        if (events.length === 0) {
          slots.push({
            date: Utilities.formatDate(slotStart, 'Asia/Tokyo', 'yyyy/MM/dd'),
            time: Utilities.formatDate(slotStart, 'Asia/Tokyo', 'HH:mm'),
            datetime: slotStart
          });
        }
      }
    }
    current.setDate(current.getDate() + 1);
  }
  return slots.slice(0, 5); // 最大5候補
}

ミドリ: 面接官のカレンダーを見て空いてるところを自動で拾うんですか!

タツヤ: そう。この候補をメールで送って、応募者が選んだら自動でカレンダーに予定を入れる。往復のメールラリーが不要になる。

ミドリ: あの「○日の△時はいかがですか?」「すみません、その日は……」のやり取りがなくなるんですね。

タツヤ: 日程調整だけで1件15〜30分かかってたのが、ほぼゼロになる。月30件なら月10時間以上の削減

ステップ4:面接評価シートの自動生成

ミドリ: 面接の評価シートも自動で作れるんですか?

タツヤ: Google Docsのテンプレートから自動生成する。面接が確定した時点で、応募者情報を埋め込んだ評価シートが面接官に共有される。

function createEvaluationSheet(applicantData) {
  const templateId = 'テンプレートのドキュメントID';
  const template = DriveApp.getFileById(templateId);
  const folder = DriveApp.getFolderById('評価シート保存先フォルダID');

  // テンプレートをコピー
  const docName = `面接評価_${applicantData.name}_${applicantData.position}`;
  const copy = template.makeCopy(docName, folder);
  const doc = DocumentApp.openById(copy.getId());
  const body = doc.getBody();

  // プレースホルダーを置換
  body.replaceText('{{応募者名}}', applicantData.name);
  body.replaceText('{{応募ポジション}}', applicantData.position);
  body.replaceText('{{面接日時}}', applicantData.interviewDate);
  body.replaceText('{{面接官}}', applicantData.interviewer);

  doc.saveAndClose();

  // 面接官に共有
  copy.addEditor(applicantData.interviewerEmail);
  return copy.getUrl();
}

ミドリ: 評価項目のテンプレートを1回作れば、あとは自動で量産されるわけですね。

タツヤ: テンプレートには「技術力(5段階)」「コミュニケーション力(5段階)」「カルチャーフィット(5段階)」みたいな評価軸を入れておく。面接官は評価を記入するだけ。記入が完了したら、スコアが自動で管理スプレッドシートに反映される。

ステップ5:合否通知の自動送信

ミドリ: 合否の連絡も自動化できますか?

タツヤ: できる。管理シートのステータスを「内定」や「不採用」に変更したら、自動でメールが送られる仕組みを作る。

function onStatusChange(e) {
  const sheet = e.source.getActiveSheet();
  const range = e.range;

  // ステータス列(F列)の変更を監視
  if (range.getColumn() !== 6) return;

  const row = range.getRow();
  const status = range.getValue();
  const name = sheet.getRange(row, 3).getValue();
  const email = sheet.getRange(row, 4).getValue();
  const position = sheet.getRange(row, 5).getValue();

  if (status === '内定') {
    sendOfferEmail(name, email, position);
  } else if (status === '不採用') {
    sendRejectionEmail(name, email, position);
  }
}

ミドリ: ステータスをプルダウンで変えるだけでメールが飛ぶんですね。

タツヤ(thinking): ただし注意点がある。不採用通知は送信前に確認ステップを入れること。操作ミスで誤送信したら取り返しがつかない。

ミドリ: それは怖い。確認ダイアログを出すとか?

タツヤ: そう。Browser.msgBox() で確認を挟むか、「送信予約」状態にして翌営業日の朝に一括送信する仕組みにするのが安全。

ステップ6:入社手続きの自動化

ミドリ: 内定が決まった後の手続きも自動化できますか?

タツヤ: 入社手続きのワークフローも組める。ステータスが「内定承諾」に変わったら、以下が自動実行される。

  1. 入社書類テンプレートの生成 — 雇用契約書、秘密保持契約書、各種届出書のテンプレートをGoogle Docsで自動生成
  2. 社内通知 — 受入部署の管理者にSlackまたはメールで通知
  3. タスクリストの作成 — 「PCの手配」「アカウント作成」「座席の準備」などのチェックリストをスプレッドシートに自動生成
  4. ウェルカムメールの送信 — 入社日・持ち物・初日のスケジュールを案内

ミドリ: 入社手続きの漏れがなくなりますね。新入社員が初日に「PC届いてません」とかならずに済む。

タツヤ: それは実際によくあるトラブル。チェックリストの自動化だけでも導入する価値がある。

個人情報の取り扱い:プライバシー対策

ミドリ: 応募者の個人情報をスプレッドシートで管理して大丈夫なんですか?

タツヤ: いい指摘。個人情報保護は最優先事項。以下の対策を必ず入れること。

対策実装方法
アクセス制限スプレッドシートの共有設定を採用チームのみに限定
閲覧ログGASでシートの閲覧・編集ログを記録
データ保持期限不採用者のデータは選考終了後6ヶ月で自動削除
データ暗号化機微情報(住所・電話番号)は別シートに分離管理
同意管理応募フォームにプライバシーポリシーへの同意チェックを設置

タツヤ: 特にデータの自動削除は重要。GASの時限トリガーで「選考終了から6ヶ月経過した行を自動削除」するスクリプトを組んでおく。

function deleteExpiredData() {
  const sheet = SpreadsheetApp.getActiveSpreadsheet()
    .getSheetByName('応募者管理');
  const data = sheet.getDataRange().getValues();
  const sixMonthsAgo = new Date();
  sixMonthsAgo.setMonth(sixMonthsAgo.getMonth() - 6);

  // 下の行から削除(行番号がずれないように)
  for (let i = data.length - 1; i >= 1; i--) {
    const status = data[i][5]; // ステータス列
    const updatedAt = new Date(data[i][1]); // 応募日列
    if ((status === '不採用' || status === '辞退') && updatedAt < sixMonthsAgo) {
      sheet.deleteRow(i + 1);
    }
  }
}

ミドリ: 法令遵守も自動化できるのは心強いですね。

導入効果の試算

ミドリ: 全部導入すると、どれくらい効果がありますか?

タツヤ: 月30名の応募がある企業で試算してみよう。

業務導入前(月間)導入後(月間)削減時間
応募受付・転記5時間0時間(完全自動)5時間
受領確認メール2.5時間0時間(完全自動)2.5時間
面接日程調整10時間1時間(例外対応のみ)9時間
評価シート作成3時間0時間(完全自動)3時間
合否通知2.5時間0.5時間(確認のみ)2時間
入社書類準備3時間0.5時間(確認のみ)2.5時間
合計26時間2時間24時間

ミドリ: 月24時間の削減! まるまる3営業日分じゃないですか。

タツヤ: しかも削減されるのは「単純作業」の時間。その分、採用担当者は「候補者との面談」「採用戦略の立案」「エンゲージメント向上」といった本来の仕事に集中できるようになる。

ミドリ: ミスも減りますよね。宛名間違いとか、連絡漏れとか。

タツヤ(confused): 実際、手作業でのヒューマンエラーは月2〜3件発生してるのが一般的。自動化すればそれがゼロになる。採用における企業の信頼性にも直結する話だよ。

まとめ:採用DXの第一歩はGASから

ミドリ: 今日の話をまとめるとどうなりますか?

タツヤ: GASを使えば、採用業務の事務作業の90%以上を自動化できる。しかもGoogle Workspace内で完結するから、新しいツールの導入コストも学習コストもゼロ。

ミドリ(smiling): 「採用管理システム(ATS)を導入するほどの規模じゃないけど、手作業は限界」っていう会社にぴったりですね。

タツヤ: まさにそう。月額数万円のATSを契約する前に、GASで同等のことができないか検討する価値は十分ある。特に年間採用50名以下の企業なら、GASで十分だよ。

ミドリ: まずはどこから始めればいいですか?

タツヤ: 3ステップで進めよう。

  1. 応募フォーム + 管理スプレッドシート + 自動返信メール — これだけで即日効果が出る
  2. 面接日程の自動調整 — カレンダー連携を追加。最大の時間削減ポイント
  3. 評価シート・合否通知・入社手続き — 段階的に自動化の範囲を広げる

次のアクション

採用業務の自動化を始めましょう。