毎日の副業日報をLINEで自動通知するツールを開発しました

副業を始めたものの、「毎日続けるのがしんどい」「自分がどれくらい頑張っているのか実感が湧かない…」と悩んでいませんか? 本業が終わった後の作業は、モチベーションの維持が本当に難しいですよね。

私自身も同じ悩みを抱えていたため、日々のモチベーションを保つ仕組みとして「毎日の副業日報をLINEで自動通知するツール」を自作しました!
メールアドレスでの通知も検討したのですが、「LINEで通知が来たらちょっとテンション上がるかなぁ」と思ったので、ちょっと設定自体が面倒なのですがLINEで通知が来るように構築してみました。

使い方はとても簡単です。1日の終わりにGoogleフォームへ作業時間を入力するだけで、スプレッドシートにダッシュボード(グラフ)が全自動で作成され、さらにLINEへ今日の頑張りが通知される仕組みになっています。
Googleフォームはスマホからでも入力できますので、パソコンの入力が面倒な方にはお勧めです。

▼完成形はこんな感じです!

入力項目はとてもシンプル。
日付、作業カテゴリー、作業時間、一言メモを入力して送信するのみ。
項目自体は自由にカスタマイズできるので、自分が残しておきたい項目を追加するのもOKです!


ダッシュボードのキャプチャです。
こちらの作りもあまり複雑にはしていません。
今日の作業時間と今月の作業時間はメッセージで送信するのに必要な項目です。
後はカテゴリごとの作業時間と1週間の作業時間を表した表とグラフです。グラフで表示されるとなんかやってる感が出ていい感じじゃないですか??(笑)


こちらは1日の最後に受信するメッセージです。
(受信時間が15時台なのは送信テストをした時間なので、あまり気にしないでください汗)
メッセージ内では、今日の作業時間と今月の累計時間をお知らせしてくれます。最後に自分が元気が出そうなメッセージを付け加えてください。
当然ですが、こちらも好きなようにカスタマイズできます。
副業始めたての方は作業時間のみでOKだと思いますが、だんだん収益が出てきた場合は日報の中に売上とかも入れていきたいですよね?? なのでその際は今日の売り上げや今月の売上とかも入れていけるといいなぁと思っています。


今回は、プログラミングの知識が全くない方でも、「コードをコピペするだけ」で簡単にこのツールを構築できる手順を完全無料で公開します。
三日坊主を卒業したい方は、ぜひ一緒に作って毎日の作業を「見える化」してみてください

目次

このツールで出来ること・すごいところ

  • 入力は数秒: スマホからでもGoogleフォームでサクッと入力できる!
  • プロ級のダッシュボード: 分を入力するだけで「時間(h)」に自動変換。直近7日間の推移グラフや、カテゴリ別の円グラフが全自動で生成される!
  • 毎日LINEに通知: 日々の累計時間が送られてくるから「明日もやらなきゃ!」という気持ちになる。

準備するもの

  • Googleアカウント(無料)
  • LINEアカウント(スマホとPC)
  • 継続するぞ!というやる気

【完全図解】作業時間管理&LINE通知ツールの作り方

STEP1:入力口(Googleフォーム)の作成

1.Googleフォームを新規作成し、以下の質問を正確に設定します。(※文字のズレを防ぐため、カテゴリ名はこの通りに設定してください)

■日付: [日付]
■作業カテゴリー: [プルダウン]
 ・その他
 ・ブログ構築
 ・物販対応
 ・ツール開発
■本日の作業時間(分): [記述式] (※回答の検証で「数値」のみに設定)
 ・※入力は「分(例: 90)」で行いますが、ダッシュボード上では自動的に「時間(例: 1.5h)」に変換されます!
■ひとことメモ: [記述式]

2.画面上部の「回答」タブを開き、「スプレッドシートにリンク」をクリックして、「新しいスプレッドシートを作成」します。

STEP2:LINE Messaging APIの準備

1.LINE Developers にログインします。(※英語の場合は右上の地球儀マークから日本語に変更してください。)


2.「プロバイダー」を作成し、「Messaging API」のチャネルを作成します。
 (ログイン方法やアカウント作成方法など、具体的な手順は割愛しますね。。。)


3.チャネルの「チャネル基本設定」タブの一番下にある「あなたのユーザーID(Uから始まる文字列)」をコピーしてメモしておきます。
(※注意:IDが表示されない場合は、LINE Official Account Managerの右上のアカウント設定からビジネスID設定を選択し個人のLINEアカウントと連携してください。)
(私は自分のLINEアカウントの連携に1時間くらいかかってしまいました汗。項目を見つけられなかった。。)


4.「Messaging API設定」タブを開き、一番下の「チャネルアクセストークン(長期)」を発行してコピーし、メモしておきます。


5.同じ画面にあるQRコードをスマホで読み込み、作成したBotを「友だち追加」しておきます。


