【GAS】EDINETが公開しているAPIを使って公開データをスプレッドシートに取り込む


概要

大別すると「書類一覧」と「書類そのもの」を取得できます。基本この2つだけ抑えておけば良さげです。

(参考)
EDINETリンク先
https://disclosure.edinet-fsa.go.jp/EKW0EZ0015.html

書類一覧

日付をyyyy-mm-dd形式で指定すればよいだけです。下のような要領でブラウザを叩けばJSONデータが返ってくるはずです。

日付は5年前まで遡れます。type=2はよく調べていませんが「2」がいい感じのようです。

土日など公開データがない日を除いた平日で試すとずらずらっとデータが出てくるはずです。

書類そのもの

書類一覧のなかに書類管理番号があり、その書類管理番号が必要になってきます。

有報などのPDFデータは「2」を指定します。詳しいことはAPI仕様書を御覧ください(すみません)。

目標

日々の公開データを翌日早朝に取得し、スプレッドシートに取り込んでおく。

スプレッドシート準備

予め1行目にタイトルを仕込んでおきます。

横長すぎて一部しか表示されていませんが、「書類一覧」に対応する列が27列、「書類そのもの」に対応する列が4列、合計31列設定しています。

いちおう頑張ってマークダウンで表を作っておきました。

1 連番
2 書類管理番号
3 提出者EDINETコード
4 提出者証券コード
5 提出者法人番号
6 提出者名
7 ファンドコード
8 府令コード
9 様式コード
10 書類種別コード
11 期間 (自)
12 期間 (至)
13 提出日時
14 提出書類概要
15 発行会社EDINETコード
16 対象EDINETコード
17 子会社EDINETコード
18 臨報提出事由
19 親書類管理番号
20 操作日時
21 取下区分
22 書類情報修正区分
23 開示不開示区分
24 XBRL有無フラグ
25 PDF有無フラグ
26 代替書面・添付文書有無フラグ
27 英文ファイル有無フラグ
28 書類1
29 書類2
30 書類3
31 書類4

重要なのは項目2の書類管理番号でこれが主キーです。ちなみに連番は日毎にまた1から始まります。

この書類管理番号と数字の1から4の組み合わせで書類そのものへのアクセスが可能となっています。1から4のうち、「2」がたぶん重要で有報とかはこの「2」から引っ張れます。といってもPDFが出てくるだけですが。

準備できたらそのままツール→スクリプトエディタ画面へ行き、以下のコードをコピペし、実行します。

GASコード


var ss = SpreadsheetApp.getActiveSpreadsheet();
var sh = ss.getActiveSheet();

function getEDINET() {

  // データを取得
  var yesterday = Utilities.formatDate(new Date(new Date - 86400000),"JST","yyyy-MM-dd");
  var url = "https://disclosure.edinet-fsa.go.jp/api/v1/documents.json?date="+yesterday+"&type=2";
  var response = UrlFetchApp.fetch(url);
  var json = response.getContentText();
  json = JSON.parse(json);

  // 0件なら処理終了
  var kensu = json.metadata.resultset.count;
  if (kensu === 0) {
    return;
  }

  // 予め全27項目を列挙
  var item = [
    "seqNumber",
    "docID",
    "edinetCode",
    "secCode",
    "JCN",
    "filerName",
    "fundCode",
    "ordinanceCode",
    "formCode",
    "docTypeCode",
    "periodStart",
    "periodEnd", 
    "submitDateTime",
    "docDescription",
    "issuerEdinetCode",
    "subjectEdinetCode",
    "subsidiaryEdinetCode",
    "currentReportReason",
    "parentDocID",
    "opeDateTime",
    "withdrawalStatus",
    "docInfoEditStatus",
    "disclosureStatus",
    "xbrlFlag",
    "pdfFlag",
    "attachDocFlag",
    "englishDocFlag"
  ];

  // 2次元配列に組み直し
  var ary = [];
  var ary2 = [];
  for (var i=0; i<json.results.length; i++) {
    for (var j=0; j<item.length; j++) {
      ary.push(json.results[i][item[j]]);
      // もしundefinedなら空欄に直す
      if (!ary[j]) {
        ary[j] = "";
      }
    }
    // 書類そのものへのリンク
    ary.push(
      "https://disclosure.edinet-fsa.go.jp/api/v1/documents/"+ary[1]+"?type=1",
      "https://disclosure.edinet-fsa.go.jp/api/v1/documents/"+ary[1]+"?type=2",
      "https://disclosure.edinet-fsa.go.jp/api/v1/documents/"+ary[1]+"?type=3",
      "https://disclosure.edinet-fsa.go.jp/api/v1/documents/"+ary[1]+"?type=4"
    );
    ary2.push(ary);
    ary = [];
  }

  // シートに反映
  sh.getRange(sh.getLastRow()+1,1,ary2.length,31).setValues(ary2);

}

結果

実行すると前日のデータがスプレッドシートに反映されると思います。ちなみにいま試したら164件のデータが取り込まれました(20191002のデータ)。

画面右端の方に書類へのリンクを貼ってあるのでクリックすればそこへ飛びます。

その他

あとはスクリプトトリガーを設定して毎日定時(たとえば早朝など)に自動的に実行するようにすれば何もしなくても勝手にどんどん毎日データが溜まっていきます。200万セル制限には注意ですが。

あと本文の例では前日のデータを当日早朝に取得することを前提にしていますが当日のデータならちょっと変えればいいだけです。


var yesterday = Utilities.formatDate(new Date(new Date - 86400000),"JST","yyyy-MM-dd");

// これを以下のように変更する

var today = Utilities.formatDate(new Date(new Date),"JST","yyyy-MM-dd");

参考

ほとんど構造は同じです。
【GAS】国土交通省が公表している不動産取引価格情報をスプレッドシートに取り込む
https://qiita.com/ShishidoToru/items/7bf2233b8269a44d26a7