【不安解消】GASでLINEに日本株の1日の値動きを通知

お仕事おつにゃッス🐈

文系未経験から社内SEになった、あっきょ(@daily_code_JP)です!

あなたが持っている日本株の終値をアプリを開いて仕事中に確認するのは面倒くさいですよね。

しかし、GASとLINEを連携させれば好きな時間に株価を知らせるアプリの開発が可能。

忙しい仕事中でもLINEの通知をちらっと見るだけで保有株の株価を確認して安心できます。

この記事ではコピペOKのGoogle Apps Scriptのコードで解決します。

こんな人におすすめ!

  • もっと簡単に日本株の管理をしたい
  • 忙しい時でも株価が不安だから5秒で確認できるアプリが欲しい
  • プログラミングでJavaScriptを学んだけど何を作っていいかわからない

誰でも無料で簡単にできますので気軽に学んでいきましょう!

目次

LINEに株価を通知する完成イメージ

GASでLINEに日本株の1日の値動きを通知するアプリの完成イメージ

GASでLINEに日本株の終値を15時30分に通知するアプリを作成

あなたがサラリーマンなら、仕事途中でも株価が気になって作業に集中できない時もあるでしょう。

とくに保有株の株価は敏感になるでしょう。

そこでLINEの通知で終値をチラッと確認できるツールを作成します。

この記事で例に出した銘柄はあくまで例です。運営者が保有もしくは売買を推奨している株式ではありません。

日本株を取得してLINEに通知する方法

GASでLINEに日本株の1日の値動きを通知する方法

GASで日本株を取得するには「スクレイピング」というWeb上のデータを自動取得する技術を使用。

スプシにあらかじめ登録した株式のデータを反映してGoogleファイナンスからデータを取得します。s

株価を取得後に読みやすく加工してLINEに通知します。

【注意】アプリ作成の難易度は高め

注意しなければならないのは、このアプリの開発難易度は比較的高め。

理由は4つの技術を混ぜ合わせて開発するためです。

技術名詳細
現在の日付を取得Dateオブジェクトを使ってリアルタイムで日付を取得
スクレイピングWeb上の文字を自動で取得して株価を取得
LINE Notifyの使用無料かつ自動でLINEに株価を通知
トリガーの作成任意のタイミングでコードを実行するトリガーを作成

デイコーではコピペで試せるように開発しており基本的には問題ありません

しかし、コードの動きを一から見る場合はプログラミングの基礎的な知識が必要です。

あっきょ

コードも長めなので注意ッス!

LINEから株価を取得する準備

GASから米国株の情報を毎朝ラインに送信する準備をします。

準備物は2つ必要です。

必要なファイル

  • Google スプレッドシート…株式データの保存 & GASのプログラムの実行
  • LINE Notify…GASから株価を受信

LINE Notify の登録

LINE Notify のサイトにアクセスして緑色のバーの「ログイン」をクリック。

LINE Notify ログイン

LINEに登録している自身のメールアドレスとパスワードを入力。

LINEにログイン

ログイン後にトップページに戻るので、ユーザー名をクリックして「マイページ」を選びます。

LINE Notify マイページ

ページ下部の「トークンを発行する」をクリックします。

LINE Notify トークン発行

トークン名とトークルームを決めます。

トークン名を「test」、トークルームは「1:1でLINE Notifyから通知を受け取る」を選択して「発行する」をクリック。

LINE Notify トークン作成

トークンが発行されます。

画面を閉じるとトークンを二度と発行できないので必ずメモ。

LINE Notify の登録は以上です。

LINE Notify トークンのコピー

Google スプレッドシートの準備

日本株の管理をするシートを作成します。

「コード」と「会社名」の2項目を設定します。

シート名を「日本株」に変更します。

Google スプレッドシートの設定は以上です。

LINEに日本株の終値を通知するサンプルコード

Google Apps Scriptで日本株の終値をLINEに通知するサンプルコードの公開と解説します。

