課題
学校で欠席連絡をGoogleフォームで受け付けていると、回答はスプレッドシートに溜まっていくものの、担任が朝の忙しい時間に自分でスプレッドシートを開いて「今日の分」を目視で探す運用になりがちです。クラス数が増えるほど、
- 他クラスの回答に紛れて見落とす
- 開き忘れる日がある
- 「今日の分だけ」を毎回自分でフィルタする手間がかかる
といった問題が起きます。ここでは、フォーム回答から「今日提出された分」だけを自動抽出し、クラスごとに担任へメールで送る仕組みをGoogle Apps Script(GAS)で作ります。
最小の解
構成はシンプルです。
- 欠席連絡はGoogleフォーム→スプレッドシートに集約(Googleフォームのデフォルト連携をそのまま利用)
- 毎朝決まった時刻に時間主導型トリガーでスクリプトを実行
- スクリプトは「タイムスタンプが今日」の行だけを抽出し、クラスごとにグルーピングして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.jsonのtimeZone)が実際の運用時間帯とずれていると「今日」の判定がずれます。学校の所在地に合わせてAsia/Tokyoになっているか確認が必要です。 -
送信件数の上限:
GmailApp.sendEmailは個人のGoogleアカウントで1日あたり100通、Google Workspaceアカウントでは1日あたり1500通程度の上限があります(上限値はGoogle側の仕様変更で変わる可能性があるため、運用前に自分のアカウント種別で確認しておくと安心です)。クラス数が多い学校でも、クラス単位で1通ずつ送る設計であれば通常は上限に達しません。 -
クラス⇔メールアドレスの対応管理: コード内に直接
classEmailMapを書く方法は、クラス替えのたびにコードを編集する必要があり保守性が低くなります。クラス数が多い場合は、対応表を別シート(例:「担任マスタ」シート)に持たせてgetRange().getValues()で読み込む形にすると、非エンジニアでもスプレッドシート上でメンテナンスできます。
まとめ
欠席連絡フォームの「今日の分だけを見る」という毎朝の確認作業は、SpreadsheetAppでの日付フィルタとGmailAppでの送信、ScriptAppの時間主導型トリガーという標準APIの組み合わせだけで自動化できます。特別な外部サービスやAPIキーを用意する必要がなく、学校のGoogle Workspace環境であればそのまま応用しやすい構成です。まずは自分のクラスや学年単位の小さい範囲で動かしてみて、シート構成やタイムゾーンの差異を潰してから展開範囲を広げるのがおすすめです。
GASでの校務自動化について、今後も実装事例を書いていく予定です。よければフォローしてください。