見出し画像

【コロナ対策】OpenWeatherMapからの気象情報をGoogleスプレッドシートに1時間毎に貼り付けるGoogle Apps Script【作ってみた】

秋冬型の『加湿を主としたコロナ対策』の目安のために、外気の【絶対湿度】を定期的に記録しておきたいものです
(※一般的にインフルエンザウィルスの危険度は絶対湿度7g/㎥以下で危険とされているので、個人的に同じくらい(7g/㎥以下)でコロナも危険なのかな?って感じで意識的に加湿したりしてます)

そのためにOpenWeatherMap社のAPIを利用して、近所の気象ポイントの気象データを1時間毎に時間トリガーで取得するGoogle Apps Scriptを作ってみました

Google Apps Scriptの1時間毎の定期実行には、GASの時間トリガーを使っています

※このように定期的に気象情報を取得・記録しておくことはスマート農業にも応用できる気がしています
※高校生は進学や就職したい土地の気象情報をあらかじめこの情報を利用してスプレッドシートに記録しておくと、進学・就職での引っ越し後の生活圏の気象情報をあらかじめ知ることが可能だと思います

コードは以下のようなものです
(DarkSky用のGASを改造したので若干コードが汚いです)

// Register for an API key at http://openweathermap.org/appid
// and enter the key below.
var OPEN_WEATHER_MAP_API_KEY = 'INSERT_OPEN_WEATHER_MAP_API_KEY_HERE';
var LAT = 'LATITUDE_HERE';
var LON = 'LONGITUDE_HERE';

function myFunction() {
 // シート取得
 var ss = SpreadsheetApp.openById(SpreadsheetApp.getActiveSpreadsheet().getId());
 var sheet = ss.getSheetByName("シート1");
 // Dateオブジェクトを作成
 var d = new Date() ;

 // UNIXタイムスタンプを取得する (ミリ秒単位)
 var a = d.getTime() ;

 // UNIXタイムスタンプを取得する (秒単位 - PHPのtime()と同じ)
 var datetime = Math.floor( a / 1000 ) ;

 //DarkSky API 呼び出し
 var requestUrl = Utilities.formatString(
   'https://api.openweathermap.org/data/2.5/onecall?lat=%s&lon=%s&exclude=minutely,hourly,daily&&units=metric&lang=ja&appid=%s',
   encodeURIComponent(LAT),
   encodeURIComponent(LON),
   encodeURIComponent(OPEN_WEATHER_MAP_API_KEY));

 Logger.log(requestUrl);
 var response = UrlFetchApp.fetch(requestUrl);
 var jsonString = response.getContentText();
 if (response.getResponseCode() != 200) {
   throw Utilities.formatString(
       'Error returned by API: %s, Location searched: %s.',
       response.getContentText(), 'iyo-shi');
 }

 var data = JSON.parse(jsonString);


 Logger.log(data);
 var latitude = data.lat;
 var longitude = data.lon;
 var timezone = data.timezone;
 var offset = data.timezone_offset;
 var time = data.current.dt;
 var weather = data.current.weather[0].description;
 //var icon = data.current.icon;
 //var precipIntensity = data.current.precipIntensity;
 //var precipProbability = data.current.precipProbability;
 //var precipType = data.current.precipType;
 var temperature = data.current.temp;
 var apparentTemperature = data.current.feels_like;
 var dewPoint = data.current.dew_point;
 var humidity = data.current.humidity;
 var abhumidity = 2.17*(6.1078*10**(7.5*temperature/(temperature+237.3)))/(temperature+273.15)*humidity;
 var pressure = data.current.pressure;
 var windSpeed = data.current.wind_speed;
 //var windGust = data.current.wind_gust;
 var windBearing = data.current.wind_deg;
 //var cloudCover = data.current.cloudCover;
 var uvIndex = data.current.uvi;
 var visibility = data.current.visibility;
 var clouds = data.current.clouds;
 //var ozone = data.current.ozone;
 var date = new Date(time * 1000);
 var DateTime =  Utilities.formatDate(date, 'JST', 'yyyy年M月d日 H時m分')
 sheet.appendRow([latitude,longitude,timezone,offset,DateTime,weather,temperature,apparentTemperature,dewPoint,humidity,abhumidity,pressure,windSpeed,windBearing,visibility,uvIndex,clouds]);
}

OpenWeatherMapはこちらです
(このコードで使用しているAPI:onecall-APIは1日1000アクセスまで無料です)

すでに愛媛県のデータで2021年10月3日に、絶対湿度9g/㎥台を記録しているので北の地域などではワクチン接種済みでも注意されたほうが賢明かと思います

中学生や高校生のかたの、GIGAスクール端末を使ってのITの学習用にも簡単なプログラムですので、一度暇な時ににでも試しに作ってみるといいかもしれません

参考まで

【お願い】

自由に真似て作っていただいてかまわないのですが、もし便利に使えたのであれば説明冒頭にあるニコニコ動画にコメントなどいただくと嬉しいです

【その他】

Googleスプレッドシートから「AppSheet」という機能・アプリを使うと、ノーコードでスプレッドシート一覧をスマホのアプリで見ることができるようになります(こちらもデプロイ前のプレビューとしての実装であれば無料で個人的に利用できます)
_RowNumber降順にしておくと最新のデータが一番上に表示されます

まとめ

こういった実用的なプログラムを暇な時にちょちょっと書いて試せるのは自分がエンジニアの端くれでホントによかったと思っていますし、こういったモノが無料で作れる環境が企業さんの努力によって実現されていることに感謝の意を表したいと思います

読んでいただいてありがとうございます。個人で情報を集めています。サポートいただいたら情報収集に使わせていただきます。