解説の項目

  • サンプルコード
  • A, 当日の日付を取得
  • B, スクレイピングで本日の終値を取得
  • C, スクレイピングで前日の終値を取得
  • D, LINEに日本株の終値を通知
  • E, 翌日分のトリガーを作成

サンプルコード

右上にあるマークを押すとコードのコピペが一瞬でできます。

コード内で文頭にアルファベットが付いているコメントごとに詳細を説明していきます。

//A, 当日の日付を取得
const today = new Date();
const monthNum = (today.getMonth())+1; //月
const dateNum = today.getDate(); //日
const day = today.getDay(); //曜日
const thisDate = monthNum + "月" + dateNum + "日";
const thisDay = ['日','月','火','水','木','金','土']; 

//B,スクレイピングで本日の終値を取得
function getPrice(code){
  let url = "https://www.google.com/finance/quote/" + code + ":TYO";
  const html = UrlFetchApp.fetch(url).getContentText();
  let stockPrice = Parser.data(html)
    .from('<div class="YMlKec fxKbKc">')
    .to("</div>")
    .build(); //スクレイピングで終値を取得

  return stockPrice.replace("¥","").replace(",",""); //文字列を数字に変換
}

//C,スクレイピングで前日の終値を取得
function beforePrice(code){
  let url = "https://www.google.com/finance/quote/" + code + ":TYO";
  const html = UrlFetchApp.fetch(url).getContentText();
  let stockArray = Parser.data(html)
    .from('<div class="P6K39c">')
    .to("</div>")
    .iterate(); //スクレイピングで配列を取得
  const beforePrice = stockArray[0]; //取得した配列内の1番目の要素が前日の終値

  return beforePrice.replace("¥","").replace(",",""); //文字列を数字に変換
}

//D, LINEに日本株の終値を通知
function sendMessage(){

  //LINEに送信するトークンの設定
  const LINE_NOTIFY_TOKEN = "LINE Notifyで発行したトークン";
  const LINE_NOTIFY_API = "https://notify-api.line.me/api/notify";

  //操作するスプレッドシートの定義
  const spreadSheet = SpreadsheetApp.getActiveSpreadsheet();
  const listSheet = spreadSheet.getSheetByName('日本株');  
  const lastRow = listSheet.getLastRow();
  let stockList = ""; //スプレッドシート上に登録している銘柄情報を取得
  let message = ""; //LINEに送信する文章を挿入

  //登録した個別株のデータを取得し、LINEに送信する文章を作成
  for(var i=2; i<=lastRow; i++){
    const stockCode = listSheet.getRange(i,1).getValue(); //証券コード
    const stockName = listSheet.getRange(i,2).getValue(); //企業名
    const todayPrice = getPrice(stockCode); //今日の終値
    const yestPrice = beforePrice(stockCode); //昨日の終値
    let resultPrice = Math.round(((todayPrice - yestPrice) * 100) / 100); //今日の終値 - 昨日の終値

    //当日の終値が前日の終値より高ければ、文字列の「+」を追加
    if(resultPrice > 0){
      resultPrice = "+" + String(resultPrice);
    }

    //LINEに送信する文章を作成
    stockList +="【銘柄名】" + stockName + "(" + stockCode + ")" 
            +  "\n【終 値】" + todayPrice + "(" + resultPrice + ")\n"
            +  "-------------------------------\n"; 
  }

  //LINEに送信する文章を決定
  if(stockList == "" || stockList == null){
    message = "\n個別に登録されている銘柄はありません。";
  }else{
    message = "\n" + thisDate + "(" + thisDay[day] + ")" + "の個別株の動きです。\n\n" + stockList;
  }

  //LINEに送信
  const token = LINE_NOTIFY_TOKEN;
  var options =
   {
     "method"  : "post",
     "payload" : "message=" + message,
     "headers" : {"Authorization" : "Bearer "+ token}
   };
  UrlFetchApp.fetch(LINE_NOTIFY_API, options); //フェッチ通信でLINEに送信
  setTrigger(); //翌日分のトリガーを作成
}
 
