GASでEDINETの有価証券報告書データを蓄積する方法

投資・ファイナンス

EDINETを使ったデータ取得については、これまでの記事でも紹介してきました。

今回は、個別のデータはいらないけど、書類一覧のデータだけ取得したいという場合の方法として、完全無料で利用できるGoogle SpreadSheetを使った方法を紹介します。

GASのコード

spredSheetのAppScrptを使います。
拡張機能から開けます。

var ss = SpreadsheetApp.getActiveSpreadsheet();
var dateSheet = ss.getSheetByName("日付");
var resultSheet = ss.getSheetByName("list");
var api_key = 'EDINETAPI'
function getEDINET() {

  // スプレッドシートから開始日と終了日を取得
  var startDate = dateSheet.getRange("A1").getValue(); // A1セルに開始日を入力
  var endDate = dateSheet.getRange("B1").getValue();   // B1セルに終了日を入力

  // 日付をDateオブジェクトとして扱う
  startDate = new Date(startDate);
  endDate = new Date(endDate);

  // 日付の範囲をループで処理
  for (var d = startDate; d <= endDate; d.setDate(d.getDate() + 1)) {
    var formattedDate = Utilities.formatDate(new Date(d), "JST", "yyyy-MM-dd");
    var lastRow = resultSheet.getLastRow();
    var existingData = lastRow > 0 ? resultSheet.getRange(1, 1, lastRow, resultSheet.getLastColumn()).getValues() : [];

    // 最終行の日付を取得
    var lastRowDate = existingData.length > 0 ? existingData[existingData.length - 1][0] : ""; // 日付は1列目(インデックス0)
    var lastNum = resultSheet.getRange(resultSheet.getLastRow(), 2).getValue();

    if (lastRowDate=='date'){
      lastRowDate = dateSheet.getRange("A1").getValue();
      lastNum = 0
    }


    // 既にデータが取得されている場合はスキップ
    // if (formattedDate < lastRowDate) {
    //   Logger.log(formattedDate + 'のデータは既に取得されています');
    //   continue;
    // }

    // EDINET API v2のURL
    var url = "https://disclosure.edinet-fsa.go.jp/api/v2/documents.json?date=" + formattedDate + "&type=2&Subscription-Key=" + api_key;
    var response = UrlFetchApp.fetch(url);
    var json = JSON.parse(response.getContentText());

    // 0件なら次の日付へ
    var kensu = json.metadata.resultset.count;
    if (kensu === 0) {
      Logger.log(formattedDate + 'のデータはありません');
      continue;
    }

    // 必要なデータ項目を列挙
    var meta_cols = [
      "date",
      "seqNumber",
      "docID",
      "edinetCode",
      "secCode",
      "JCN",
      "filerName",
      "fundCode",
      "ordinanceCode",
      "formCode",
      "docTypeCode",
      "periodStart",
      "periodEnd", 
      "submitDateTime"
    ];

    // データを格納する配列を準備
    var ary2 = [];

    // 条件を満たすデータのみ処理
    for (var i = 0; i < json.results.length; i++) {
      var ordinanceCode = json.results[i].ordinanceCode;
      var formCode = json.results[i].formCode;
      var seqNumber = json.results[i].seqNumber;
      // "ordinanceCode" が "010" かつ "formCode" が "030000" の場合のみデータを処理
      if (ordinanceCode == "010" && formCode == "030000") {
        if (formattedDate == Utilities.formatDate(lastRowDate, "JST", "yyyy-MM-dd") && seqNumber<=lastNum){
            continue;
        }
        else{
        var ary = []; // 最初の列に日付を追加
        for (var j = 0; j < meta_cols.length; j++) {


          if (meta_cols[j] == "date") {
            ary.push(formattedDate); // "date" はAPIから取得できないため、手動で追加
          } else {
            ary.push(json.results[i][meta_cols[j]] || ""); // 値がない場合は空文字列にする
          }
        }
        ary2.push(ary);
        }
      }
    }

    // シートに反映
    if (ary2.length > 0) {
      resultSheet.getRange(resultSheet.getLastRow() + 1, 1, ary2.length, meta_cols.length).setValues(ary2);
      Logger.log(formattedDate + 'のデータを取得しました');
    }
  }
}


EDINET APIの取得については以下の記事を参考にしてください。

https:/lifetechia.com/edinet-api-1/

スプレッドシートの設定

日付シートと、listシートを作成します。
日付シートのA1は開始日、B1は終了日です。

A1は=MAX(DATE(2019,1,1),MAX(list!A:A))のようにしておくと、2019/1/1以降もしくは、list取得の最も新しい日付以降に動的に変更できます。

listシートには、カラムを記入しておきます。

実行

ここまで準備できたら、AppScrptの関数を実行します。

実行すると以下のように有価証券報告書のデータ一覧が記録できます。

list

コメント

タイトルとURLをコピーしました