スケジュール管理がつらい

子どもが小学生と中学生になってから、スケジュール管理がつらい。
早々につらい事には気づいて、「自分たちでカレンダーちゃんと確認してね!」を繰り返していたけれど、塾の振替2回忘れる&部活朝練忘れる。という事をやらかし、何かアイディアはないものかと思案。

とりあえず、GASを使ってGoogleカレンダーの予定を毎日LINEにつぶやくbotを作成しました。

ざっくり流れ

  1. LINE Developersで「チャネル(Bot)」を作成
  2. Google Apps Script(または外部サーバー)でMessaging APIにPOSTリクエスト
  3. そのBotをLINEグループに招待すれば、グループにも投稿可能

必要なもの

  • LINE Developersアカウント(無料)
  • Bot用LINE公式アカウント(無料で作成可能)
  • Google Apps Script でのスクリプト作成

🪄 ステップバイステップ:連携方法

LINE公式アカウントを無料で作成する

  1. LINE公式アカウント マネージャー にアクセス
  2. LINEログイン
  3. 「アカウント作成」→以下を入力
    • アカウント名:例)「スケジュール通知Bot」
    • 業種:「個人」や「教育」など(なんでもOK)
    • メールアドレス登録

📌 無料プランでOKです。

LINE Developersでチャネル作成

  1. LINE Developersにアクセス
  2. 「プロバイダー」作成(例:家族通知用
  3. 新規チャネル →「Messaging API」
  4. ここで、先ほど作ったLINE公式アカウントと連携する

✅ この時点で、Messaging APIチャネルが作成できるようになります

LINE Developersでプロバイダー作成

  1. LINE Developers にアクセス
  2. 左メニューの「プロバイダーを作成」
    • 名前は「家族用通知Bot」などでOK
  3. プロバイダーを選択し、「チャネルを作成」

Messaging API チャネルの作成

  1. 「チャネルを作成」→「Messaging API」を選択
  2. 下記を入力:
    • チャネル名:例「スケジュール通知Bot」
    • チャネル説明:任意
    • チャネルアイコン:任意
    • メールアドレス:LINE公式アカウントで使ったものと同じでもOK
    • 業種・カテゴリ:任意で選択

連携するLINE公式アカウントの選択

  1. チャネル作成中に、以下の画面が出ます:

「LINE公式アカウントを連携してください」

  1. 画面内の一覧から、先ほど作成した公式アカウントを選びます
     (ここに出てこない場合は、同じLINEアカウントで公式アカウントを作っているか確認)
  2. 「このアカウントを利用する」ボタンをクリック
  3. 規約に同意 → 「作成」

✅ LINE Developersの設定手順(Messaging API Bot用)

Webhook利用をONにする

チャネルを開いた状態で「Messaging API設定」タブへ

  1. 下の方にある
     ▶ Webhookの利用 → 「利用する」に切り替える(✅ON)

応答モードを「チャット」→「Webhookのみ」に変更

  1. LINE Official Account Managerにログイン
     👉 https://manager.line.biz/
  2. 対象アカウントを選択
  3. 左メニュー「応答設定」へ移動
  4. 応答モード:Bot(Webhook) を選択(💡「チャット」ではなく「Bot」)
  5. 「Webhookの送信」→ ✅オンにする

自動応答メッセージをOFFにする(勝手にしゃべらないようにする)

  1. 同じ「応答設定」画面の下の方
  2. 「あいさつメッセージ」→「OFF」
  3. 「応答メッセージ」→「OFF」

✅ これで連携完了です!🎉

🧩 ステップ:LINEグループIDを取得する方法

🔹① WebhookのURLを用意する

以下のスクリプトをGASに貼って、Webhookとして公開します。

📜 スクリプト(Webhook受信用)

function doPost(e) {
try {
if (!e.postData || !e.postData.contents) {
return ContentService.createTextOutput('NO CONTENT');
}

const contents = JSON.parse(e.postData.contents);
const source = contents.events[0].source;
const type = source.type;
const id = (type === 'group') ? source.groupId : source.userId;

// 保存しておく
PropertiesService.getScriptProperties().setProperty("LAST_SOURCE_TYPE", type);
PropertiesService.getScriptProperties().setProperty("LAST_SOURCE_ID", id);

return ContentService.createTextOutput('OK');
} catch (error) {
PropertiesService.getScriptProperties().setProperty("ERROR", error.toString());
return ContentService.createTextOutput("error");
}
}

function checkGroupId() {
const type = PropertiesService.getScriptProperties().getProperty("LAST_SOURCE_TYPE");
const id = PropertiesService.getScriptProperties().getProperty("LAST_SOURCE_ID");
const error = PropertiesService.getScriptProperties().getProperty("ERROR");

console.log("Type:", type);
console.log("ID:", id);
console.log("Error:", error);
}

📌 公開設定:

  1. メニュー「デプロイ」→「新しいデプロイ」
  2. タイプ:ウェブアプリ
  3. 実行する関数:doPost
  4. アクセス権:全員(匿名ユーザー)
  5. URLをコピー(Webhook URLとして使う)

🔹② LINE DevelopersにWebhook URLを設定

  1. LINE Developersのチャネル設定画面に戻る
  2. 「Messaging API設定」タブへ
  3. 「Webhook送信」→ 有効
  4. 「Webhook URL」→ 上記のGASのURLを貼り付け
  5. 「検証」ボタン → 成功するはずです

🔹③ LINEグループにBotを招待し、メッセージを送る

  1. 家族のLINEグループにBotを招待
  2. 上記コードをGASにコピペして「保存」
  3. LINEグループにBotがいることを確認
  4. グループで「おはよう」などメッセージを送る
  5. GAS画面で checkGroupId() を実行
  6. 「表示 → ログ」を開くと groupId が見える!

✅ ログに次のような内容が出ます:

Type: group
ID: Cbxxxxxxxxxxxxxxxxxxxx
Error: null

→ この groupId をメモしておいてください!

✍️ 使い方

  1. LINE_GROUP_IDCbxxxxxxxx... を貼る
  2. CHANNEL_ACCESS_TOKENLINE Developers のMessaging API設定画面 からコピー
  3. idに家族のGoogleカレンダーidを設定
  4. sendTodayAndTomorrowEvents() をGASから実行すれば即LINEに届く!
// ★LINEグループID(※実際のIDに差し替えてください)
const LINE_GROUP_ID = 'xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx';

// ★LINEチャネルアクセストークン(※Messaging APIから発行したものに差し替えてください)
const CHANNEL_ACCESS_TOKEN = 'YOUR_LINE_CHANNEL_ACCESS_TOKEN';

// ★通知対象のGoogleカレンダー設定
const CALENDAR_CONFIGS = [
  {
    id: 'your-family-calendar-id@group.calendar.google.com', // 📅 家族用カレンダーのID
    label: '📅ファミリー'
  },
  {
    id: 'child1-calendar-id@group.calendar.google.com', // 📅 子ども1人目
    label: '📅1人目の予定'
  },
  {
    id: 'child2-calendar-id@group.calendar.google.com', // 📅 子ども2人目
    label: '📅2人目の予定'
  }
];

// 📆 今日と明日の予定をまとめてLINE通知
function sendTodayAndTomorrowEventsFromMultipleCalendars() {
  const now = new Date();

  // 今日の範囲
  const todayStart = new Date(now);
  todayStart.setHours(0, 0, 0, 0);
  const todayEnd = new Date(todayStart);
  todayEnd.setDate(todayEnd.getDate() + 1);

  // 明日の範囲
  const tomorrowStart = new Date(todayEnd);
  const tomorrowEnd = new Date(tomorrowStart);
  tomorrowEnd.setDate(tomorrowEnd.getDate() + 1);

  const todayDateStr = Utilities.formatDate(todayStart, 'Asia/Tokyo', 'M月d日(E)');
  const tomorrowDateStr = Utilities.formatDate(tomorrowStart, 'Asia/Tokyo', 'M月d日(E)');

  let allMessages = [`おはようございます☀️`, `🗓️ ${todayDateStr}の予定`];

  // 🔹 今日の予定
  CALENDAR_CONFIGS.forEach(config => {
    const calendar = CalendarApp.getCalendarById(config.id);
    const todayEvents = calendar.getEvents(todayStart, todayEnd);

    if (todayEvents.length === 0) {
      allMessages.push(`${config.label}\n📭 予定はありません`);
    } else {
      const entries = todayEvents.map(event => {
        const time = Utilities.formatDate(event.getStartTime(), 'Asia/Tokyo', 'HH:mm');
        return `${time} ~ ${event.getTitle()}`;
      });
      allMessages.push(`${config.label}\n` + entries.join('\n'));
    }
  });

  // 🔹 明日の予定
  allMessages.push(`\n🗓️ ${tomorrowDateStr}の予定`);

  CALENDAR_CONFIGS.forEach(config => {
    const calendar = CalendarApp.getCalendarById(config.id);
    const tomorrowEvents = calendar.getEvents(tomorrowStart, tomorrowEnd);

    if (tomorrowEvents.length === 0) {
      allMessages.push(`${config.label}\n📭 予定はありません`);
    } else {
      const entries = tomorrowEvents.map(event => {
        const time = Utilities.formatDate(event.getStartTime(), 'Asia/Tokyo', 'HH:mm');
        return `${time} ~ ${event.getTitle()}`;
      });
      allMessages.push(`${config.label}\n` + entries.join('\n'));
    }
  });

  const finalMessage = allMessages.join('\n\n');
  sendLineMessage(finalMessage);
}

// 📤 LINEグループへメッセージ送信
function sendLineMessage(text) {
  const url = 'https://api.line.me/v2/bot/message/push';

  const payload = JSON.stringify({
    to: LINE_GROUP_ID,
    messages: [{
      type: 'text',
      text: text
    }]
  });

  const options = {
    method: 'post',
    headers: {
      'Content-Type': 'application/json',
      'Authorization': 'Bearer ' + CHANNEL_ACCESS_TOKEN
    },
    payload: payload
  };

  UrlFetchApp.fetch(url, options);
}

✅ トリガーの設定方法(時間になったら自動実行)

🔧 目的

例:毎日朝7:30に、GASから「今日と明日の予定」をLINEに送信

① Google Apps Script を開く

② メニューから「トリガー」を開く

  • 右側の🔔「トリガー」アイコン、または
     上部メニューから
     📁「拡張機能」→「Apps Script のトリガー」

③ 新しいトリガーを作成

  1. 右下の「+ トリガーを追加」ボタンをクリック
  2. 以下のように設定:
項目設定内容
実行する関数を選択sendTodayAndTomorrowEventsFromMultipleCalendars(または該当関数)
デプロイの種類「Head」
イベントのソース「時間主導型」
時間ベースのトリガーのタイプ「日付ベースのタイマー」
時刻「午前7時〜8時」など(希望の時間帯)
エラー通知(任意)必要に応じてメール通知を設定

④ 保存 → トリガーが追加される

  • 正常に追加されれば、一覧に表示されます
  • トリガーは毎日自動で実行されるようになります

💡補足:トリガーの実行テスト方法

  • コード編集画面上で関数 sendTodayAndTomorrowEventsFromMultipleCalendars を選択
  • ▶ 実行ボタンを押して手動実行できる(LINEに即反映される)

コメント

  1. こんにちは、これはコメントです。
    コメントの承認、編集、削除を始めるにはダッシュボードの「コメント」画面にアクセスしてください。
    コメントのアバターは「Gravatar」から取得されます。

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