//E,翌日分のトリガーを作成
function setTrigger(){
 //G,トリガーを実行する時間を指定
  today.setDate(today.getDate() + 1); //翌日
  today.setHours(15); //時
  today.setMinutes(30); //分
  today.setSeconds(0); //秒
  ScriptApp.newTrigger('sendMessage').timeBased().at(today).create();
}

A, 当日の日付を取得

//A, 当日の日付を取得
const today = new Date();
const monthNum = (today.getMonth())+1; //月
const dateNum = today.getDate(); //日
const day = today.getDay(); //曜日
const thisDate = monthNum + "月" + dateNum + "日";
const thisDay = ['日','月','火','水','木','金','土']; 

Dateオブジェクトでインスタンスを作成して当日の日付を取得。

日付を取得する方法の詳細はこちらから。

B, スクレイピングで本日の終値を取得

//D,スクレイピングで本日の終値を取得
function getPrice(code){
  let url = "https://www.google.com/finance/quote/" + code + ":TYO";
  const html = UrlFetchApp.fetch(url).getContentText();
  let stockPrice = Parser.data(html)
    .from('<div class="YMlKec fxKbKc">')
    .to("</div>")
    .build(); //スクレイピングで終値を取得

  return stockPrice.replace("¥","").replace(",",""); //文字列を数字に変換
}

スクレイピングを行って本日の終値を取得する関数。

返り値で2回もreplaceメソッドを使うのは取得した文字列を数字に変換するためです。

GASでスクレイピングして株価を取得する方法の詳細はこちら。

C, スクレイピングで前日の終値を取得

//E,スクレイピングで前日の終値を取得
function beforePrice(code){
  let url = "https://www.google.com/finance/quote/" + code + ":TYO";
  const html = UrlFetchApp.fetch(url).getContentText();
  let stockArray = Parser.data(html)
    .from('<div class="P6K39c">')
    .to("</div>")
    .iterate(); //スクレイピングで配列を取得
  const beforePrice = stockArray[0]; //取得した配列内の1番目の要素が前日の終値

  return beforePrice.replace("¥","").replace(",",""); //文字列を数字に変換
}

スクレイピングで前日の終値を取得する関数です。

当日の終値の取得とは異なり配列から前日の終値を取得。

当日の終値-前日の終値で株価の変動を出力します。

配列の1番目の要素が前日の終値なので、取り出して返り値として送ります。

D, LINEに日本株の終値を通知

//B, LINEに日本株の終値を通知
function sendMessage(){

  //LINEに送信するトークンの設定
  const LINE_NOTIFY_TOKEN = "LINE Notifyで発行したトークン";
  const LINE_NOTIFY_API = "https://notify-api.line.me/api/notify";

  //操作するスプレッドシートの定義
  const spreadSheet = SpreadsheetApp.getActiveSpreadsheet();
  const listSheet = spreadSheet.getSheetByName('日本株');  
  const lastRow = listSheet.getLastRow();
  let stockList = ""; //スプレッドシート上に登録している銘柄情報を取得
  let message = ""; //LINEに送信する文章を挿入

  //登録した個別株のデータを取得し、LINEに送信する文章を作成
  for(var i=2; i<=lastRow; i++){
    const stockCode = listSheet.getRange(i,1).getValue(); //証券コード
    const stockName = listSheet.getRange(i,2).getValue(); //企業名
    const todayPrice = getPrice(stockCode); //今日の終値
    const yestPrice = beforePrice(stockCode); //昨日の終値
    let resultPrice = Math.round(((todayPrice - yestPrice) * 100) / 100); //今日の終値 - 昨日の終値

    //当日の終値が前日の終値より高ければ、文字列の「+」を追加
    if(resultPrice > 0){
      resultPrice = "+" + String(resultPrice);
    }

    //LINEに送信する文章を作成
    stockList +="【銘柄名】" + stockName + "(" + stockCode + ")" 
            +  "\n【終 値】" + todayPrice + "(" + resultPrice + ")\n"
            +  "-------------------------------\n"; 
  }

  //LINEに送信する文章を決定
  if(stockList == "" || stockList == null){
    message = "\n個別に登録されている銘柄はありません。";
  }else{
    message = "\n" + thisDate + "(" + thisDay[day] + ")" + "の個別株の動きです。\n\n" + stockList;
  }

  //LINEに送信
  var options =
   {
     "method"  : "post", //POSTメソッドで通信
     "payload" : "message=" + message, //送信するメッセージ
     "headers" : {"Authorization" : "Bearer "+ LINE_NOTIFY_TOKEN}
   };
  UrlFetchApp.fetch(LINE_NOTIFY_API, options); //フェッチ通信でLINEに送信
  setTrigger(); //翌日分のトリガーを作成

}

