JSFiddleでgmaps.jsが動かない原因と動かすための完全ガイド

JSFiddleでgmaps.jsが動かない原因と動かすための完全ガイド

はじめに (対象読者・この記事でわかること)

本記事は、JSFiddle上でGoogle Mapsを手軽に扱えるライブラリ「gmaps.js」を試したいフロントエンド初学者〜中級者を対象にしています。gmaps.jsは導入しやすい反面、JSFiddle特有の読み込み順やGoogle Maps APIキー、リファラ制限などの落とし穴で「動かない」状況に陥りがちです。この記事では、JSFiddleでgmaps.jsが動かない典型的な原因を整理し、最小構成の動作例、正しいスクリプトの読み込み順、APIキー設定、コンソールエラーの読み解き方まで実践的に解説します。読了後には、エラーを自力で切り分け、安定して地図を表示できるようになります。

前提知識

この記事を読み進める上で、以下の知識があるとスムーズです。 - HTML/CSS/JavaScriptの基本的な知識 - ブラウザのDevTools(Console/Network)の基本操作

なぜJSFiddleでgmaps.jsが動かないのか:概要・背景

gmaps.jsはGoogle Maps JavaScript APIをラップして扱いやすくする軽量ライブラリです。ローカルの静的HTMLでは問題なく動くコードが、JSFiddle上では突然動かなくなることがあります。主な要因は次の通りです。

1) Google Maps APIキーとリファラ制限 - Google MapsはAPIキーが必須です(トライアルでも)。キーが無効・未設定・ドメイン制限の不一致で読み込みが失敗します。 - JSFiddleは実行時にfiddleのサブドメインや結果表示用ドメインが使われるため、リファラ制限の設定を誤ると403やエラーコードMissingKey, RefererNotAllowedMapError等になります。

2) スクリプト読み込み順と「onload」タイミング - gmaps.jsはMaps APIのグローバルgoogleオブジェクトに依存します。Maps APIより先にgmaps.jsや初期化コードを動かすとundefinedエラーになります。 - JSFiddleの「onLoad」「no wrap」などのオプションによって実行タイミングが変化します。

3) Mixed Content/HTTPSとエンドポイント - JSFiddleはHTTPSで動作します。Google Maps APIやgmaps.jsをHTTPで読み込むとブロックされます。

4) CSP/サンドボックスと外部リソース - 外部スクリプトURLの指定ミスや、古いCDN/URLの利用で404→初期化失敗に繋がります。

本記事では、これらのポイントを押さえた「最小構成」を提示しつつ、JSFiddle固有の設定まで踏み込んで解説します。

JSFiddleで動かすための具体手順と実装

以下は、JSFiddleでgmaps.jsを確実に動作させるためのステップです。

ステップ1:Google CloudでAPIキーを準備

1) Google Cloud Consoleでプロジェクト作成 - Google Cloud Consoleにアクセスし、新規プロジェクトを作成。

2) API有効化 - APIs & Services > Library から「Maps JavaScript API」を有効化。

3) APIキー発行と制限 - APIs & Services > Credentials でAPIキーを作成。 - Application restrictions: HTTP referrers(ウェブサイト)を選択。 - リファラに以下例を登録(用途に応じて最小限にする) - https://jsfiddle.net/ - https://fiddle.jshell.net/ - https://.jsfiddle.net/ - API restrictionsは「Maps JavaScript API」を指定してもよい(推奨)。

4) 請求の有効化 - Mapsは請求アカウント必須(無料枠あり)。未設定だとエラーになります。

ポイント - 一時検証ならリファラ制限を緩めて挙動確認→問題なければ最小化するのが安全。

ステップ2:JSFiddleの設定

1) フレームワークと拡張 - JSFiddleの左ペイン「Frameworks & Extensions」で外部リソースを設定せず、HTML内で明示的にscriptタグを並べるのが安全です(読み込み順を自分で制御するため)。

2) JavaScriptの実行タイミング - 左ペイン「JavaScript settings」で「onLoad」または「No wrap - in 」を意識。 - 本記事の例では「onLoad」を推奨。地図初期化はwindow.initMapとしてコールバックで実行します。

3) 結果パネルの高さ - Mapコンテナに高さが無いと地図が見えません。CSSで高さを指定。

ステップ3:最小構成のコード例(そのまま貼り付け可能)

HTMLパネルに以下を貼り付け(API_KEY_HEREを置き換え)。JSパネルは空でOKです。

<div id="map" style="width:100%;height:360px;"></div>

<!-- gmaps.js(公式CDNがメンテ薄のため信頼できるミラーを使用。必要に応じてバージョン固定) -->
<script src="https://cdn.jsdelivr.net/npm/gmaps@0.4.25/gmaps.min.js"></script>

