中級向け

定期実行でAPIを叩いて集計して通知する型(n8n テンプレート配布)

毎朝APIから複数地域のデータを取り、地域ごとに集計して通知用の本文にまとめるワークフローです。インポートできるJSONを配布しています。文字列のまま集計すると平均が null になる件も、実際に起こして確かめました。

動作確認: — n8n 2.36.8

「毎朝APIからデータを取って、まとめて通知する」 は、業務自動化で一番よく作る形だと思います。

取得して、整形して、集計して、送る。書いてしまえば4手順ですが、 それぞれに落とし穴があります。 このサイトで検証してきた内容を、1本のワークフローに まとめました。

weather-digest.json をダウンロード

認証情報を使いません。気象庁の公開APIを叩くだけなので、インポートしてすぐ動きます。

何をするか

毎朝7時に、複数地域の降水確率を取得し、地域ごとに最大と平均を出して、 そのまま送れる本文にまとめます。

実際に動かした結果です。

【今日の降水確率】
東京地方: 最大 80% / 平均 64%
大阪府: 最大 80% / 平均 54%
福岡地方: 最大 80% / 平均 50%
北九州地方: 最大 80% / 平均 50%
筑豊地方: 最大 80% / 平均 50%
筑後地方: 最大 80% / 平均 50%
伊豆諸島北部: 最大 60% / 平均 50%
伊豆諸島南部: 最大 50% / 平均 40%
小笠原諸島: 最大 20% / 平均 16%

降水確率が高い順に並びます。

入れ方

  1. JSONをダウンロードする
  2. n8n の右上 ... から Import from File…
  3. Execute workflow を押す
インポートして実行した後のn8nキャンバス。上に説明の付箋があり、下に6つのノードが並んでいる。線の上に 1 item、3 items、6 items、58 items、9 items、1 item と件数が表示され、エラー側は0 items
実行後。線の上の件数が 1 → 3 → 6 → 58 → 9 → 1 と変わっていきます

線の上の件数を見てください。 3地域を指定したのに、取得した直後は 6 items です。 そこから降水確率を1件ずつにばらして 58 items、集計して 9 items、 最後に1件にまとめています。この増減がこのワークフローの中身です。

取りたい地域を変えるときは、「取得する地域」 の中を書き換えるだけです。

return [
  { json: { label: '東京', areaCode: '130000' } },
  { json: { label: '大阪', areaCode: '270000' } },
  { json: { label: '福岡', areaCode: '400000' } },
];

文字列のまま集計すると、平均が null になる

このテンプレートで一番気をつけたところです。

気象庁APIが返す降水確率は、数字に見えて文字列です。

"pops": ["20", "30", "80", "70", "50"]

これをそのまま Summarize の平均に渡すと、どうなるか。 両方を並べて実行して確かめました。

渡したもの average の結果
Number(p) で数値に直したもの 64
文字列のまま null

Webhook で受けたクエリも文字列ですし、 Merge では 1 と '1' が一致しません。 APIから来た数字は、まず型を疑うのが安全です。

3地域を指定しても、3行にはならない

上の出力を見てください。9行あります。

気象庁のAPIは、1つの県の中をさらに細かい区域に分けて返します。 東京都なら「東京地方 / 伊豆諸島北部 / 伊豆諸島南部 / 小笠原諸島」の4区域です。

失敗した地域があっても止まらない

「予報を取得」にはエラー出力を繋いであります。

1地域が取得できなくても、残りの地域の集計は出ます。 失敗した分は 「失敗を1行にまとめる」に流れ、どの地域が落ちたか分かる形で残ります。

{ "label": "大阪", "areaCode": "999999", "httpCode": "404",
  "message": "The resource you are requesting could not be found" }

この型の詳しい説明は 1件失敗しても止まらない取得ワークフロー に書きました。

通知の繋ぎ方

「通知の形に整える」の後ろに Slack やメールを繋ぐだけです。 テンプレートには含めていません。使うサービスが環境によって違うためです。

本文には 本文 をそのまま入れられます。

{{ $json.本文 }}

明細が要るなら {{ $json.明細 }} に集計結果の配列が入っています。

なお、ワークフロー全体が失敗したときの通知は別の仕組みです。 共通エラー通知のテンプレート と組み合わせてください。

使い回すには

このテンプレートは気象庁APIを例にしていますが、形は他のAPIでも同じです。

  1. 取得する対象の一覧をつくる
  2. HTTP Request で取りに行く(エラー出力つき)
  3. 集計しやすい形に1件ずつばらす
  4. Summarize でグループごとに集計する
  5. 通知の形に整える

3番を丁寧にやるかどうかで、後の苦労が変わります。型を揃え、空の値を捨て、 1件1行にしておくと、集計が素直に通ります。

検証していないこと

  • 通知ノードは繋いでいません。 Slack やメールに実際に届くところまでは見ていません
  • 定時実行(Publish して7時を待つ)は試していません。 手動実行での確認だけです。 タイムゾーンは環境の設定を引き継ぐので、7:00がいつになるかは各自で確認してください
  • 失敗した場合の動作は、別記事で確認した内容です。このテンプレートで 実際に地域コードを壊して試してはいません
  • 気象庁APIの仕様変更には追随していません。 timeSeries[1] に降水確率が入る前提で 書いています。構造が変われば動かなくなります
  • 試したのは 3地域・9区域です。数十地域に増やしたときの所要時間は見ていません

次に読む