はじめに
前回のブログでは、Googleフォームの申込情報をLINEグループへリアルタイムで通知する仕組みを紹介しました。
これにより、申込内容が即座に関係者へ届くようになり、初期の目的は達成できました。
しかし実際に運用してみると、以下のようなフィードバックが寄せられました。
これらの課題を解決するために、今回のアップデートでは通知タイミングを毎朝1回に変更し、前日分をまとめて送る方式に改良しました。
今回の改善内容
通知の変更点
通知対象 | 変更前 | 変更後 |
---|---|---|
LINE通知 | フォーム送信のたびに通知(リアルタイム) | 毎朝8:00に24時間分をまとめて通知 |
Slack通知は引き続きリアルタイムで行われる一方、LINE通知は業務開始時に確認できるようサマリー形式で配信されるようになりました。
通知メッセージの実例
実際にLINEグループへ送信されたメッセージは次のような内容です。
📩【申込通知】6月30日分の申込状況
■ 昨日8:00〜今朝7:59の申込(5件)
🔰 初心者(2名)
・○○小:1名
・△△小:1名
💡 経験者(3名)
・△△小:2名
・□□小:1名
■ 累計申込状況(20件)
・初心者:12名
・経験者:8名
・参加校:○○小、△△小、□□小
これにより、毎朝LINEグループでその日の申込状況を把握できるようになりました。
LINE通知の実装方法(概要)
この通知は、Google Apps Script(GAS)を使って実現しています。
処理の流れ
- Googleフォームの回答はスプレッドシートに自動蓄積される
- GASで、昨日8:00〜今朝7:59の申込データのみを抽出
- 希望コースごとに、学校別の人数をカウント
- 全体の累計申込件数と参加校を集計
- LINEのPush APIを使って、グループにメッセージを送信
- GASの時間トリガーを使い、毎朝8時にこの処理を実行
実装コード
function sendDailyLineReport() {
const sheet = SpreadsheetApp.getActiveSpreadsheet().getActiveSheet();
const data = sheet.getDataRange().getValues();
const headers = data[0];
const timestampCol = headers.indexOf("タイムスタンプ");
const courseCol = headers.indexOf("希望するコースを選んでください");
const schoolCol = headers.indexOf("参加者の学校名");
// ----- 時間範囲の定義 -----
const now = new Date();
const today = new Date(now.getFullYear(), now.getMonth(), now.getDate());
const startTime = new Date(today.getTime() - 16 * 60 * 60 * 1000); // 前日8:00
const endTime = new Date(today.getTime() + 7 * 60 * 60 + 59 * 60 * 1000 + 59 * 1000); // 当日7:59:59
let beginnerNew = 0, experiencedNew = 0;
let beginnerBySchool = {}, experiencedBySchool = {};
let beginnerTotal = 0, experiencedTotal = 0;
let schoolSet = new Set();
for (let i = 1; i < data.length; i++) {
const row = data[i];
const ts = new Date(row[timestampCol]);
const course = row[courseCol];
const school = row[schoolCol];
if (course.includes("初心者")) beginnerTotal++;
else if (course.includes("経験者")) experiencedTotal++;
schoolSet.add(school);
if (ts >= startTime && ts <= endTime) {
if (course.includes("初心者")) {
beginnerNew++;
beginnerBySchool[school] = (beginnerBySchool[school] || 0) + 1;
} else if (course.includes("経験者")) {
experiencedNew++;
experiencedBySchool[school] = (experiencedBySchool[school] || 0) + 1;
}
}
}
const reportDate = Utilities.formatDate(startTime, Session.getScriptTimeZone(), "M月d日");
let message = `📩【申込通知】${reportDate}分の申込状況\n\n`;
message += `■ 昨日8:00〜今朝7:59の申込(${beginnerNew + experiencedNew}件)\n\n`;
message += `🔰 初心者(${beginnerNew}名)\n`;
for (let s in beginnerBySchool) message += `・${s}:${beginnerBySchool[s]}名\n`;
message += `\n💡 経験者(${experiencedNew}名)\n`;
for (let s in experiencedBySchool) message += `・${s}:${experiencedBySchool[s]}名\n`;
message += `\n■ 累計申込状況(${beginnerTotal + experiencedTotal}件)\n`;
message += `・初心者:${beginnerTotal}名\n`;
message += `・経験者:${experiencedTotal}名\n`;
message += `・参加校:${Array.from(schoolSet).join("、")}\n`;
const url = 'https://api.line.me/v2/bot/message/push';
const options = {
method: "post",
contentType: "application/json",
headers: { Authorization: "Bearer " + ACCESS_TOKEN },
payload: JSON.stringify({
to: GROUP_ID,
messages: [{ type: "text", text: message }]
}),
};
UrlFetchApp.fetch(url, options);
}
※このコードは一例です。実際の列名・認証情報・GROUP_ID はご自身の環境に合わせて調整してください。
補足
- ACCESS_TOKEN と GROUP_ID の取得には、LINE Developers でのBot作成とグループ登録が必要です。
- GASエディタで上記関数を作成し、トリガーを「時間主導型」「毎日午前8時〜9時」に設定することで、定期通知が自動化されます。
- GASの「時間主導型」トリガーは、「8:00〜8:59」のどこかで実行されるので、集計時刻は具体的に指定する必要があります。

LINE API利用時の注意点
今回の実装には、LINE Messaging APIのPushメッセージ機能を使用しています。
詳細は LINE公式ドキュメント をご確認ください。
実装上の学び:broadcastとの違い
当初は broadcast API を使って通知しようとしましたが、LINEグループには正しく配信されませんでした。
これは、broadcastは「Botのフォロワー全員」に送る仕組みであり、グループ送信を保証しないためです。
今回のように、特定のグループにのみ通知を送りたい場合は push APIを使用するのが正解です。
導入効果と今後の展望
今後は以下のような機能強化も検討しています。
- 申込数が定員に近づいた際の自動アラート
- 特定の学校からの申込状況のハイライト通知
- LINE以外の通知チャネル(メール・Teamsなど)との連携
おわりに
LINEとGoogle Apps Scriptを組み合わせることで、ビジネス現場での柔軟な通知連携が実現できます。
「LINEはプライベート用途」という印象が強いですが、工夫すれば業務にも十分活用できることが分かりました。
同様の課題をお持ちの方の参考になれば幸いです!
コメント