<!-- Maps JavaScript API(callback=initMapで初期化) -->
<script>
  // JSFiddleのonLoad設定に依存せず、コールバックで確実に初期化する
  function initMap() {
    // gmaps.jsは内部でgoogle.mapsを前提とする。ここまでにMaps APIが読めていることが重要。
    var map = new GMaps({
      el: '#map',
      lat: 35.6809591,
      lng: 139.7673068,
      zoom: 14
    });

    map.addMarker({
      lat: 35.6809591,
      lng: 139.7673068,
      title: 'Tokyo Station',
      infoWindow: { content: '<b>Tokyo Station</b>' }
    });
  }
</script>
<script async defer
  src="https://maps.googleapis.com/maps/api/js?key=API_KEY_HERE&callback=initMap">
</script>

ポイント - gmaps.min.jsを先に読み込み、次にMaps APIをcallback付きで読み込みます。 - initMapはグローバル関数としてwindowに公開される必要があります(上記のようにトップレベル関数でOK)。 - CSSで#mapに高さを設定しないと見えません。

代替の読み込み順について - 一般にMaps API→gmaps.jsの順で読むサンプルもありますが、初期化をcallbackで遅延するなら上記順でも動作します。確実性を高めるなら「Maps API(no callback)」→「gmaps.js」→最後にinitMap()呼び出し、の順に組む方法もあります。

ステップ4:外部リソースを「Resources」に設定する場合

JSFiddleの「External Resources」に以下を追加する方法でも可。ただし順序が崩れやすいので注意。

この場合、JSパネルで次を記述し、JS設定を「onLoad」にする:

window.addEventListener('load', function() {
  if (!window.google || !google.maps) {
    console.error('Google Maps APIの読み込みに失敗しました');
    return;
  }
  var map = new GMaps({
    el: '#map',
    lat: 35.6809591,
    lng: 139.7673068,
    zoom: 14
  });
});

HTML側に

とheightのCSSを忘れずに。

ステップ5:ハマりどころと診断

1) 画面が真っ白/灰色で何も出ない - #mapの高さが0 → CSSでheightを指定。 - APIキーエラー → Consoleログに注目(MissingKeyMapError, ApiNotActivatedMapErrorなど)。

2) RefererNotAllowedMapError - リファラ制限にJSFiddleの実際の実行ドメインが含まれていない。NetworkタブでscriptのRequest HeadersのRefererを確認し、その由来を許可に追加。

3) google is not defined / google.maps is undefined - 実行タイミングが早すぎる。callback=initMapで初期化するか、「onLoad」設定に変更。 - 外部スクリプトURLがtypoや403/404で失敗。Networkタブで確認。

4) GMaps is not defined - gmaps.jsが未読込/URLミス。CDNリンクを見直し。順序がMaps APIより先後で壊れるケースは稀だが、初期化時点で存在していればOK。

5) Mixed Content - すべてhttpsで統一。古いhttpリンクは置き換える。

6) 請求(Billing)未設定 - Consoleに「This API project is not authorized to use this API」等。Google Cloudで請求を有効化。

ステップ6:発展例(ジオコーディング/カスタムスタイル)

ジオコーディング

map.geocode({
  address: '東京駅',
  callback: function(results, status) {
    if (status !== 'OK' || !results.length) return;
    var latlng = results[0].geometry.location;
    map.setCenter(latlng.lat(), latlng.lng());
    map.addMarker({ lat: latlng.lat(), lng: latlng.lng(), title: '東京駅' });
  }
});

注: Places/Geocodingは追加APIや課金ポリシーが関与。必要に応じてAPIを有効化。

カスタムスタイル

map.addStyle({
  styledMapName: 'Dark',
  styles: [{ featureType: 'all', elementType: 'all', stylers: [{ saturation: -80 }] }],
  mapTypeId: 'dark'
});
map.setStyle('dark');

まとめ

本記事では、JSFiddleでgmaps.jsが動かない典型要因を整理し、最小構成のコードと正しい読み込み順、APIキーとリファラ制限、実行タイミングの調整方法を解説しました。 - 要点1: APIキーの有効化・請求・リファラ制限を正確に設定することが最優先 - 要点2: scriptの読み込み順とcallback=initMapで初期化タイミングを明示する - 要点3: #mapのサイズ指定とConsole/Networkでのエラー診断が解決の近道

これらを押さえれば、JSFiddleでも安定してgmaps.jsを動かせます。今後は、オートコンプリートやPlaces、Directionsなど他APIとの連携、ビルド環境(Vite/Parcel)への移植手順も紹介する予定です。

参考資料

  • Google Maps JavaScript API公式ドキュメント: https://developers.google.com/maps/documentation/javascript
  • gmaps.js GitHub: https://github.com/hpneo/gmaps
  • Google Cloud APIキーの制限: https://cloud.google.com/docs/authentication/api-keys?hl=ja
  • エラーメッセージ一覧(Maps JS APIトラブルシューティング): https://developers.google.com/maps/documentation/javascript/error-messages?hl=ja
  • JSFiddleドキュメント: https://docs.jsfiddle.net/