ADVERTISEMENT

【Googleスプレッドシート】WeatherAPIで天気予報を取込!都市別の予報を一覧化

【Googleスプレッドシート】WeatherAPIで天気予報を取込!都市別の予報を一覧化
🛡️ 超解決

都市ごとの天気予報をスプレッドシートにまとめて管理したいと思ったことはありませんか。天気予報のデータを手作業で入力するのは手間がかかり、更新も大変です。WeatherAPIという無料の天気APIを利用すれば、Googleスプレッドシートに自動で天気予報を取り込むことができます。この記事では、Apps Scriptを使ってWeatherAPIからデータを取得し、複数都市の予報を一覧表示する方法を詳しく解説します。

【要点】WeatherAPIのデータをスプレッドシートに取り込む3つのステップ

  • WeatherAPIのAPIキーを取得: 無料登録でAPIキーを発行し、スクリプト内で認証に使います。
  • Apps ScriptでURL Fetchを使う: UrlFetchApp.fetch関数でWeatherAPIのエンドポイントにリクエストを送り、JSONレスポンスを取得します。
  • ループ処理で複数都市を一覧化: 都市コードのリストを用意し、forEachで繰り返し取得してシートにまとめます。

ADVERTISEMENT

WeatherAPIとスプレッドシート連携の概要

WeatherAPIは世界中の天気予報を提供するクラウドサービスです。無料プランでも1日あたり1000回のAPI呼び出しが可能で、個人利用には十分な容量です。スプレッドシートから直接APIを呼び出すには、Apps Script(Googleが提供するJavaScriptベースのスクリプト環境)を使います。Apps ScriptのUrlFetchAppクラスを使うと、HTTPリクエストを送信して外部APIのデータを取得できます。

事前に必要なものは、WeatherAPIのアカウント登録とAPIキーの発行、および取得したい都市のID(例:東京は “Tokyo”、ロンドンは “London”)です。APIキーは無料で取得でき、取得したキーはスクリプト内で定数として保存します。

WeatherAPIで天気予報を取得する手順

ここでは、シングル都市の天気予報を取得してシートに書き出す基本的な手順を説明します。まずは1都市で動作を確認し、その後複数都市に対応させます。

  1. WeatherAPIのアカウントを作成しAPIキーを取得する
    WeatherAPIの公式サイト(weatherapi.com)にアクセスし、無料プランでサインアップします。ダッシュボードからAPIキーをコピーし、メモしておきます。このキーはスクリプト内で使用します。
  2. スプレッドシートでスクリプトエディタを開く
    取得したデータを表示するスプレッドシートを開き、メニューから「拡張機能」→「Apps Script」を選択します。スクリプトエディタが新しいタブで開きます。
  3. コード.gsにスクリプトを記述する
    デフォルトのコードを削除し、以下のコードを貼り付けます。APIキーと都市名は自分のものに置き換えてください。
    function getWeather() {
      var apiKey = 'YOUR_API_KEY'; // 取得したAPIキーに置き換え
      var city = 'Tokyo'; // 取得したい都市
      var url = 'http://api.weatherapi.com/v1/forecast.json?key=' + apiKey + '&q=' + city + '&days=3&aqi=no&alerts=no';
      var response = UrlFetchApp.fetch(url);
      var json = JSON.parse(response.getContentText());
      
      var sheet = SpreadsheetApp.getActiveSheet();
      sheet.getRange('A1').setValue('都市');
      sheet.getRange('B1').setValue('日付');
      sheet.getRange('C1').setValue('最高気温(℃)');
      sheet.getRange('D1').setValue('最低気温(℃)');
      sheet.getRange('E1').setValue('天気');
      
      var forecasts = json.forecast.forecastday;
      for (var i = 0; i < forecasts.length; i++) {
        var date = forecasts[i].date;
        var maxTemp = forecasts[i].day.maxtemp_c;
        var minTemp = forecasts[i].day.mintemp_c;
        var condition = forecasts[i].day.condition.text;
        
        sheet.getRange(i + 2, 1).setValue(city);
        sheet.getRange(i + 2, 2).setValue(date);
        sheet.getRange(i + 2, 3).setValue(maxTemp);
        sheet.getRange(i + 2, 4).setValue(minTemp);
        sheet.getRange(i + 2, 5).setValue(condition);
      }
    }
  4. スクリプトを保存し実行する
    スクリプトエディタで保存アイコンをクリックし、関数名「getWeather」を選択して実行ボタンをクリックします。初回は権限の承認を求められます。内容を確認して「許可」をクリックします。
  5. シートにデータが表示されるのを確認する
    実行後、スプレッドシートに戻ると、A列からE列に都市名、日付、最高気温、最低気温、天気が3日分表示されます。これで1都市の取得は完了です。

複数都市の予報を一覧化する手順

