#はじまり
東京都の新型コロナ陽性者数を日別でグラフ化したり、前日比、先週比、速報値などの情報を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;
}
#注意点
東京都オープンデータカタログを速報値として利用するには、更新のタイミングが遅いため正直、向いていません。
概ね20時過ぎに更新されるている様なので、速報値は東京都福祉保健局のTwitterを見た方が早いです。
Twitterアカウントでは、毎日16:45〜46のタイミングで速報値を発表されています。
また、希に当日データの値が速報値より少ない事があったり、22:00過ぎても更新されなかった事がありますが、翌日には修正されています。