【便利】GASで米国株の1日の値動きをLINEに毎朝通知

お仕事おつにゃッス🐈

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

あなたが持っている米国株の終値をアプリを開いて毎朝確認するのは面倒くさいですよね?

しかし、GASはLINEと連携すれば簡単に便利アプリを作れます。

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

こんな人におすすめ!

  • もっと簡単に米国株式を管理したい
  • 手間を省いてもっと朝の時間を優雅に使いたい
  • プログラミングでJavaScriptを学んだけど、何を作っていいかわからない

運営者は紹介するコードを作成すれば朝の時間を10分削減してごはんをゆっくりと食べられます。

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

目次

LINEから株価を取得するアプリのイメージ

GASで米国株の1日の値動きをLINEに毎朝通知するアプリのイメージ

Google Apps Scriptとスプレッドシートを使ってLINEに米国株の終値を毎朝通知するアプリを作成します。

アメリカの株式市場の動向を起きてから調べていると朝の貴重な時間が削られます。

株価を見るだけで朝の時間が少なくなるのは辛いですよね。

そこで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 スプレッドシートの準備

米国株の管理をするシートを作成します。

スプレッドシートでは簡単に株価を取得するGOOGLEFINANCE関数を使います。

スプレッドシートで米国株の株価を取得するGOOGLEFINANCE関数の説明

株価を取得する関数の詳細はこちらから。

今回は以下の4項目を設定します。

  • 企業名
  • 株式コード
  • 現在の株価
  • 前日の株価

シート名を「リスト」に変更します。Google スプレッドシートの設定は以上です。

リストシート作成

LINEに株価を通知するサンプルコード

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

解説の項目

  • サンプルコード
  • A. 当日の日付を取得
  • B. LINEに送信するトークンの設定
  • C. 操作するスプレッドシートの定義
  • D. 登録した個別株のデータを取得
  • E. LINEに送信する文章を決定
  • F. LINEに送信
  • G. トリガーを実行する時間を指定

サンプルコード

ソースコードの全体です。

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

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

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


//スプレッドシートから登録している米国株の情報を取得し、LINEに送信する関数
function sendMessage(){

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

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

  //D,登録した個別株のデータを取得
  for(var i=2; i<=lastRow; i++){
    const stockName = listSheet.getRange(i,1).getValue(); //企業名
    const stockCode = listSheet.getRange(i,2).getValue();  //株式コード(ティッカー)
    const todayPrice = listSheet.getRange(i,3).getValue(); //当日の株価
    const yesterdayPrice = listSheet.getRange(i,4).getValue(); //前日の株価
    const resultPrice = Math.round(todayPrice - yesterdayPrice); //当日の株価 - 前日の株価

    stockList += "【銘柄名】" + stockName + "(" + stockCode + ")" 
              +  "\n【終 値】" + todayPrice + "(" + resultPrice + ")\n"
              +  "-------------------------------\n"; 

  }

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


  //F,LINEに送信
  var options =
   {
     "method"  : "post",
     "payload" : "message=" + message,
     "headers" : {"Authorization" : "Bearer "+ LINE_NOTIFY_TOKEN}
   };
  UrlFetchApp.fetch(LINE_NOTIFY_API, options);
  setTrigger();
}
 

//毎日午前7時にsendMessage関数を実行する関数
function setTrigger(){
 //G,トリガーを実行する時間を指定
  today.setDate(today.getDate() + 1);
  today.setHours(7); //時
  today.setMinutes(0); //分
  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. LINEに送信するトークンの設定

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

LINE Notify を使うトークンを記入します。

定数LINE_NOTIFY_TOKENには取得したトークンに書き換え必須なので必ず変更します。

C. 操作するスプレッドシートの定義

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

使用するスプレッドシートを定義。

「リスト」シートを指定した後にgetLastRowメソッドで最終行を取得します。

このメソッドの詳細はこちらから。

D. 登録した個別株のデータを取得

//D,登録した個別株のデータを取得
for(var i=2; i<=lastRow; i++){
  const stockName = listSheet.getRange(i,1).getValue(); //企業名
  const stockCode = listSheet.getRange(i,2).getValue();  //株式コード(ティッカー)
  const todayPrice = listSheet.getRange(i,3).getValue(); //現在の株価
  const yesterdayPrice = listSheet.getRange(i,4).getValue(); //前日の株価
  const resultPrice = Math.round((todayPrice - yesterdayPrice) * 100) / 100;

  stockList += "【銘柄名】" + stockName + "(" + stockCode + ")" 
            +  "\n【終 値】" + todayPrice + "(" + resultPrice + ")\n"
            +  "-------------------------------\n"; 
}

スプレッドシートから個別株のデータを取得します。

「リスト」シートの1行目の見出しは読み取り不要なので、for文の変数 i は2からスタートします。

シートの i行目にある株式データをそれぞれを取得した後、LINEに送る文字列を作成してstockListに代入します。

E. LINEに送信する文章を決定

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

stockListが空の状態、つまり「リスト」シートに登録している銘柄がない場合は「個別に登録されている銘柄はありません。」と通知します。

対して、1つでも銘柄を登録していればLINEに株の当日の終値を通知します。

F. LINEに送信

//F,LINEに送信
var options =
   {
     "method"  : "post",
     "payload" : "message=" + message,
     "headers" : {"Authorization" : "Bearer "+ LINE_NOTIFY_TOKEN}
    };
UrlFetchApp.fetch(LINE_NOTIFY_API, options);
setTrigger();

GAS から LINE にメッセージを送信します。

送信完了後、翌日も同じ処理をするためにsetTrigger関数でタイマーを設定します。

LINEに送信する方法の詳細はこちらから。

G. トリガーを実行する時間を指定

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

翌日も同じ処理を実行できるようにトリガーを設定します。

この例では、「翌日の午前7時にsendMessage関数を実行」をするように設定しています。

トリガーの設定方法の詳細はこちら。

サンプルコードの説明は以上です。

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

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

赤丸で囲った文字が「sendMessage」であることを確認し左側にある「実行」を押します。

sendMessage関数の実行

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

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

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

LINE Notify 米国株の終値を通知

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

時間がずれて希望した時刻に処理できない場合は、時間の設定がアメリカに設定されているのが原因です。

日本の標準時に合わせる必要があります

以下の記事では、タイムゾーンを変更して正常な時間に戻す方法を解説しています。

【さらに便利】GASで資産を管理するアプリ一覧

この記事では、米国株の終値を毎朝通知するアプリを開発しました。

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

GASで日本株を管理する方法は以下の記事から。

おわりに | 株価の管理を自動化するには

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

そのままコピペして日常業務で使いやすいように改修したり、プログラミングの練習や動作確認用に使ってみましょう。

株式の管理を自動化するにはプログラミングがおすすめ。

プログラミングを学ぶ方法は以下の2つ。

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

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

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

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

あっきょ

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

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

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

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

この記事を書いた人

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

目次