STEP3:Geminiで作成した全自動コード(GAS)をコピペ

ここからスクリプトの作成になるんですが、発信の中でも言っている通り、私自身はプログラミングができませんので、今回もすべてGeminiに作ってもらいました。悪しからず。。

  1. 先ほど作成したスプレッドシートのメニューから「拡張機能」>「Apps Script」をクリックします。
  2. 開いた画面(コード.gs)に元からある文字をすべて消し、以下のコードをそのまま貼り付けます。
// =========================================================
// ① LINE通知用のプログラム
// =========================================================
function sendLineNotification() {
  const ss = SpreadsheetApp.getActiveSpreadsheet();
  const sheet = ss.getSheetByName('ダッシュボード');
  
  // B1: 今日の合計, B2: 今月の合計
  const todayTime = sheet.getRange('B1').getValue(); 
  const monthTime = sheet.getRange('B2').getValue(); 
  
  // 【注意】ご自身のトークンとIDに書き換えてください
  const channelToken = '【ここにチャネルアクセストークンを貼り付け】';
  const userId = '【ここにあなたのユーザーIDを貼り付け】';
  
  const messageText = `お疲れ様です!\n本日の副業作業時間は【${todayTime}時間】です。\n今月の累計は【${monthTime}時間】になりました。\n明日もコツコツ積み上げましょう!`;
  
  const url = 'https://api.line.me/v2/bot/message/push';
  const options = {
    'method': 'post',
    'headers': {
      'Content-Type': 'application/json',
      'Authorization': 'Bearer ' + channelToken
    },
    'payload': JSON.stringify({
      'to': userId,
      'messages': [{ 'type': 'text', 'text': messageText }]
    })
  };
  
  try {
    UrlFetchApp.fetch(url, options);
  } catch (e) {
    Logger.log('送信エラー: ' + e);
  }
}

// =========================================================
// ② ダッシュボード完全自動生成スクリプト
// =========================================================
function setupDashboard() {
  const ss = SpreadsheetApp.getActiveSpreadsheet();
  
  let dbSheet = ss.getSheetByName('ダッシュボード');
  if (!dbSheet) {
    dbSheet = ss.insertSheet('ダッシュボード');
  } else {
    dbSheet.clear();
    const charts = dbSheet.getCharts();
    for (let i = 0; i < charts.length; i++) {
      dbSheet.removeChart(charts[i]);
    }
  }

  // 1. 今日の作業時間と今月の累計(A1〜B2セル)
  dbSheet.getRange("A1:A2").setValues([["今日の作業時間(h)"], ["今月の累計時間(h)"]]);
  dbSheet.getRange("A1:A2").setBackground("#fff2cc").setFontWeight("bold");
  
  dbSheet.getRange("B1").setFormula(`=SUMIFS('フォームの回答 1'!D:D, 'フォームの回答 1'!B:B, TODAY())/60`);
  dbSheet.getRange("B2").setFormula(`=SUMIFS('フォームの回答 1'!D:D, 'フォームの回答 1'!B:B, ">="&DATE(YEAR(TODAY()),MONTH(TODAY()),1))/60`);
  dbSheet.getRange("B1:B2").setFontSize(14).setFontWeight("bold");
  dbSheet.getRange("B1:B2").setNumberFormat("0.0"); 

  // 2. カテゴリ別割合データ(D1〜E5セル)
  dbSheet.getRange("D1:E1").setValues([["カテゴリ", "作業時間(h)"]]);
  dbSheet.getRange("D1:E1").setBackground("#cfe2f3").setFontWeight("bold");
  
  const categories = [
    { name: "1. ブログ構築", keyword: "ブログ構築" },
    { name: "2. 物販対応", keyword: "物販対応" },
    { name: "3. ツール開発", keyword: "ツール開発" },
    { name: "4. その他", keyword: "その他" }
  ];
  
  for (let i = 0; i < categories.length; i++) {
    let row = i + 2;
    dbSheet.getRange(`D${row}`).setValue(categories[i].name);
    dbSheet.getRange(`E${row}`).setFormula(`=SUMIF('フォームの回答 1'!C:C, "*${categories[i].keyword}*", 'フォームの回答 1'!D:D)/60`);
  }
  dbSheet.getRange("E2:E5").setNumberFormat("0.0"); 

  // 3. 直近7日間の推移データ(G1〜H8セル)
  dbSheet.getRange("G1:H1").setValues([["日付", "作業時間(h)"]]);
  dbSheet.getRange("G1:H1").setBackground("#d9ead3").setFontWeight("bold");
  
  for (let i = 0; i < 7; i++) {
    let row = i + 2;
    let daysAgo = 6 - i;
    dbSheet.getRange(`G${row}`).setFormula(`=TODAY()-${daysAgo}`);
    dbSheet.getRange(`G${row}`).setNumberFormat("mm/dd");
    dbSheet.getRange(`H${row}`).setFormula(`=SUMIFS('フォームの回答 1'!D:D, 'フォームの回答 1'!B:B, G${row})/60`);
  }
  dbSheet.getRange("H2:H8").setNumberFormat("0.0"); 

  // 4. 直近7日間の棒グラフを作成
  const barChart = dbSheet.newChart()
    .asColumnChart()
    .addRange(dbSheet.getRange("G1:H8"))
    .setPosition(10, 1, 0, 0)
    .setOption('title', '直近7日間の作業推移')
    .setOption('legend', {position: 'none'})
    .build();
  dbSheet.insertChart(barChart);

  // 5. カテゴリ別円グラフを作成
  const pieChart = dbSheet.newChart()
    .asPieChart()
    .addRange(dbSheet.getRange("D1:E5"))
    .setPosition(10, 9, 0, 0) 
    .setOption('title', '作業カテゴリ割合(全期間)')
    .setOption('legend', {position: 'right', textStyle: {fontSize: 14}})
    .setOption('pieSliceText', 'percentage') 
    .build();
  dbSheet.insertChart(pieChart);
}
  1. コード上部の 【ここにチャネルアクセストークンを貼り付け】【ここにあなたのユーザーIDを貼り付け】 の部分を、ステップ2でメモしたものに書き換えます。
  2. 「保存(フロッピーアイコン)」をクリックします。

