Google App Script 投資 自動化

【GAS】米国株配当発表情報をカレンダー登録

はじめに

米国株個別投資では配当金の入金が楽しみの一つでもあります。

配当金が発表されて気になるのは配当内容と支払い日ですね。

この情報を自動的にGoogleカレンダーに登録する仕組みを考えました。

楽天証券では、銘柄情報通知サービスがあり、保有銘柄やお気に入りに追加されている銘柄の配当金発表情報をメールで受け取ることができます。この内容をもとにGoogle Apps Scriptを使用してカレンダーに自動登録します。

また、Google App Scriptについては以下の記事を参照ください。

ここで紹介する内容は、以下の条件を満たす方が対象となります。

対象読者

  • 楽天証券の口座を保有している
  • 楽天証券の銘柄情報通知メール設定において「配信希望」としている
  • 楽天証券からの配信メールにGmailを指定している
  • 決算予定日をGoogleカレンダーに自動登録させたい

楽天証券の銘柄情報通知メール設定は、ログインしてから以下の画面で行うことができます。

  • マイメニュー
    • メールサービス
      • 銘柄情報通知メール
        • 登録・変更する

お気に入りに登録されている銘柄の決算発表予定日も確認したい場合は、「お気に入り登録銘柄の配信」にもチェックを入れます。

詳細は、楽天証券の以下のサイトを確認ください。

配当金発表内容をGoogleカレンダーに自動登録する

ほとんどの処理はこれまで公開したカレンダー登録と同様です。

主な違いは以下の3点です。

  • メール検索文字が楽天証券からの銘柄情報通知サービスである
  • メール本文内容解析
  • カレンダーに登録する文字は「配当(銘柄コード)一株当たりの配当額」です

以下では、異なる部分のみについて説明します。

未処理メールの抽出

楽天証券からの積立完了メールを抽出します。

メールの抽出条件の構文は、Gmailの抽出条件に設定できる構文と同じです。

// 処理済み後に付けるラベル名(ラベルが存在しなければ自動的に作られる)
var LABEL = '自動処理済';

// GMail検索文字列(楽天証券からの配当金発表情報)
var SEARCH_QUERY = 'is:unread -label:' + LABEL + ' from:service@rakuten-sec.co.jp subject:保有・お気に入り銘柄の現金配当が発表されました';

イベント登録処理説明

楽天証券の銘柄情報通知サービスに登録しておくと、以下のメールが送られてくるので、銘柄コード、発表日、配当内容を抽出してカレンダーに登録する処理を考えます。

配当金発表情報メール

保有銘柄・お気に入り銘柄の現金配当が発表されました。

現金配当に伴うお客様の手続きは必要ありません。

──────────────────────────
銘柄名  :アッヴィ
現地コード:ABBV
市場   :NYSE
発表日  :2021/09/10
権利落日 :2021/10/14
支払日  :2021/11/15
配当内容 :一株につき1.300000USD
備考   :-
──────────────────────────
発表内容は予定であり、変更される場合があります。
日付は全て現地の日付です。

保有株式数に応じて、現金配当を得ることができます。
配当を受け取るには、現地の日付で権利落日の前営業日までに買い付け、
その日の取引終了時点まで保有している必要があります。

  • メールのプレーンテキストをmessage.getPlainBody()で取得します。
  • paymentDateに配当金支払日を格納。
  • イベントタイトルは「配当(銘柄コード)一株当たりの配当額」。
  • イベント色はCalendarApp.EventColor.REDで指定する赤色。
  • カレンダーに登録後、該当メールに「自動処理済」のラベルをputLabel()で付与します。
// 検索文字列
var STOCK_NAME = '銘柄名  :';
var STOCK_CODE = '現地コード:';
var STOCK_PAYMENT_DATE = '支払日  :';
var STOCK_DIVIDEND = '配当内容 :';
var STOCK_BIKOU = '備考   :';

