凛です。
先日、夜勤明けにぼーっとスマホを眺めていたら、ふと「今年の梅雨って、雨の日どれくらいあったんだろう?」と気になりました。なんとなくの記憶では「今年はよく降ったなあ」なのですが、それを裏付ける記録が手元に何もないんですよね。
天気予報アプリはたくさんあるのに、「毎日の天気を勝手に記録して、あとから見返せるもの」って意外とありません。子どもの体調管理や、洗濯物を干せた日のメモ、家庭菜園の記録……気圧や気温と体調を並べて見たいこともよくあります。それなら、いつものGAS(Google Apps Script)で作ってしまえばいい、と思い立ちました。
しかも今回使う天気API「Open-Meteo」は、APIキーの登録すらいらない無料サービスです。会員登録もクレジットカードも不要。GASのUrlFetchAppでURLを叩くだけで、気温と天気が返ってきます。この記事では、その天気を毎朝7時に自動でスプレッドシートへ書き込む仕組みを、実際に動くコードと一緒に丁寧に解説していきます。
GASと無料天気APIで「毎朝の天気記録帳」を作る
まずは、これから作るものの全体像を掴んでおきましょう。難しそうに聞こえますが、やることはとてもシンプルです。
今回作る仕組みの全体像
やることを分解すると、たった3ステップです。
3つのステップだけで完成する
- 天気APIにアクセスして、今の気温と天気を取ってくる
- 返ってきた天気コードを日本語に変換する(「61」を「雨」にする、など)
- スプレッドシートに1行追記する(日付・気温・天気)
このうち一番のキモが「天気API」です。天気の情報って、自分で観測するわけにはいきませんよね。誰かが観測してくれた天気データを、インターネット越しに分けてもらう必要があります。その窓口が「天気API」です。
なぜOpen-Meteoを選ぶのか
天気APIはいくつもありますが、多くは「無料プランでも会員登録が必要」だったり、「APIキー(会員証のような文字列)を発行して、アクセスのたびに提示する」必要があったりします。初心者にとっては、この登録作業でつまずくことが本当に多いんです。
その点、今回使う**Open-Meteo(オープンメテオ)**は、非営利のオープンデータプロジェクトで、個人利用・非商用なら登録もAPIキーも不要。URLにアクセスするだけで天気が返ってきます。GASの練習には最高の相手です。
| 項目 | Open-Meteoの場合 |
|---|---|
| 会員登録 | 不要 |
| APIキー | 不要(個人・非商用の範囲) |
| 料金 | 無料 |
| GASからの利用 | UrlFetchAppでそのまま叩ける |
| 返ってくる形式 | JSON(GASで扱いやすい) |
※Open-Meteoの無料枠は「個人・非商用利用」向けです。商用サービスに組み込む場合は公式サイトの利用条件(有料の商用プラン)を確認してください。今回の「自分用の記録帳」なら無料の範囲で問題ありません。
Open-Meteoからデータを取ってみる
まずは、GASのコードを書く前に「どんなURLで、どんなデータが返ってくるのか」を頭に入れておきましょう。ここが分かると、あとのコードがぐっと理解しやすくなります。
アクセスするURLの形
Open-Meteoで今の天気を取るURLは、次のような形をしています(東京の例です)。
https://api.open-meteo.com/v1/forecast?latitude=35.68&longitude=139.76¤t=temperature_2m,weather_code&timezone=Asia%2FTokyo
? より後ろが「条件」を表すパラメータで、意味はこうです。
latitude=35.68… 緯度(東京の例)longitude=139.76… 経度(東京の例)current=temperature_2m,weather_code… 「今の」気温と天気コードをちょうだい、という指定timezone=Asia%2FTokyo… 時刻を日本時間で扱う指定(%2Fはスラッシュ/を安全に書いた形)
緯度・経度は、お住まいの地域のものに変えると、その地域の天気が取れます。調べ方は後ろのセクションで説明します。
返ってくるJSONの中身
このURLにアクセスすると、こんな形のJSON(データのかたまり)が返ってきます。
{
"latitude": 35.68,
"longitude": 139.76,
"timezone": "Asia/Tokyo",
"current": {
"time": "2026-07-22T07:00",
"temperature_2m": 27.3,
"weather_code": 61
}
}
私たちが欲しいのは、この中の current の中にある2つだけです。
current.temperature_2m… 気温(℃)。この例なら27.3current.weather_code… 天気を表す数字コード。この例なら61
「61」だけ見てもピンときませんが、これは「雨(弱い雨)」を表すコードです。この数字コードを日本語に翻訳するのが、次のポイントになります。
天気コード(WMOコード)を日本語に変換する
Open-Meteoが返してくる天気は、数字の「WMO天気コード」という世界共通の番号です。このままシートに 61 と記録しても意味が分かりにくいので、日本語に翻訳する仕組みを作ります。
主要なWMO天気コード一覧
WMOコードは全部で数十種類ありますが、日常でよく出てくる主要なものだけ押さえれば十分です。よく見かけるコードを表にまとめました。
| コード | 意味 |
|---|---|
| 0 | 快晴 |
| 1 | 晴れ |
| 2 | 薄曇り |
| 3 | 曇り |
| 45 | 霧 |
| 48 | 霧(着氷) |
| 51 / 53 / 55 | 霧雨(弱〜強) |
| 61 / 63 / 65 | 雨(弱〜強) |
| 71 / 73 / 75 | 雪(弱〜強) |
| 80 / 81 / 82 | にわか雨(弱〜強) |
| 85 / 86 | にわか雪 |
| 95 | 雷雨 |
| 99 | ひょうを伴う雷雨 |
全コードを網羅しなくても、表にないコードは「その他」として扱えば大丈夫です。実際のコードでもそのように書きます。
コードでの変換のやり方
変換用のマップを用意する
GASでは、コードと日本語をペアにした「マップ(対応表のようなもの)」を作っておき、そこから探す形にすると分かりやすいです。
// ※構文・API仕様を確認済み(GAS V8ランタイム向け)
// WMO天気コードと日本語の対応表をつくる関数
function weatherCodeToText(code) {
// コードをキー、日本語を値にした対応表(オブジェクト)
const map = {
0: '快晴', // 雲がほとんどない状態
1: '晴れ', // おおむね晴れ
2: '薄曇り', // 雲がやや多い
3: '曇り', // 全体が雲
45: '霧', // 霧が出ている
48: '霧(着氷)', // 凍る霧
51: '弱い霧雨', // 細かい弱い雨
53: '霧雨', // ふつうの霧雨
55: '強い霧雨', // やや強い霧雨
61: '弱い雨', // 弱い雨
63: '雨', // ふつうの雨
65: '強い雨', // 強い雨
71: '弱い雪', // 弱い雪
73: '雪', // ふつうの雪
75: '強い雪', // 強い雪
80: 'にわか雨', // 弱いにわか雨
81: '強いにわか雨', // 強めのにわか雨
82: '激しいにわか雨', // 激しいにわか雨
85: 'にわか雪', // にわか雪
86: '強いにわか雪', // 強いにわか雪
95: '雷雨', // 雷を伴う雨
99: 'ひょうを伴う雷雨' // ひょうと雷
};
// 対応表にコードがあればその日本語を、なければ「その他(コード:◯◯)」を返す
return map[code] || ('その他(コード:' + code + ')');
}
map[code] で対応する日本語を探し、見つからなければ || の右側「その他」を返す仕組みです。この「見つからなければフォールバックする」書き方は、想定外のコードが来ても壊れないための保険になります。
動作を確認する小さなテスト
いきなり本番コードを書く前に、この変換関数だけを試すと安心です。
// ※構文・API仕様を確認済み(GAS V8ランタイム向け)
// 変換関数の動作確認用(実行してログを見るだけ)
function testWeatherCode() {
Logger.log(weatherCodeToText(0)); // 「快晴」と出るはず
Logger.log(weatherCodeToText(61)); // 「弱い雨」と出るはず
Logger.log(weatherCodeToText(999)); // 表にない → 「その他(コード:999)」
}
GASエディタで testWeatherCode を選んで実行し、「実行ログ」に期待どおりの日本語が出れば、変換部分は完成です。
GASからOpen-Meteoを呼び出すコードを書く
いよいよ、実際にAPIへアクセスするコードです。ここで使うのがGASの UrlFetchApp という、外部のURLにアクセスするための機能です。
UrlFetchAppで天気を取得する
基本の取得コード
まずは「天気を取ってきてログに出すだけ」の最小コードです。
// ※構文・API仕様を確認済み(GAS V8ランタイム向け)
// Open-Meteoから今の天気を取得する関数
function fetchWeather() {
// 緯度・経度(東京の例。自分の地域に変えてください)
const latitude = 35.68;
const longitude = 139.76;
// アクセスするURLを組み立てる(timezoneはAsia/Tokyoを指定)
const url = 'https://api.open-meteo.com/v1/forecast'
+ '?latitude=' + latitude
+ '&longitude=' + longitude
+ '¤t=temperature_2m,weather_code'
+ '&timezone=Asia%2FTokyo';
// URLにアクセスしてレスポンス(返事)を受け取る
const res = UrlFetchApp.fetch(url);
// 返事の本文(文字列)をJSONとして解釈する
const data = JSON.parse(res.getContentText());
// currentの中から気温と天気コードを取り出す
const temperature = data.current.temperature_2m; // 気温(℃)
const weatherCode = data.current.weather_code; // 天気コード(数値)
// 天気コードを日本語に変換
const weatherText = weatherCodeToText(weatherCode);
// 結果をログに出して確認
Logger.log('気温: ' + temperature + '℃ / 天気: ' + weatherText);
}
UrlFetchApp.fetch(url) でアクセスし、res.getContentText() で本文を文字列として取り出し、JSON.parse() でGASが扱えるデータに変換する――この3点セットが、外部APIを使うときの定番の流れです。
レスポンスコードのチェックを入れる
上のコードでも動きますが、もっと丁寧にするなら「ちゃんと正常に返ってきたか」を確認しましょう。res.getResponseCode() が 200 なら正常です。
// ※構文・API仕様を確認済み(GAS V8ランタイム向け)
// 正常チェック付きの取得関数
function fetchWeatherSafe() {
const url = 'https://api.open-meteo.com/v1/forecast'
+ '?latitude=35.68&longitude=139.76'
+ '¤t=temperature_2m,weather_code'
+ '&timezone=Asia%2FTokyo';
// muteHttpExceptions:true でエラー時も例外にせず自分で判定する
const res = UrlFetchApp.fetch(url, { muteHttpExceptions: true });
// HTTPステータスコードを取得(200なら成功)
const code = res.getResponseCode();
if (code !== 200) {
// 200以外なら記録せず、ログに残して終了
Logger.log('取得に失敗しました。ステータス: ' + code);
return null; // 呼び出し元に「失敗」を伝える
}
// 正常なら中身を返す
return JSON.parse(res.getContentText());
}
muteHttpExceptions: true を付けると、エラーが返ってきてもGASが即座に止まらず、自分で getResponseCode() を見て判断できるようになります。ネット越しの通信は必ず成功するとは限らないので、この一手間が安定運用のコツです。
スプレッドシートに毎日の天気を追記する
天気が取れたら、あとはスプレッドシートに書き込むだけです。GASの appendRow を使えば、シートの一番下に1行追加できます。
シートを準備する
見出し行を用意しておく
まず、記録用のスプレッドシートを新規作成し、1行目に見出しを入れておきましょう。
| 日付 | 気温(℃) | 天気 |
|---|
「拡張機能 → Apps Script」からエディタを開けば、そのスプレッドシートに紐づいたコードが書けます。
日付を日本の形式に整える
記録するとき、日付は見やすい形にしておきたいですよね。GASの Utilities.formatDate を使います。
// ※構文・API仕様を確認済み(GAS V8ランタイム向け)
// 今日の日付を「2026/07/22」の形にして返す
function getTodayString() {
// 第1引数:日付, 第2引数:タイムゾーン, 第3引数:表示形式
return Utilities.formatDate(new Date(), 'Asia/Tokyo', 'yyyy/MM/dd');
}
タイムゾーンに Asia/Tokyo を必ず指定するのがポイントです。指定しないと、サーバー側の時刻とズレて前日の日付になってしまうことがあります。
取得から記録までをつなげる
完成版のメイン関数
ここまでの部品を全部つないだ、完成版のコードがこちらです。この関数を毎朝実行すれば、天気が自動で記録されていきます。
// ※構文・API仕様を確認済み(GAS V8ランタイム向け)
// メイン関数:天気を取得してシートに1行追記する
function recordTodayWeather() {
try {
// ① 天気データを安全に取得(前セクションの関数を使う)
const data = fetchWeatherSafe();
// 取得に失敗していたら(nullなら)ここで終了
if (!data) {
Logger.log('天気が取れなかったので記録をスキップしました');
return;
}
// ② 気温と天気コードを取り出す
const temperature = data.current.temperature_2m; // 気温(℃)
const weatherCode = data.current.weather_code; // 天気コード
const weatherText = weatherCodeToText(weatherCode); // 日本語に変換
// ③ 今日の日付を整形
const today = Utilities.formatDate(new Date(), 'Asia/Tokyo', 'yyyy/MM/dd');
// ④ 現在のスプレッドシートのアクティブなシートを取得
const sheet = SpreadsheetApp.getActiveSpreadsheet().getActiveSheet();
// ⑤ 一番下の行に「日付・気温・天気」を追記
sheet.appendRow([today, temperature, weatherText]);
// ⑥ 記録できたことをログに残す
Logger.log('記録しました: ' + today + ' / ' + temperature + '℃ / ' + weatherText);
} catch (e) {
// 想定外のエラーが起きてもログに残して落ち着いて終わる
Logger.log('エラーが発生しました: ' + e.message);
}
}
try ~ catch で全体を包んでいるので、通信の失敗や想定外のデータが来ても、エラーで大騒ぎにならず、静かにログを残して終わります。毎日自動で動かすものだからこそ、この安全網が効いてきます。
一度手動で実行して確認
自動化する前に、必ず一度 recordTodayWeather を手動で実行しましょう。初回は「承認(アクセス許可)」を求められますが、これは自分のスプレッドシートと外部URLにアクセスするための正規の手続きなので、案内に従って許可すればOKです。シートに1行増えていれば成功です。
毎朝7時に自動で記録する設定
手動で動くことを確認したら、最後は「毎朝勝手に動く」ように時間主導トリガーを設定します。ここまでくれば、あとは放っておくだけで天気が貯まっていきます。
トリガーの設定手順
画面から設定する
- GASエディタの左側にある**目覚まし時計のアイコン(トリガー)**をクリック
- 右下の「トリガーを追加」を押す
- 実行する関数に
recordTodayWeatherを選ぶ - イベントのソースを「時間主導型」にする
- 「日付ベースのタイマー」を選び、時刻を「午前7時〜8時」に設定
- 保存する
これだけで、毎朝7時台に自動で天気が記録されます。トリガーの時刻は「7時ちょうど」ではなく「7〜8時のあいだ」という幅を持った指定になりますが、記録帳としては十分です。
なぜ手動実行を先にやるのか
トリガーで動く前に手動実行が必要なのは、承認(アクセス許可)を先に済ませておくためです。承認していない状態でトリガーだけ設定すると、初回が権限エラーで失敗することがあります。順番を守るとつまずきません。
つまずきやすいポイントと回避策
私が実際に作ったときに引っかかった点を、回避策とあわせてまとめておきます。
失敗と回避策
失敗1:日付が1日ズレる
new Date() をそのまま文字列にしたら、日付がおかしくなりました。原因はタイムゾーン。Utilities.formatDate の第2引数に Asia/Tokyo を必ず指定して解決しました。
失敗2:たまに記録が空欄になる
ごくまれにAPIから正常な返事が来ず、エラーで止まっていました。muteHttpExceptions: true とレスポンスコードのチェックを入れ、失敗した日は記録をスキップするようにして安定しました。
失敗3:天気コードが「その他」ばかりになる
最初、変換マップに主要コードしか入れていなかったのに、|| のフォールバックを書き忘れていて、表にないコードでエラーになっていました。「その他(コード:◯◯)」を返す保険を入れて解決。あとから、よく出るコードを表に追記していけばOKです。
失敗4:緯度経度を間違えて別の地域の天気に 自分の地域の緯度経度は、地図アプリで自宅付近を長押しすると表示されます。桁を間違えると海の上の天気などになるので、一度手動実行して気温が現実的な値か確認するのがおすすめです。
やりすぎ注意(APIへの配慮)
Open-Meteoは無料でAPIキーもいりませんが、だからといって連打していいわけではありません。1日1回、毎朝の記録なら全く問題ありませんが、テスト中に何度も実行するときも常識的な間隔を空けましょう。
また、GAS側にも UrlFetchApp の呼び出し回数に1日あたりの上限(無料アカウントで1日あたり数万回程度)があります。毎朝1回の記録なら上限に触れることはまずありませんが、「ループで大量に叩く」ような使い方は避けるのが無難です。無料APIは仕様が変わる可能性もあるので、うまく動かなくなったら公式のドキュメントを確認してください。
まとめ:小さな自動化が毎日を少し楽にする
天気の自動記録は、それ単体では地味かもしれません。でも、こうして毎日データが貯まっていくと、「今月は雨が多かった」「この気温の日は子どもが咳込みやすい」など、あとから振り返れる財産になります。
なにより、APIキーもいらない無料APIを、GASのUrlFetchAppで叩くだけという体験は、他のいろんな自動化への入り口になります。天気が取れたなら、次は為替でも、ニュースでも、同じやり方で取ってこられます。まずはこの小さな記録帳から、外の世界のデータをGASに取り込む感覚を掴んでみてください。
自分でも作れるようになりたい方へ
「コードなんて自分には無理」と思っていた私でも、こうして小さな自動化を一つずつ積み重ねてこられました。天気の記録帳のような身近なテーマから始めると、つまずいても「まあいいか」と気楽に続けられます。もし体系的に学んでみたくなったら、独学に行き詰まる前に、手を動かしながら学べる環境をのぞいてみるのも近道です。あなたのペースで、少しずつで大丈夫です。
Dive into Code(未経験からエンジニアを目指すプログラミングスクール)
関連記事(あわせて読みたい)
- /blog/gas-trigger-clock-every-day/ … 今回使った「毎日決まった時刻に実行するトリガー」の設定を、もっと詳しく解説しています。
- /blog/gas-spreadsheet-daily-auto/ … 毎日自動でスプレッドシートを更新する仕組みの基本。天気以外の記録にも応用できます。
- /blog/gas-sheet-timestamp-auto/ … 記録した行に時刻を自動で残すテクニック。ログ管理と相性ばつぐんです。
この記事を書いた人:凛
2児のママで現役ナース。夜勤明けの細切れ時間を副業GASに投じ、月5〜8万円の副収入を継続中。「看護師でもコードは書ける」を合言葉に、家事育児とプログラミングを両立する等身大の情報を発信しています。
※掲載コードは構文とAPI仕様を確認して載せていますが、お使いの環境に合わせて調整してください。