1. はじめに
「夢をかなえるゾウ」を読んで課題を実践したいけど、なかなか続かない…そんな悩みを解決するために、毎朝LINEにランダムな課題を自動送信して、返信で記録できるBotを作りました。
完全無料で作れます。
2. 完成イメージ
毎朝8時
↓
LINEに「今日の課題」が届く
↓
課題をやってみる
↓
LINEに感想を返信 → Googleスプレッドシートに自動記録 🎉
3. 使用技術・サービス
| サービス | 用途 | 費用 |
|---|---|---|
| LINE Messaging API | メッセージ送受信 | 無料(月1000通まで) |
| Google Apps Script | 自動実行・Webhook処理 | 無料 |
| Google スプレッドシート | 課題記録 | 無料 |
4. セットアップ手順
Step 1|LINE公式アカウントを作成する
- LINE Developers にアクセスしてログイン
- プロバイダーを作成(例:
夢ゾウBot) - 「Messaging API」 をクリック
- 「LINE公式アカウントを作成する」ボタンをクリック(※2024年以降、直接チャンネル作成はできなくなりました)
- LINE Official Account Managerでアカウントを作成
注意: 現在はLINE DevelopersコンソールからMessaging APIチャンネルを直接作成できません。先にLINE公式アカウントを作成し、後からMessaging APIを有効化する必要があります。
Step 2|Messaging APIを有効化してトークンを取得する
- LINE Official Account Manager → 「設定」→「Messaging API」 → 「Messaging APIを利用する」
- プロバイダーを選択して連携
- LINE Developers に戻り、作成されたチャンネルをクリック
- 「Messaging API設定」タブ → 一番下までスクロール
- 「チャンネルアクセストークン(長期)」 の「発行」をクリック → メモ📝
Step 3|自分のLINE User IDを確認する
- LINE Developers → チャンネル → 「チャンネル基本設定」タブ
-
「あなたのユーザーID」 をメモ📝(
U30c49e...という形式) - 「Messaging API設定」タブのQRコードをスマホで読み取り、Botを友だち追加する
Step 4|応答設定を変更する
LINE Official Account Manager → 「設定」→「応答設定」 で以下に設定:
| 項目 | 設定 |
|---|---|
| Webhook | ON |
| 応答メッセージ | OFF |
| あいさつメッセージ | OFF(任意) |
Step 5|Google スプレッドシートを作成する
- Google スプレッドシート を新規作成
- ファイル名を任意で設定(例:
夢をかなえるゾウ 課題記録) - シート名(下部タブ)を任意の名前に設定(コードと合わせること)
Step 6|Google Apps Script にコードを貼り付ける
- スプレッドシートのメニュー → 「拡張機能」→「Apps Script」
- デフォルトのコードをすべて削除
- 以下のコードを貼り付け
- 冒頭の
LINE_TOKEN・MY_USER_ID・SHEET_NAMEを自分の情報に書き換える - Ctrl+S で保存
// ============================================================
// 夢をかなえるゾウ × LINE Bot
// Google Apps Script (GAS) コード
// ============================================================
const LINE_TOKEN = 'YOUR_CHANNEL_ACCESS_TOKEN'; // LINE Channel Access Token
const MY_USER_ID = 'YOUR_LINE_USER_ID'; // 自分の LINE User ID
const SHEET_NAME = 'シート名'; // スプレッドシートのシート名
// ============================================================
// 課題リスト(夢をかなえるゾウ 全課題)
// ============================================================
const TASKS = [
{ id: 1, title: '靴を磨く', detail: '今日、自分の靴を丁寧に磨いてみましょう。身だしなみへの意識が変わります。' },
{ id: 2, title: 'コンビニでお釣りを募金する', detail: 'コンビニのレジ横の募金箱に、お釣りの一部を入れてみましょう。' },
{ id: 3, title: '食事を腹八分目にする', detail: '今日の食事は、少し物足りないくらいで箸を置いてみましょう。' },
{ id: 4, title: '人の良いところを見つけて褒める', detail: '今日出会う人の良いところを一つ見つけて、言葉にして伝えてみましょう。' },
{ id: 5, title: '毎朝全力で掃除をする', detail: '今日の朝、いつもより丁寧に部屋を掃除してみましょう。' },
{ id: 6, title: '会った人を笑わせる', detail: '今日会う人を、一人でも笑顔にしてみましょう。' },
{ id: 7, title: 'トイレ掃除をする', detail: '今日、自宅や職場のトイレを丁寧に掃除しましょう。' },
{ id: 8, title: 'まず人のことを考える行動をひとつする', detail: '自分より先に、周りの誰かのために何か一つ行動してみましょう。' },
{ id: 9, title: '夢を楽しそうに語る', detail: '今日、誰かに自分の夢・目標を楽しそうに話してみましょう。' },
{ id: 10, title: '自分が一番大事にしているものを大切にする', detail: '今日、自分が大切にしている人やものに、改めて感謝の気持ちを示しましょう。' },
{ id: 11, title: 'ただでもらうのをやめる', detail: '今日、何かをもらったら必ず「お礼」か「お返し」を考えましょう。' },
{ id: 12, title: '決めたことを続けるための環境を作る', detail: '習慣化したいことを続けやすくする仕組みを一つ考えて実行しましょう。' },
{ id: 13, title: '毎朝、自分に期待する', detail: '今朝、鏡の前で「今日もやれる」と自分に声をかけてみましょう。' },
{ id: 14, title: '運が良いと口に出して言う', detail: '今日、「ラッキー!」「運がいい!」と声に出してみましょう。' },
{ id: 15, title: '人の成功をサポートする', detail: '今日、周りの誰かが成功できるよう、何か一つサポートしてみましょう。' },
{ id: 16, title: 'プロに頼む', detail: '今日、自分が苦手なことをプロ(専門家)に任せることを考えてみましょう。' },
{ id: 17, title: '自分の苦手なことを人に任せる', detail: '苦手な作業を誰かに頼み、自分は得意なことに集中しましょう。' },
{ id: 18, title: '自分の得意なことで人を助ける', detail: '今日、自分の強みやスキルを使って誰かの役に立ちましょう。' },
{ id: 19, title: '毎日の楽しみを作る', detail: '今日一日の中に、小さな楽しみを一つ意識して作りましょう。' },
{ id: 20, title: 'サービスとして自分を磨く', detail: '今日、相手が喜ぶことを一つ考えて実行してみましょう。' },
];
// ============================================================
// 毎朝送信:ランダムに課題を選んでLINEに送る
// ============================================================
function sendDailyTask() {
const sheet = getSheet();
const today = Utilities.formatDate(new Date(), 'Asia/Tokyo', 'yyyy/MM/dd');
const task = TASKS[Math.floor(Math.random() * TASKS.length)];
sheet.appendRow([today, task.id, task.title, '', '未完了', '']);
const message =
`🐘 今日の課題 (${today})\n\n` +
`📋 【${task.title}】\n\n` +
`${task.detail}\n\n` +
`✍️ やり終えたら何でも返信してね!\n` +
`感想や気づきも送ってくれると記録するよ😊`;
sendLineMessage(message);
}
// ============================================================
// Webhook受信:LINEからの返信を処理する
// ============================================================
function doPost(e) {
try {
const data = JSON.parse(e.postData.contents);
const events = data.events;
events.forEach(event => {
if (event.type === 'message' && event.message.type === 'text') {
const userMessage = event.message.text.trim();
handleReply(userMessage);
}
});
} catch (error) {
Logger.log('エラー: ' + error.toString());
}
return ContentService.createTextOutput('OK')
.setMimeType(ContentService.MimeType.TEXT);
}
// ============================================================
// 返信処理:何を返信しても完了+感想として記録
// ============================================================
function handleReply(message) {
const sheet = getSheet();
const today = Utilities.formatDate(new Date(), 'Asia/Tokyo', 'yyyy/MM/dd');
const data = sheet.getDataRange().getValues();
let targetRow = -1;
for (let i = data.length - 1; i >= 1; i--) {
const cellDate = Utilities.formatDate(new Date(data[i][0]), 'Asia/Tokyo', 'yyyy/MM/dd');
if (cellDate === today) {
targetRow = i + 1;
break;
}
}
if (targetRow === -1) {
sendLineMessage('今日の課題が見つかりませんでした。');
return;
}
// 何を返信しても完了+感想として記録
sheet.getRange(targetRow, 5).setValue('✅ 完了');
sheet.getRange(targetRow, 6).setValue(message);
sendLineMessage('🎉 完了!\n\n「' + message + '」\n\nを記録したよ!明日も頑張ろう💪');
}
// ============================================================
// LINE メッセージ送信(Push API)
// ============================================================
function sendLineMessage(text) {
const url = 'https://api.line.me/v2/bot/message/push';
const payload = {
to: MY_USER_ID,
messages: [{ type: 'text', text: text }]
};
const options = {
method: 'post',
contentType: 'application/json',
headers: { Authorization: 'Bearer ' + LINE_TOKEN },
payload: JSON.stringify(payload),
muteHttpExceptions: true
};
UrlFetchApp.fetch(url, options);
}
// ============================================================
// スプレッドシートの取得(シートがなければ自動作成)
// ============================================================
function getSheet() {
const ss = SpreadsheetApp.getActiveSpreadsheet();
let sheet = ss.getSheetByName(SHEET_NAME);
if (!sheet) {
sheet = ss.insertSheet(SHEET_NAME);
sheet.appendRow(['日付', '課題ID', '課題名', 'メモ', '状態', '感想・返信']);
sheet.getRange('1:1').setFontWeight('bold');
}
return sheet;
}
// ============================================================
// 手動テスト用
// ============================================================
function testSend() {
sendDailyTask();
}
Step 7|動作テストをする
- 関数選択ドロップダウンで 「testSend」 を選択
- 「▶ 実行」 をクリック
- 初回は権限承認が必要(「詳細」→「安全でないページに移動」→「許可」)
- LINEにメッセージが届いたら成功!
Step 8|Webhook URLを設定する
- GASエディタ → 「デプロイ」→「新しいデプロイ」
- 種類:「ウェブアプリ」
- 設定:
- 次のユーザーとして実行:自分
- アクセスできるユーザー:全員
- 「デプロイ」→ 表示されたURLをコピー
- LINE Developers → 「Messaging API設定」→ 「Webhook URL」 に貼り付け
- 「Webhookの利用」をONにする
注意: LINE DevelopersのWebhook「検証」ボタンで302エラーが出ることがありますが、実際の返信機能には影響ありません。無視してOKです。
Step 9|毎朝自動送信のトリガーを設定する
- GASエディタ左メニューの ⏱ アイコン(トリガー) をクリック
- 右下の 「トリガーを追加」 をクリック
- 以下のように設定して「保存」:
| 項目 | 設定値 |
|---|---|
| 実行する関数 | sendDailyTask |
| イベントのソース | 時間主導型 |
| タイプ | 日付ベースのタイマー |
| 時刻 | 好きな時間(例:午前8時〜9時) |
6. 使い方
返信は何でもOKです。課題をやった感想でも、一言でも、何でも返信すると自動で完了記録されます。
| 返信内容 | 動作 |
|---|---|
| 任意のテキスト | ✅ 完了として記録+感想欄に保存 |
7. ハマりポイントまとめ
1. Webhook検証で302エラーが出る
GASのウェブアプリはリダイレクトを返すため、LINEの検証ボタンでは常に302エラーになります。実際の動作には影響ないので無視してOKです。
2. デプロイ後のコード変更
コードを修正した後は必ず 「デプロイを管理」→「新バージョン」 で再デプロイが必要です。
3. LINE公式アカウントとDevelopersの連携
2024年以降、LINE DevelopersからMessaging APIチャンネルを直接作成できなくなりました。LINE Official Account Managerでアカウントを作成してからMessaging APIを有効化する手順が必要です。
8. 費用
完全無料で運用できます。
- LINE Messaging API:月1,000通まで無料(自分1人なら年365通なので余裕)
- Google Apps Script:無料枠内で十分
- Google スプレッドシート:無料
9. まとめ
これで毎朝8時に夢をかなえるゾウの課題がLINEに届き、何か返信するだけで記録される仕組みが完成です。
続けるコツはハードルを下げること。できなかった日も「できなかった」と返信するだけでOK。記録が続くこと自体が習慣になります。
夢をかなえるゾウの教えを実践できる環境、ぜひ作ってみてください🐘!