LINE通知をリアルタイムから日次サマリーへ変更!業務フローに合った通知タイミングへ改善

IT全般
スポンサーリンク

はじめに

前回のブログでは、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)を使って実現しています。

処理の流れ

  1. Googleフォームの回答はスプレッドシートに自動蓄積される
  2. GASで、昨日8:00〜今朝7:59の申込データのみを抽出
  3. 希望コースごとに、学校別の人数をカウント
  4. 全体の累計申込件数と参加校を集計
  5. LINEのPush APIを使って、グループにメッセージを送信
  6. 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メッセージ機能を使用しています。

  • Push APIは有料プランでの利用が前提です(Freeプランでは使えません)
  • 送信数はメンバー人数分カウントされるため、10人のグループに1通送ると「10通」として課金対象になります
  • メッセージ件数の月間上限(プランにより異なる)にも注意が必要です

詳細は LINE公式ドキュメント をご確認ください。

実装上の学び:broadcastとの違い

当初は broadcast API を使って通知しようとしましたが、LINEグループには正しく配信されませんでした。

これは、broadcastは「Botのフォロワー全員」に送る仕組みであり、グループ送信を保証しないためです。

今回のように、特定のグループにのみ通知を送りたい場合は push APIを使用するのが正解です。

導入効果と今後の展望

  • 関係者が朝イチでその日の申込状況を確認できるようになった
  • 通知の見逃しや埋もれがなくなり、対応ミスが減少
  • 通知数を1日1回に制限できたことで、LINE APIの利用上限にも余裕ができた

今後は以下のような機能強化も検討しています。

  • 申込数が定員に近づいた際の自動アラート
  • 特定の学校からの申込状況のハイライト通知
  • LINE以外の通知チャネル(メール・Teamsなど)との連携

おわりに

LINEとGoogle Apps Scriptを組み合わせることで、ビジネス現場での柔軟な通知連携が実現できます。

「LINEはプライベート用途」という印象が強いですが、工夫すれば業務にも十分活用できることが分かりました。

同様の課題をお持ちの方の参考になれば幸いです!

コメント

タイトルとURLをコピーしました