GASで投資信託の基準価額時系列CSVデータを自動取得して、Googleスプレッドシートに表示してみる

#はじめに

つみたてNISAとiDeCoで資産運用をはじめたこともあり、過去の価額推移データをいろいろと検証しています。

Googleスプレッドシートには[GOOGLEFINANCE関数](https://support.google.com/docs/answer/3093281?hl=ja)があり、様々な株式相場情報を取得でき便利なのですが、残念ながら日本国内で発売されている投資信託については情報を取得することができません。

日本国内の投資信託情報に関しては、[モーニングスター](http://www.morningstar.co.jp/)が最も充実しており、価額推移CSVデータを取得できるのですが、都度ダウンロードするのが面倒なため、自動的に取得してGoogleスプレッドに表示するGASを作ってみました。

**※注意** 
本スクリプトにより取得したデータの正確性、安全性等について保証できません。ご利用はご自身の判断と責任のもとに行って下さい。利用者が当該情報などに基づいて被ったとされるいかなる損害についても、当方では一切責任を負いません。

#投資信託の基準価額 時系列CSVデータの取得

時系列CSVデータの取得には、[モーニングスター](http://www.morningstar.co.jp/)の各投資信託情報ページのダウンロードページを利用します。これら各投資信託情報ページからCSVデータをダウンロードできます。

**例)** [\[楽天・全米株式インデックス･ファンド\]の基準価額や分配金のダウンロード](http://www.morningstar.co.jp/FundData/Download.do?fnc=2017092908)
**例)** [\[日経225連動型上場投資信託\]の基準価額や分配金のダウンロード](http://www.morningstar.co.jp/FundData/Download.do?fnc=2001070901)

これらのページのダウンロードフォームから、POSTリクエストを利用して時系列CSVデータを取得します。

##POSTリクエストでCSVデータを取得するスクリプト

Googleスプレッドシートのスクリプトエディタから、下記の関数を追加します。

```js
/**
 * getMorningstar_CSV
 * 
 * モーニングスター(www.morningstar.co.jp)から投資信託基準価額のCSVデータを取得する
 * 
 * @fundcode  {String} 投信コード(10ケタ) 
 * @fromDate  {date} 取得開始日[yyyy/MM/dd] 初期値:本日から1年以上前
 * @toDate    {date} 取得最終日[yyyy/MM/dd] 初期値:本日
 * @timeBase  {number} [0|1|2] - 0:日次ベース 1:週末ベース(初期値) 2:月末ベース
 * 
 * @return    {Array Object} CSVデータ
 * 
 * 【使い方】
 * スプレッドシートのセル内から任意の投信コードを指定して関数を呼び出す。
 * =getMorningstar_CSV("2017092908")　
 * 
 */
function getMorningstar_CSV(fundcode, fromDate, toDate, timeBase) {

  if (!fundcode) {
    return "no code"; // 投信コード未指定
  }

  //--- to 年月日 'yyyy/MM/dd'
  if (!toDate) {
    var vtoDate = new Date(); 
    toDate = vtoDate;
  }

  toDate = Utilities.formatDate( toDate, 'Asia/Tokyo', 'yyyy/MM/dd');
  // 日付を分解
  aDate = toDate.split("/");
  var YearTo = aDate[0];
  var MonthTo = aDate[1];
  var DayTo = aDate[2];

  //--- from 年月日 'yyyy/MM/dd'
  if (!fromDate) {
    var vfromDate = new Date(); 
    vfromDate.setFullYear(vfromDate.getFullYear()-1.01); // 1年以上前まで
    fromDate = vfromDate;
  }

  fromDate = Utilities.formatDate(fromDate, 'Asia/Tokyo', 'yyyy/MM/dd');
  // 日付を分解
  aDate = fromDate.split("/");
  var YearFrom = aDate[0];
  var MonthFrom = aDate[1];
  var DayFrom = aDate[2];
  
  if ( timeBase === 0 || timeBase === 1  || timeBase === 2 ) {
    timeBase = timeBase.toString(); // 数値を文字列に変換
  }else{
    timeBase = "1"; // 週末ベース - 初期値
  }

  //--- CSVファイルダウンロード(Shift_JIS)
  var CSV_DOWNLOAD_URL = "https://www.morningstar.co.jp/FundData/DownloadStdYmd.do?fnc=" + fundcode;

  // HTTPリクエストパラメータ POSTで渡すフォームデータはpayloadで指定
  var options = {
    method : "post",
    headers: {
        "content-type": 'application/x-www-form-urlencoded',
    },
    payload : {
        selectStdYearFrom: YearFrom,
        selectStdMonthFrom: MonthFrom,
        selectStdDayFrom: DayFrom,
        selectStdYearTo: YearTo,
        selectStdMonthTo: MonthTo,
        selectStdDayTo: DayTo,
        base: timeBase,
    }
  };

  // CSVファイル取得
  response = UrlFetchApp.fetch(CSV_DOWNLOAD_URL, options);
  Utilities.sleep(2000); // 2秒待つ

  var csv = response.getContentText("Shift_JIS"); 
  // CSVデータをパースする
  var csvdata = Utilities.parseCsv(csv);

  for(var i = 1; i < csvdata.length; i++){
      csvdata[i][1] = Number(csvdata[i][1]); // 「価額」の型変換(文字->数値)
  }

  return csvdata

}
```

##スプレッドシートから関数を呼び出し、価額情報を表示する

追加したgetMorningstar_CSV関数を、スプレッドシートのセルから下記のように呼び出します。


**例）** 投信コード(2017092908)のCSVデータを取得する

```javascript
=getMorningstar_CSV("2017092908")
```

**例）** 2018年1月1日～本日までのCSVデータを月末ベースで取得する

```javascript
=getMorningstar_CSV("2017092908",DATE(2018,1,1),TODAY(), 2)
```

**例）** 投信コード、取得期間、取得単位などを別セルで指定して取得する

![getMorningstartCSV.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/11198/857e995c-fe6e-417e-6466-e50aac348e70.png)

#注意事項

[モーニングスター](http://www.morningstar.co.jp/)のホームページから都度CSVダウンロードしてスプレッドシート上に表示することになるため、データ件数が多い場合、読み込みに時間がかかったり、エラーになる場合があります。サーバへの負荷がかからないよう、多数の投信情報をまとめて取得するのは避けましょう。

※[モーニングスター](http://www.morningstar.co.jp/)により、自動取得が禁止される可能性があります。
※[モーニングスター](http://www.morningstar.co.jp/)のホームページの仕様変更により、本スクリプトが動作しなくなる可能性があります。

#追記
一度に複数の投信価額CSVダウンロードをしようとすると、処理が間に合わずエラーになることがあるため、2秒待つように追記。

2021/01/14
CSVファイルダウンロードURLを"https://～"に変更。
headers: {"content-type": 'application/x-www-form-urlencoded'} を追加。