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の取得については以下の記事を参考にしてください。
スプレッドシートの設定
日付シートと、listシートを作成します。
日付シートのA1は開始日、B1は終了日です。
A1は=MAX(DATE(2019,1,1),MAX(list!A:A))
のようにしておくと、2019/1/1以降もしくは、list取得の最も新しい日付以降に動的に変更できます。
listシートには、カラムを記入しておきます。
実行
ここまで準備できたら、AppScrptの関数を実行します。
実行すると以下のように有価証券報告書のデータ一覧が記録できます。