補足ですが、こちらのスクリプト、実行内容が2種類あって、1個目がメッセージを配信するプログラム。2個目がダッシュボードを作成するプログラムです。基本的に毎日自動実行させるプログラムはメッセージを配信するプログラムの方です。ダッシュボードを作製するプログラムは最初の一回のみ実行させればOK!のはずです。(バグがあったらごめんなさい)

STEP4:ダッシュボードの自動生成

  1. エディタ画面上部の関数を選択するドロップダウン(実行ボタンの左側)から、setupDashboard を選択します。
  2. 「実行」 をクリックします。
    ※初回のみ「承認が必要です」という警告が出ます。
    「権限を確認」→「自分のアカウント選択」→「詳細」→「〇〇(安全ではないページ)に移動」→「許可」
    と進んでください。
  3. スプレッドシートに戻ると、グラフ付きの綺麗なダッシュボードが一瞬で完成しています!

STEP5:LINE通知のテストと毎日の自動化設定

  1. Apps Scriptのエディタ画面に戻り、今度はドロップダウンから sendLineNotification を選択して「実行」をクリックします。
  2. スマホのLINEに通知が届けば大成功です!
  3. 最後に、画面左側の時計マーク(トリガー)をクリックし、「トリガーを追加」から「毎日指定した時間(例:午後10時〜11時)」に sendLineNotification が実行されるように設定して、すべて完了です!お疲れ様でした!

よくある質問・トラブルシューティング

  • Q. LINEの「ユーザーID」が表示されません!
    • A. 画面右上のアカウント設定から、個人のLINEアカウントと連携(ログイン)すると表示されます。
  • Q. LINEにメッセージは来るのに、スマホの通知音が鳴りません!
    • A. PC版のLINEを開きっぱなしにしていると、スマホ側で通知が鳴らない仕様になっています。PC版を閉じるか、設定を変更してみてください。
  • Q. カテゴリの円グラフが0のまま反映されません…
    • A. フォーム側のカテゴリ名と、GASのコード内のカテゴリ名にスペースなどのズレがないか確認してください。(※マニュアル通りに進めればズレは起きないようにコードを工夫しています!)

まとめ:ツールは補助!最後は毎日の積み上げがすべて

いかがでしたでしょうか?今回は毎日の副業を習慣化するためのLINE通知ツールを開発・公開しました。

「時間が可視化される」「毎日LINEでリマインドされる」というだけで、驚くほど副業に対するモチベーションは変わります。 ただ、ツールはあくまで補助輪です。最後は「毎日10分でもいいから机に向かう」というあなた自身の行動にかかっています。

この記事が、あなたの副業を習慣化するきっかけになれば嬉しいです。 今日から一緒に、毎日の作業をコツコツ積み上げていきましょう!


最後に、日報入力画面のサンプルのリンクを下に貼りつけておきますね。実物があるとイメージ付きやすいと思うので。

これからもGeminiを使っていろんなツールを作っていきたいと思っていますので、「こんなツールがあったらいいな」というご意見やアイデアがありましたらコメントください!!
よろしくお願いします。

この記事が気に入ったら
フォローしてね!

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!

著者

本業は社内SEとして働き、その傍らネットビジネスに取り組んでいます。副業を実践する中で身に付けたスキルや思考方法など、読者の皆さまのためになる情報をどんどん発信していきます!一緒に副業ライフを楽しんでいきましょう~♪

コメント

コメントする

目次