Google Apps Script 時短ツール

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

お仕事おつにゃッス🐈

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

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

この記事ではそのお悩みを、コピペOKのGoogle Apps Scriptのコードで解決します。

あっきょ
この記事は以下で悩んでいる人におすすめ!

  • もっと簡単に日本株の管理をしたい
  • 手間を省きたい
  • プログラミングでJavaScriptを学んだけど、何を作っていいかわからない

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

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

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

Google Apps Scriptとスプレッドシートを使って、LINEに日本株の終値を15時30分に通知するアプリを作成します。

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

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

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

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

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

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

取得後にスプレッドシートで読みやすいようにデータを加工した後、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, 当日の日付を取得
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オブジェクトでインスタンスを作成し、当日の日付を取得します。

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

【入門】GASで当日の日付を「年月日」で取得

続きを見る

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メソッドを使うのは、取得した文字列を数字に変換してsendMessage関数内で計算するためです。

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

【便利】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で取得する詳細はこちら。

【便利】GASで米国株の1日の値動きを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で確認されていません」と表示される場合はこちら

【3分で解決】GASの「このアプリはGoogleで確認されていません」を許可する方法

続きを見る

LINEを確かめてみましょう。「LINE Notify」からメッセージが届いていれば成功です。

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

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

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

【3分で解決】GASで出力した時間がずれたときにタイムゾーンを変更する方法

続きを見る

おわりに

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

スプレッドシートでS&P500などの株式指数為替の値も取得できますので、ぜひ今回紹介したコードと合わせて使ってみてください。

S&P500の値動きをスプレッドシートで自動取得

続きを見る

【簡単】スプレッドシートで為替を自動で換算

続きを見る

次回の記事もお楽しみに!

-Google Apps Script, 時短ツール
-, , , , , , , , , , , , , , , , , , , , , , , , , , , , , , ,