開発
GASを利用して福島県の新型コロナ感染者数をWebexに自動投稿する
Takuto
COVID-19
昨今の新型コロナウイルスの感染者数は、「オミクロン株」の影響もあり連日大きな数値を記録しています。
先日まで Eyes, JAPANオフィスがある福島県会津若松市においても「まん延防止措置」が発令されていました。
Eyes, JAPANでは、リモートワーク・リモートミーティング等も併用しながら感染防止に気を使って業務を継続しています。
このようなコロナ禍では「感染者数」や「病床使用率」といった情報が、感染動向や医療のひっ迫度合いを表す一つの指標として用いられていますね。
福島県の新型コロナウイルス公式ウェブサイト
以下のウェブサイトでは、福島県内の感染者数・病床使用率などの詳細な情報がわかりやすくまとめられています。(ロードに少し時間がかかります)
https://fukushima-covid19.web.app/
情報は毎日更新されるようです。
毎日自動で届いて欲しい
県のウェブサイトで更新された情報が、毎日手元に届くとしたら便利ではないでしょうか。
そこで、Eyes, JAPAN社内で利用しているコミュニケーションツール「Webex」のプラットフォーム上に自動で情報が投稿されるような仕組みを開発しました。
仕組み
GASを利用する
Google社が提供しているWebサービスのGAS(Google App Script)では、JavaScriptライクなスクリプトによってさまざまな作業の効率化・自動化が可能です。
今回は、GASとWebex BotというWebexの自動投稿機能を利用して開発を行いました。
手順
実装の手順は以下のようになります。
GASで福島県のHPから感染者数などの情報を取得する
↓
データをオブジェクト配列に格納する
↓
Googleスプレッドシートに書き出し
↓
シートの内容を読み込み毎日自動でBot投稿
ソースコード(一部)
以下のソースコードは、ウェブサイトから取得した情報をスプレッドシートに出力するGASコードです。
// -- JSONファイルから必要なデータをParseし、オブジェクト配列に格納する -- //
function ParseJsonObjArray() { // return PatientObjArray
// URLにリクエストしてjsonResponseとしてjsonデータを読み込み、jsonObjArrayに格納
let patientObjArray = [];
let jsonResponse = UrlFetchApp.fetch(TARGET_URL_JSON).getContentText();
let jsonObjArray = JSON.parse(jsonResponse)["patients"]["data"]; // メンバdataの内容をjsonObjArrayに格納
for(let i=0; jsonObjArray[i]; i++){ // jsonObjArrayをpatientObjArrayに格納するループ
patientObjArray.push({
number: (i + 1),
date: jsonObjArray[i]["リリース日"].split("T")[0], // 日付の文字列を"T"の前後で分割して前半(0番目)を残す
place: jsonObjArray[i]["居住地"],
age:jsonObjArray[i]["年代"],
gender: jsonObjArray[i]["性別"],
dateExecute: RECORD_DATE
});
}
patientObjArray = patientObjArray.reverse(); // 新しい順に並べ替え(配列を反転)
return patientObjArray;
}
// -- 前日から新しく更新された事例の数をカウントする -- //
function GetNewCaseLength(patientObjArray){
let newCaseLength = 0;
let lastCaseNumber = sheet1.getRange(1+SHEET_HEADER, 1).getValue(); // シート上の最も新しい事例No.を取得
for(let i=0; patientObjArray[i].number > lastCaseNumber ; i++) { // 最新日のデータがいくつあるかカウント
newCaseLength++;
}
return newCaseLength;
}
// -- GoogleSheetsに出力する -- //
function InsertTodaysDataIntoSheet () { // return newCaseLength
let patientObjArray = ParseJsonObjArray(); // データオブジェクトの生成
let newCaseLength = GetNewCaseLength(patientObjArray); // 新しい事例が何件あるかを取得
let insertRow = 1 + SHEET_HEADER; // データを記録するための行を取得
console.log(patientObjArray);
console.log("new case(s): " + newCaseLength);
if(newCaseLength != 0){ // 新しい事例があるときにのみ実行
sheet1.insertRowsAfter(SHEET_HEADER, newCaseLength); // 新しい事例を記録するための空の行をヘッダーの直後に挿入
for(let i=0; i<newCaseLength; i++){ // patientObjArrayの内容をスプレッドシートに出力するループ
sheet1.getRange(insertRow+i, COLUMN_NUMBER).setValue(patientObjArray[i].number);
sheet1.getRange(insertRow+i, COLUMN_DATE).setValue(patientObjArray[i].date);
sheet1.getRange(insertRow+i, COLUMN_PLACE).setValue(patientObjArray[i].place);
sheet1.getRange(insertRow+i, COLUMN_AGE).setValue(patientObjArray[i].age);
sheet1.getRange(insertRow+i, COLUMN_GENDER).setValue(patientObjArray[i].gender);
sheet1.getRange(insertRow+i, COLMN_RECORD_DATE).setValue(patientObjArray[i].dateExecute);
}
}
}
HTMLのソースから必要な部分だけを抽出する際には、GASの「Parser」というライブラリを使用しました。
実際の投稿
(上から「会津若松市の感染者数」「福島県の感染者数」「福島県の病床使用率」)
GASの「トリガー」機能で、毎日決まった時間に自動投稿されます。
メッセージにはHTMLタグが使えるので、太字などで重要な部分を強調するといいかもしれませんね。
(外国人スタッフでもわかりやすように英語での投稿をしています。)
Bot導入後の所感
実は、Eyes, JAPANの Webex上にはもともと同じ役割のBotが導入されていました。
しかし、少し複雑なシステムを利用していることもあり、比較的易しいGASを利用してリメイクすることになりました。
GASであれば今後のメンテナンスや機能の追加も簡単にできますね。
Botメッセージによってスタッフの感染対策意識をより向上できたら良いと思います。
他にもGASを活用したシステム開発を紹介している記事があるので、よければそちらもご覧くださいね。
空気センサーで数値化した二酸化炭素濃度をWebexにGASで自動通知する
最後までご覧いただきありがとうございました。