子どもが小学生と中学生になってから、スケジュール管理がつらい。
早々につらい事には気づいて、「自分たちでカレンダーちゃんと確認してね!」を繰り返していたけれど、塾の振替2回忘れる&部活朝練忘れる。という事をやらかし、何かアイディアはないものかと思案。
とりあえず、GASを使ってGoogleカレンダーの予定を毎日LINEにつぶやくbotを作成しました。
ざっくり流れ
- LINE Developersで「チャネル(Bot)」を作成
- Google Apps Script(または外部サーバー)でMessaging APIにPOSTリクエスト
- そのBotをLINEグループに招待すれば、グループにも投稿可能
必要なもの
- LINE Developersアカウント(無料)
- Bot用LINE公式アカウント(無料で作成可能)
- Google Apps Script でのスクリプト作成
🪄 ステップバイステップ:連携方法
LINE公式アカウントを無料で作成する
- LINE公式アカウント マネージャー にアクセス
- LINEログイン
- 「アカウント作成」→以下を入力
- アカウント名:例)「スケジュール通知Bot」
- 業種:「個人」や「教育」など(なんでもOK)
- メールアドレス登録
📌 無料プランでOKです。
LINE Developersでチャネル作成
- LINE Developersにアクセス
- 「プロバイダー」作成(例:
家族通知用
) - 新規チャネル →「Messaging API」
- ここで、先ほど作ったLINE公式アカウントと連携する
✅ この時点で、Messaging APIチャネルが作成できるようになります
LINE Developersでプロバイダー作成
- LINE Developers にアクセス
- 左メニューの「プロバイダーを作成」
- 名前は「家族用通知Bot」などでOK
- プロバイダーを選択し、「チャネルを作成」
Messaging API チャネルの作成
- 「チャネルを作成」→「Messaging API」を選択
- 下記を入力:
- チャネル名:例「スケジュール通知Bot」
- チャネル説明:任意
- チャネルアイコン:任意
- メールアドレス:LINE公式アカウントで使ったものと同じでもOK
- 業種・カテゴリ:任意で選択
連携するLINE公式アカウントの選択
- チャネル作成中に、以下の画面が出ます:
「LINE公式アカウントを連携してください」
- 画面内の一覧から、先ほど作成した公式アカウントを選びます
(ここに出てこない場合は、同じLINEアカウントで公式アカウントを作っているか確認) - 「このアカウントを利用する」ボタンをクリック
- 規約に同意 → 「作成」
✅ LINE Developersの設定手順(Messaging API Bot用)
Webhook利用をONにする
チャネルを開いた状態で「Messaging API設定」タブへ
- 下の方にある
▶ Webhookの利用 → 「利用する」に切り替える(✅ON)
応答モードを「チャット」→「Webhookのみ」に変更
- LINE Official Account Managerにログイン
👉 https://manager.line.biz/ - 対象アカウントを選択
- 左メニュー「応答設定」へ移動
- 応答モード:Bot(Webhook) を選択(💡「チャット」ではなく「Bot」)
- 「Webhookの送信」→ ✅オンにする
自動応答メッセージをOFFにする(勝手にしゃべらないようにする)
- 同じ「応答設定」画面の下の方
- 「あいさつメッセージ」→「OFF」
- 「応答メッセージ」→「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);
}
📌 公開設定:
- メニュー「デプロイ」→「新しいデプロイ」
- タイプ:ウェブアプリ
- 実行する関数:
doPost
- アクセス権:全員(匿名ユーザー)
- URLをコピー(Webhook URLとして使う)
🔹② LINE DevelopersにWebhook URLを設定
- LINE Developersのチャネル設定画面に戻る
- 「Messaging API設定」タブへ
- 「Webhook送信」→ 有効
- 「Webhook URL」→ 上記のGASのURLを貼り付け
- 「検証」ボタン → 成功するはずです
🔹③ LINEグループにBotを招待し、メッセージを送る
- 家族のLINEグループにBotを招待
- 上記コードをGASにコピペして「保存」
- LINEグループにBotがいることを確認
- グループで「おはよう」などメッセージを送る
- GAS画面で
checkGroupId()
を実行 - 「表示 → ログ」を開くと groupId が見える!
✅ ログに次のような内容が出ます:
Type: group
ID: Cbxxxxxxxxxxxxxxxxxxxx
Error: null
→ この groupId をメモしておいてください!
✍️ 使い方
LINE_GROUP_ID
にCbxxxxxxxx...
を貼るCHANNEL_ACCESS_TOKEN
は LINE Developers のMessaging API設定画面 からコピー- idに家族のGoogleカレンダーidを設定
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 を開く
- https://script.google.com/
- 対象のプロジェクト(予定を送るBotのスクリプト)を開く
② メニューから「トリガー」を開く
- 右側の🔔「トリガー」アイコン、または
上部メニューから
📁「拡張機能」→「Apps Script のトリガー」
③ 新しいトリガーを作成
- 右下の「+ トリガーを追加」ボタンをクリック
- 以下のように設定:
項目 | 設定内容 |
---|---|
実行する関数を選択 | sendTodayAndTomorrowEventsFromMultipleCalendars (または該当関数) |
デプロイの種類 | 「Head」 |
イベントのソース | 「時間主導型」 |
時間ベースのトリガーのタイプ | 「日付ベースのタイマー」 |
時刻 | 「午前7時〜8時」など(希望の時間帯) |
エラー通知(任意) | 必要に応じてメール通知を設定 |
④ 保存 → トリガーが追加される
- 正常に追加されれば、一覧に表示されます
- トリガーは毎日自動で実行されるようになります
💡補足:トリガーの実行テスト方法
- コード編集画面上で関数
sendTodayAndTomorrowEventsFromMultipleCalendars
を選択 - ▶ 実行ボタンを押して手動実行できる(LINEに即反映される)
コメント
こんにちは、これはコメントです。
コメントの承認、編集、削除を始めるにはダッシュボードの「コメント」画面にアクセスしてください。
コメントのアバターは「Gravatar」から取得されます。