スクレイピングした日本株の終値を取得してLINEに送信する関数です。

定数LINE_NOTIFY_TOKEN内にはコピーしたトークンに書き換えます。

コードの内容は米国株の終値をLINEで送信を参考にしています。

ほとんど内容は変わりませんが変更点は以下の3つ。

  • 今日の終値をgetPrice関数から取得
  • 昨日の終値をbeforePrice関数から取得
  • 当日の終値が前日の終値より高ければ文字列の「+」を追加

それ以外はすべて同じです。

米国株の株価をLINEで取得する詳細はこちら。

E, 翌日分のトリガーを作成

//C,翌日分のトリガーを作成
function setTrigger(){
 //G,トリガーを実行する時間を指定
  today.setDate(today.getDate() + 1); //翌日
  today.setHours(15); //時
  today.setMinutes(30); //分
  today.setSeconds(0); //秒
  ScriptApp.newTrigger('sendMessage').timeBased().at(today).create();
}

翌日分のトリガーを作成します。

翌日の15時30分にLINEに日本株の終値を通知するsendMessage関数を実行するトリガーを作成。

コードの説明は以上です。

LINEに株価を通知するテスト

GASからラインに株価を送信できるかテストしてみましょう。

赤丸で囲っている文字が「sendMessage」なのを確認して左側の「実行」を押します。

sendMessage関数の実行

「このアプリはGoogleで確認されていません」と表示した場合はこちら

LINEを確かめてみましょう。

「LINE Notify」からメッセージが届いていれば成功です。

GASでLINEに日本株の1日の値動きを通知するアプリの実行結果

希望した時間に通知が来ない時の対処法

時間がずれて希望した時刻に処理できない場合は以下の記事をクリック。

おわりに | あなたの保有株の管理を自動化するには

以上、Google Apps ScriptでLINEに日本株の1日の値動きを毎日通知する方法でした。

  • アプリの開発難易度はやや高め
  • スクレイピングや時間の処理がわかればアプリの理解も早い
  • コピペするだけでも問題ないので積極的に使おう

そのままコピペしたり株式管理に使ったりしてみましょう。

あなたの保有株の管理を自動化するならプログラミングがおすすめ。

とくにGASは自動化に特化し学びやすいことから初心者にも人気です。

GASを効率的に学ぶなら以下の2つの方法が多いです。

  • 参考書やオンライン教材で独学
  • プログラミングスクールを利用

正しく学ぶことで非エンジニアでも実用的な業務効率化のスキルが身に付きます

デイコーでは、GASのサンプルコードからおすすめのプログラミングまで幅広く紹介。

初心者にもわかりやすく解説しています。

あっきょ

プログラミングスクールは82社を分析したッス!

次回の記事もご期待ください!

それでは、よいプログラミングライフを!

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

この記事を書いた人

文系未経験のWebエンジニア。事務職がプログラミング学習して社内SE部門立ち上げ&Webサイト作成。業務効率化で残業80%減を達成。得意な言語 : GAS, JavaScript, Python

目次