2022年2月21日月曜日

自作Web APIは実用に耐えうるかという実験(Google Apps Script)

佐野市 梅林公園


先日、最新のアメダスデータ及び2週間気温予報を取得をするWeb APIを作りました。構成は、Python + Flask + Heroku となっています。



これが果たして実用に耐えうるのか。GAS(Google Apps Script)でWeb APIからのデータの取得を試してみました。うまくいくかな……。


***

Web APIからJSON形式をデータを取得、スプレッドシートに貼り付けるGASを作成。


・アメダスデータの取得

まずは、アメダスデータの取得です。

function getAmdsData() {
  const spreadsheet = SpreadsheetApp.openById("スプレッドシートID");
  const amdsSheet = spreadsheet.getSheetByName("シート名");

  let point = "観測所番号";
  let url = "https://weather-nkkmd.herokuapp.com/amds?point=";
  url = url + point;
 
  //JSONデータの取得
  let response = "";
  try {
    response = UrlFetchApp.fetch(url);
  } catch(e) {
    return response;
  }
  let data = JSON.parse(response.getContentText());

  //スプレッドシートにキー名と値を入力
  let length = Object.keys(data).length;
  let keys = Object.keys(data); 
  let amds = []
  for(let i = 0;  i < length; i++) {
    amds.push(data[keys[i]][0]);
  }
  amdsSheet.getRange(1, 1, 1, length).setValues([keys]);
  amdsSheet.getRange(2, 1, 1, length).setValues([amds]);
}

「スプレッドシートID」「シート名」「観測所番号」は書き換えてください。


実行すると、スプレッドシートの1行目にキー名、2行目に値が入ります。

実行時間は概ね1~2秒程度でした。こんなものですかね?


・2週間気温予報の取得

次は、2週間気温予報の取得です。

タイムゾーンは、「Asia/Tokyo」に変更してください。(「プロジェクトの設定」→「「appsscript.json」マニフェスト ファイルをエディタで表示する」をチェックから「appsscript.json」内を編集。)

function getTwoweekData() {
  const spreadsheet = SpreadsheetApp.openById("スプレッドシートID");
  const twSheet = spreadsheet.getSheetByName("シート名");

  let point = "地域(地点)番号";
  let url = "https://weather-nkkmd.herokuapp.com/twoweek?point=";
  url = url + point;
 
  //JSONデータの取得
  let response = "";
  try {
    response = UrlFetchApp.fetch(url);
  } catch(e) {
    return response;
  }
  let data = JSON.parse(response.getContentText());

  //スプレッドシートに初期日と予報期間を入力
  twSheet.getRange(2, 1).setValue([data["date"][0]]);
  let date = new Date([data["date"][0]]);
  let startDate = new Date([data["date"][0]]);
  let endDate = new Date(date.setDate(date.getDate() + 4));
  let period = [];
  for(i = 0; i < 13; i++) {    
    period.push(Utilities.formatDate(startDate, "JST", "MM/dd") + "-" + Utilities.formatDate(endDate, "JST", "MM/dd"));
    startDate = new Date(startDate.setDate(startDate.getDate() + 1));
    endDate = new Date(endDate.setDate(endDate.getDate() + 1));
  }
  twSheet.getRange(2, 2, 1, 13).setValues([period]);

  //スプレッドシートに気温を入力
  let keys = Object.keys(data); 
  let twoweek = [];
  let ave = [];
  let hi = [];
  let low = [];
  for(let x = 1; x < 5; x++) {
    for(let y = 0; y < 13; y++) {
      ave.push(data[keys[x]]["ave" + y][0]);
      hi.push(data[keys[x]]["hi" + y][0]);
      low.push(data[keys[x]]["low" + y][0]);
    }
    twoweek.push(ave);
    twoweek.push(hi);
    twoweek.push(low);
    ave = [];
    hi = [];
    low = [];
  }
  twSheet.getRange(3, 2, 12, 13).setValues(twoweek);
}

「スプレッドシートID」「シート名」「地域(地点)番号」は書き換えてください。

シートは、下のキャプチャのような感じであらかじめ項目を作っておきます。



実行すると、A2に初期日、B2~N2に予報対象期間、B3~N14に各気温が入ります。

実行時間は概ね5~10秒程度でした。若干の処理を挟むので、やはりアメダスよりは時間がかかりますね。


-----
追記(2022-4-18)

原木椎茸の収穫日予測システムを作ってみる」で1か月程度、特に問題なく稼働しています。
-----


***

ということでした。とりあえずとりあえず。

あとはトリガーを設定すれば定期的に値を取ってきてくれます。ただ、サーバーとしてHerokuの無料プランを使っているので、毎日再起動時間が発生するようです。そのタイミングはエラーになるかも。

あとは、わざわざWeb APIを経由する必要があるのか、別に気象庁から直接でいいんじゃないのかという根本的問題はありますね(笑)。


(冒頭の写真は、先日行った佐野市の梅林公園です。ちょっとだけ咲いていました。)




・関連投稿
2週間気温予報のデータを JSON 形式で取得する Web API を作りました。