2
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

GASで東京都オープンデータカタログから新型コロナウィルス陽性患者数を取得

Last updated at Posted at 2021-07-28

#はじまり
東京都の新型コロナ陽性者数を日別でグラフ化したり、前日比、先週比、速報値などの情報をGASを使って毎日、自動的に自分のスマホへ通知したいなという動機が事の始まりです。

#情報元
まず、日毎のデータですが、東京都では東京都オープンデータカタログサイトにて情報開示しており、コレを活用することで調べる事ができます。
APIについては、オープンデータAPIについて にある /Covid19Patient新型コロナウイルス陽性患者発表詳細 を利用すると日々の陽性者数を取得できます。

データを取得する際、ポイントとなるのが最大取得レコード数(上限:1000件)を超える場合、パラメータcursorの値には、前レスポンスで取得したendCursor値をURLエンコードしてからリクエストする必要があります。
※取得したendCursor値をそのまま当て込んでもその後のデータは得られません。

コード.gs

// メインの処理
function main() {

  // 前日は引数を1
  var date = getTargetDate(1);
  var object = getAPItoXML(date, date);

  // 性別毎の患者数を集計
  var group = object.reduce(function (result, current) {
    var row = result.find(function (x) {
      return x.gender === current['患者_性別']
    });

    if (row) {
      row.count ++;
    } else {
      result.push({
        gender: current['患者_性別'],
        count: 1,
      });
    }
    
    return result;
  }, []);

  // 日付と患者数
  Logger.log(Utilities.formatString("%s --> 患者数:%s", Utilities.formatDate(date, 'JST', 'yyyy-MM-dd'), object.length));
  // 性別毎の患者数
  Logger.log(group);
}


// リクエスト処理
function getAPItoXML(inFrom, inTill) {

  var wkPayload = {
    // 日付(公表_年月日)による絞り込み (自)
    'from' : Utilities.formatDate(inFrom, 'JST', 'yyyy-MM-dd'),
    // 日付(公表_年月日)による絞り込み (至)
    'till' : Utilities.formatDate(inTill, 'JST', 'yyyy-MM-dd'),
    // 最大取得レコード数 (上限:1000)
    'limit' : 1000
  };

  var wkResponse = UrlFetchApp.fetch(getParamUrl(wkPayload));
  var wkJson = JSON.parse(wkResponse.getContentText());
  var wkRes = wkJson[0];
  var wkEndCur = wkJson[1];

  while(wkEndCur['moreResults']==='MORE_RESULTS_AFTER_LIMIT'){
    // 相手サーバーへの負荷を抑制するため5秒待つ
    Utilities.sleep(5000);
    // 取得レコードがlimitを超える場合、前のレスポンスにおける"endCursor"の値を指定
    wkPayload['cursor'] = wkEndCur['endCursor'];
    wkResponse = UrlFetchApp.fetch(getParamUrl(wkPayload));
    wkJson = JSON.parse(wkResponse.getContentText());
    wkEndCur = wkJson[1];
    // 取得データをマージする
    wkRes.push(...wkJson[0]);
  }

  return wkRes;
}

// 日数から日付型データを取得
function getTargetDate(inInt) {
  var date = new Date(); //現在日時のDateオブジェクトを作る
  var day = date.getDate();
  date.setDate(day - inInt);
  return date;
}

// パラメータはURLエンコードしてURLを生成
function getParamUrl(inArray) {
  var arr = [];
  for(var key in inArray) {
    // 値はURLエンコードする
    arr.push(key + "=" + encodeURIComponent(inArray[key]));
  }
  var url = 'https://api.data.metro.tokyo.lg.jp/v1/Covid19Patient' + "?" + arr.join("&");
  return url;
}

#結果
スクリーンショット 2021-07-29 1.16.12.png

#注意点
東京都オープンデータカタログを速報値として利用するには、更新のタイミングが遅いため正直、向いていません。
概ね20時過ぎに更新されるている様なので、速報値は東京都福祉保健局のTwitterを見た方が早いです。
Twitterアカウントでは、毎日16:45〜46のタイミングで速報値を発表されています。
また、希に当日データの値が速報値より少ない事があったり、22:00過ぎても更新されなかった事がありますが、翌日には修正されています。

2
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?