function registDividendPaymentDateToCalendar() {

  // デフォルトカレンダーを取得
  var calendar = CalendarApp.getDefaultCalendar();

  var threads = GmailApp.search(SEARCH_QUERY, 0, 1);
  if (threads.length === 0) {
    Logger.log('メールが見つかりません');
    return;
  }

  for(var k in threads){
    var thread = threads[k]
    var messages = thread.getMessages();
    for (var j in messages){
      var message = messages[j];
      var body = message.getBody();
      
      var stockName = null;         // 銘柄名
      var stockCode = null;         // 銘柄コード
      var paymentDate = null;       // 支払日
      var dividend = null;          // 配当内容
      var contents = null;
      var flgAdd = 0;
      
      // 楽天証券からの配当金お知らせメールの内容確認
      var rows = body.split("\n");
      for (var i in rows) {
        var row = rows[i];

        if (row.indexOf(STOCK_NAME) >= 0) {
          stockName = row.replace(STOCK_NAME, '');
          flgAdd = 1;
        } 
        else if (row.indexOf(STOCK_CODE) >= 0) {
          stockCode = row.replace(STOCK_CODE, '');
          stockCode = stockCode.substr(0, 3);
        }
        else if(row.indexOf(STOCK_PAYMENT_DATE) >= 0){
          paymentDate = row.replace(STOCK_PAYMENT_DATE, '');
        }
        else if(row.indexOf(STOCK_DIVIDEND) >= 0){
          var tmp = row.replace(STOCK_DIVIDEND, '');
          tmp = tmp.replace('一株につき', '');
          var code = tmp.substr(tmp.length-4, 3);
          var valS = tmp.substr(0, tmp.length-4);
          var valF = parseFloat(valS);
          dividend = valF.toString()  + code;
          //Logger.log('tmp:' + tmp + 'code:' + code + 'valF:' + valF + '\ndividend:' + dividend);
        }
        else if(row.indexOf(STOCK_BIKOU) >= 0){
          flgAdd = 0;
        }

        if(flgAdd){
          if(contents == null){
            contents = row + '\n';
          }
          else{
            contents = contents + row + '\n';
          }
        }
      }

      // Google Calendarに登録
      var registerDate = new Date(paymentDate);
      if (stockName && stockCode && paymentDate && dividend && contents) {
        var title = '配当(' + stockCode + ') ' + dividend + '/株';
        Logger.log(contents);

        // カレンダーに追加
        if(checkConflict(calendar, registerDate, title) == false){
          var options = {
            description : contents
          }
          var event = calendar.createAllDayEvent(title, registerDate, options);
          event.setColor(CalendarApp.EventColor.PALE_RED);
          //event.removeAllReminders();   // 予定なので通知する
        }

        // 処理済みメールとしてラベルを付ける
        putLabel(thread); 
      }  
    }
  }
}

checkConflict()とputLabel()関数は、libCtrlCalendarとlibCtrlMailを参照ください。

実行結果

Googleカレンダーには以下のように登録されます。

最後に

通知メールは本当にたくさん来るので、不要な迷惑メールと区別がつかないことがありますよね。たまに、必要なメールも勢い余って削除してしまうこともあります。なので、関谷さんは以下の2点を目的に、重要度の高い通知メールはカレンダーに自動登録させるようにしています。

  • 日付に紐づく情報をカレンダーに登録して整理する。
  • 不要なメールと間違えて処理しない。

不要な情報はカレンダーに登録されないので、必要な情報を確認するのに重宝しています。

また、デフォルトのカレンダーにすべて登録してしまうと自分の予定情報が埋もれてしまうので、自動登録用のカレンダーと自分の予定用のカレンダーを分けることで、確認しやすくしています。

情報整理に困った方がいらしたら、一つのアイディアとして検討ください。

情報の一元化は、効率向上の一つの手段だとほんと思います。「手間を惜しまず」という言葉はある意味正しいのですが、手間をかけなくても目的を達成できるのであれば、その方が良いじゃない。

では、今日も良い一日を。

-Google App Script, 投資, 自動化
-, , , , , ,