0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

欠席連絡フォームの確認漏れを、GASで「集計→担任へメール」まで自動化する

0
Posted at

課題

学校で欠席連絡をGoogleフォームで受け付けていると、回答はスプレッドシートに溜まっていくものの、担任が朝の忙しい時間に自分でスプレッドシートを開いて「今日の分」を目視で探す運用になりがちです。クラス数が増えるほど、

  • 他クラスの回答に紛れて見落とす
  • 開き忘れる日がある
  • 「今日の分だけ」を毎回自分でフィルタする手間がかかる

といった問題が起きます。ここでは、フォーム回答から「今日提出された分」だけを自動抽出し、クラスごとに担任へメールで送る仕組みをGoogle Apps Script(GAS)で作ります。

最小の解

構成はシンプルです。

  1. 欠席連絡はGoogleフォーム→スプレッドシートに集約(Googleフォームのデフォルト連携をそのまま利用)
  2. 毎朝決まった時刻に時間主導型トリガーでスクリプトを実行
  3. スクリプトは「タイムスタンプが今日」の行だけを抽出し、クラスごとにグルーピングしてGmailApp.sendEmailで担任に送信

新しいツールやAPIキーは不要で、標準のSpreadsheetApp / GmailApp / ScriptAppだけで完結します。

コード

フォームの回答シートの列は「タイムスタンプ / クラス / 氏名 / 欠席理由」を想定しています。

function sendDailyAbsenceSummary() {
  const ss = SpreadsheetApp.getActiveSpreadsheet();
  const sheet = ss.getSheetByName('フォームの回答 1');
  const data = sheet.getDataRange().getValues();
  const header = data[0];

  const timestampCol = header.indexOf('タイムスタンプ');
  const classCol = header.indexOf('クラス');
  const nameCol = header.indexOf('氏名');
  const reasonCol = header.indexOf('欠席理由');

  const today = new Date();
  today.setHours(0, 0, 0, 0);

  const rowsToday = data.slice(1).filter(row => {
    const ts = new Date(row[timestampCol]);
    ts.setHours(0, 0, 0, 0);
    return ts.getTime() === today.getTime();
  });

  if (rowsToday.length === 0) return;

  const byClass = {};
  rowsToday.forEach(row => {
    const className = row[classCol];
    if (!byClass[className]) byClass[className] = [];
    byClass[className].push(`${row[nameCol]}${row[reasonCol]})`);
  });

  // クラス名→担任メールアドレスの対応。クラス数が多い場合はマスタシート化を推奨(後述)
  const classEmailMap = {
    '1組': 'teacher1@example.com',
    '2組': 'teacher2@example.com'
  };

  Object.keys(byClass).forEach(className => {
    const to = classEmailMap[className];
    if (!to) return;
    const body = byClass[className].join('\n');
    GmailApp.sendEmail(to, `【本日の欠席連絡】${className}`, body);
  });
}

このスクリプトを毎朝自動実行するトリガーを、コードから登録しておきます(スクリプトエディタの「トリガー」画面から手動で設定しても構いません)。

function createDailyTrigger() {
  ScriptApp.newTrigger('sendDailyAbsenceSummary')
    .timeBased()
    .atHour(7)
    .nearMinute(50)
    .everyDays(1)
    .create();
}

createDailyTrigger は初回セットアップ時に1回だけ実行すれば、以降は毎朝7:50前後に sendDailyAbsenceSummary が自動実行されます。

なお、このコードは新規のGoogle Apps Scriptプロジェクトでの実行確認は行っていません。ご自身のフォーム・シートの列構成に合わせて、列名(タイムスタンプ クラス 氏名 欠席理由)とシート名(フォームの回答 1)を実際の環境に置き換えてお使いください。

つまずきポイント

  • シート名がずれる: Googleフォームと連携したスプレッドシートのデフォルトシート名は環境や作成順序によって変わることがあります。getSheetByName に渡す名前は実際のシート名と一致させる必要があります。
  • タイムゾーンのズレ: new Date() の日付比較は、スプレッドシートおよびスクリプトのタイムゾーン設定(プロジェクトの appsscript.jsontimeZone)が実際の運用時間帯とずれていると「今日」の判定がずれます。学校の所在地に合わせて Asia/Tokyo になっているか確認が必要です。
  • 送信件数の上限: GmailApp.sendEmail は個人のGoogleアカウントで1日あたり100通、Google Workspaceアカウントでは1日あたり1500通程度の上限があります(上限値はGoogle側の仕様変更で変わる可能性があるため、運用前に自分のアカウント種別で確認しておくと安心です)。クラス数が多い学校でも、クラス単位で1通ずつ送る設計であれば通常は上限に達しません。
  • クラス⇔メールアドレスの対応管理: コード内に直接 classEmailMap を書く方法は、クラス替えのたびにコードを編集する必要があり保守性が低くなります。クラス数が多い場合は、対応表を別シート(例:「担任マスタ」シート)に持たせて getRange().getValues() で読み込む形にすると、非エンジニアでもスプレッドシート上でメンテナンスできます。

まとめ

欠席連絡フォームの「今日の分だけを見る」という毎朝の確認作業は、SpreadsheetAppでの日付フィルタとGmailAppでの送信、ScriptAppの時間主導型トリガーという標準APIの組み合わせだけで自動化できます。特別な外部サービスやAPIキーを用意する必要がなく、学校のGoogle Workspace環境であればそのまま応用しやすい構成です。まずは自分のクラスや学年単位の小さい範囲で動かしてみて、シート構成やタイムゾーンの差異を潰してから展開範囲を広げるのがおすすめです。


GASでの校務自動化について、今後も実装事例を書いていく予定です。よければフォローしてください。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?