投資のポートフォリオ管理ツールの自動化チャレンジ−その3

今回で最終回になります。前回は、Google Apps Scriptを使って基準価額の情報を取得し、セルへ入力できるところまでを確認しました。今回は、いちいちプログラムに手を入れなくてもポートフォリオに組み入れている銘柄の増加に対応できるようにしたいと思います。

準備:APIで使うファンドコードのリストを作る

スプレッドシートにリストを作ります。ここで指定したファンドコードを使って、APIを呼び出すようにすることで、今後データを取得したいファンドが増えたとしてもいちいちプログラムを修正しなくても良くなります。

ファンドコードの横に基準価額の列を作り、APIを使って取得した情報を入力します。

APIを呼び出す関数を作る

上のリストから、ファンドコードを読み込んだあとに、ファンドコード ごとに基準価額を取得してセルに埋めるという作業を繰り返すことになります。ファンドコードから基準価額を取得するために最低限必要なプログラムは前回の例だとこんな感じです。

このプログラムの中のfd=250888がファンドコードになりますので、この部分を可変にしないといけないのと、ファンドコードからAPIを使って投資信託の基本情報を取得して、基本情報の中から基準価額を抜き出すという流れですので2つの処理を行なっています。後でわかりやすくする為に、この2つの処理をひとまとめにしておきます。

function getStandardPrice(fundCode){
  //APIから情報を取得
  var response = UrlFetchApp.fetch('http://emaxis.muam.jp/web/api/v1.php?col=asset_default&fd='+fundCode, {method: 'get',headers: {'Accept': 'application/json'}});
  Logger.log(response.getContentText());

  //基準価額を抜き出す
  var standardPrice = JSON.parse(response.getContentText()).standard_price;
  Logger.log('ファンドコード:'+fundCode+' / 基準価額'+standardPrice);

  //基準価額を返す
  return standardPrice;
}

このようにしておくことで、getStandardPrice(ファンドコード)と呼び出して簡単に基準価額を取得することができるようになります。

スプレッドシートのファンドコードを読み込み、基準価額をセットする

いよいよ大詰めです。セルからファンドコードを抜き出してきて、ファンドコードごとに基準価額を取得して右側の列にセットしていく処理です。

function setStandardPrice(){
  //ファンドコードの一覧を取得する
  var sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName('シート2');
  var fundCodes = sheet.getRange(2,2,sheet.getLastRow()-1,1).getValues();
  
  //1行ずつ基準価額を取得してセルに入力する
  var r=2;
  for (var fundCode of fundCodes){
    sheet.getRange(r,3).setValue(getStandardPrice(fundCode));
    r += 1;
  }
}

このプログラムはいくつかスプレッドシートに依存した部分があります。まずシート2ですが、これはシート名です。もしシート名を変更したらここを合わせてください。

次にgetRange(2,2, …)の部分です。ここでは基準価額のリストが始まるセルの位置を指定しています。B2から下方向にリストがありますので、2行目、2列目という指定になります。もしA3からはじまるなら3,1になりますし、D2から始まるなら2,4にする必要があります。

最後にr=2とgetRange(r,3)ですが、基準価額の入力をする最初のセルの位置になります。この例では基準価額がB2から下にリストで入力してあり、対応する基準価額は右の列であるC2から下方向にリストしていきます。この為、最初の位置が2,3になるようにし、1回終わるごとに1行下にずらしていくためにr += 1しています。

プログラムのテスト

一度このプログラムがきちんと動作するかをテストしてみます。プルダウンリストからsetStandardPriceを選択して、実行ボタンをクリックすると、動作ログがつらつら出てきて正常終了しました。

スプレッドシートの方に戻ってみると、基準価額が取得できていますので、これでOKとします。

このプログラムを自動実行する

自動実行する為にはトリガーというものを使うのですが、トリガーとは何かが起きた時にプログラムを実行することです。スプレッドシートを開いた時に自動実行してみたところ、スマホアプリで開いた時に動作しないことがわかりました。このため、毎日決まった時間に実施するようにしました。

まずトリガーの設定画面に移動します。スクリプトエディタの左の方のメニューでトリガーをクリックします。画面右下にあるトリガーを追加ボタンをクリックして、トリガーを設定していきます。

設定するところは4箇所で、まず実行する関数。コピペで利用される方は表示の通りsetStandardPriceを指定します。次にイベントのソースを時間主導型にし、日付ベースとか時間ベースを選んで、実行するタイミングを指定します。

テストで1分間隔で実行した時の動画ですが、自動的に基準価額が入力され、手動で消してもまた1分後に値がセットされる様子をご覧いただけるかと思います。


eMAXIS以外も対応していきたいのですが、他の会社はAPIが準備されていないようですので、スクレイピングするしかなさそうです。手間の掛かり具合が別次元になってきますので、eMAXIS以外を保有することにした時にでも考えてみたいと思います。