上記のコードを改良して、複数の都市をループ処理で取得し、一覧シートにまとめます。都市リストはシート上にあらかじめ用意しておくと便利です。

  1. シートに都市リストを用意する
    スプレッドシートの「都市リスト」という名前のシートを作成し、A列に都市名(例:Tokyo, London, New York)を入力します。見出し行は「都市」としておきます。
  2. 複数都市対応のスクリプトを記述する
    既存のコードを以下のように変更します。都市リストを読み込み、各行の都市に対してAPIを呼び出し、結果を「天気予報」シートに追記します。
    function getWeatherMulti() {
      var apiKey = 'YOUR_API_KEY';
      var ss = SpreadsheetApp.getActiveSpreadsheet();
      var citySheet = ss.getSheetByName('都市リスト');
      var cities = citySheet.getRange(2, 1, citySheet.getLastRow()-1).getValues().flat();
      
      var outputSheet = ss.getSheetByName('天気予報');
      if (!outputSheet) {
        outputSheet = ss.insertSheet('天気予報');
      } else {
        outputSheet.clear();
      }
      
      // 見出し行
      outputSheet.getRange(1,1,1,5).setValues([['都市','日付','最高気温','最低気温','天気']]);
      
      var row = 2;
      cities.forEach(function(city) {
        var url = 'http://api.weatherapi.com/v1/forecast.json?key=' + apiKey + '&q=' + city + '&days=3&aqi=no&alerts=no';
        try {
          var response = UrlFetchApp.fetch(url);
          var json = JSON.parse(response.getContentText());
          var forecasts = json.forecast.forecastday;
          forecasts.forEach(function(forecast) {
            outputSheet.getRange(row,1).setValue(city);
            outputSheet.getRange(row,2).setValue(forecast.date);
            outputSheet.getRange(row,3).setValue(forecast.day.maxtemp_c);
            outputSheet.getRange(row,4).setValue(forecast.day.mintemp_c);
            outputSheet.getRange(row,5).setValue(forecast.day.condition.text);
            row++;
          });
        } catch(e) {
          outputSheet.getRange(row,1).setValue(city);
          outputSheet.getRange(row,2).setValue('エラー');
          row++;
        }
      });
    }
  3. スクリプトを保存し実行する
    関数「getWeatherMulti」を実行します。権限が既に許可されていれば、そのまま処理が進みます。
  4. 「天気予報」シートに一覧が表示される
    都市ごとに3日分の予報が縦に並び、全都市のデータが一覧で確認できます。都市リストの都市を追加・削除すれば、次回実行時に反映されます。

ADVERTISEMENT

注意点と制限事項

APIキーの管理に注意する

APIキーはスクリプト内に直接記述しますが、第三者に見られないようスクリプトエディタのアクセス権限を適切に設定してください。また、スクリプトを共有する場合は、キーを別のシークレットシートに保存し、getValueで読み込む方法も検討します。

無料プランの呼び出し制限を超えない

WeatherAPIの無料プランは1日1000回のAPI呼び出しまでです。都市数×予報日数が1000を超えると制限に引っかかります。例えば、20都市×3日分=60回程度なら問題ありませんが、大規模な場合は有料プランへのアップグレードを検討してください。

エラーハンドリングを実装する

ネットワーク障害や不正な都市名でAPIがエラーを返すことがあります。上記のコードではtry-catchで例外を捕捉し、エラー行を記録しています。さらに詳細なエラー内容をログに出力するには、console.log(e.message)を追加します。

データの更新は手動またはトリガーで

上記のスクリプトは手動実行が前提です。定期的に自動更新したい場合は、スクリプトエディタの左メニューから「トリガー」を設定し、時間主導型(例:毎日午前8時)でgetWeatherMultiを実行するようにします。これで最新の天気予報が自動取得されます。

WeatherAPIの無料プランと有料プランの比較

項目 無料プラン 有料プラン(例:Pro)
API呼び出し回数/日 1000回 50000回
履歴データ なし 過去7日間
予報日数 最大3日 最大14日
リアルタイムデータ あり あり
月額料金 0円 約5ドル~

個人で複数都市の天気予報を管理するなら無料プランで十分です。大量のデータが必要な場合や過去データを分析する場合は有料プランを検討してください。

まとめ

この記事では、WeatherAPIを使ってGoogleスプレッドシートに天気予報を取り込み、複数都市の予報を一覧化する方法を解説しました。Apps ScriptのUrlFetchAppとループ処理を組み合わせることで、手軽に自動化できます。次は、トリガーを設定して毎朝自動更新する仕組みを導入すると、さらに便利になります。また、同様の手法で他のAPI(例えば為替レートやニュース)にも応用できるので、ぜひ活用してみてください。


ADVERTISEMENT

この記事の監修者
✍️

超解決 第一編集部

疑問解決ポータル「超解決」の編集チーム。正確な検証と、現場視点での伝わりやすい解説を心がけています。