Tutorial/Excel FXトラッカー

GeminiとPower QueryでExcelのFXトラッカーを作る

GeminiでPower Queryの手順を下書き・説明し、Excelからexchangerate.devのインディケーティブな為替レートを取得する。マクロなしで、観測時刻とmarket sessionを各値の隣に残す。

ERexchangerate.dev·Updated Sep 5, 2026·8分で読了

GeminiはPower Query Mの作成とトラブルシューティングを助けるが、Excelのレートを取得するものではない。取得するのはWeb.Contentsを実行するExcelだ。本ガイドは匿名の最新エンドポイントを使い、レスポンスを検証し、sourcedata_updated_atmarket_sessionを表示する。

Key points
GeminiはMを下書き・説明し、Excel Power QueryがHTTPリクエストとテーブル更新を行う。
Web.ContentsRelativePathQueryで、壊れやすいURL連結を避ける。
USDに対するJPY、KRW、EURを取得し、sourceと観測時刻を表示する。
匿名アクセスはIPごとに毎分12回・毎時100回まで。共有ブックにAPIキーを入れない。
レートはモデル、分析、表示向けのインディケーティブ値で、決済には使えない。

Geminiはクエリを作る補助、データソースではない

Geminiは自然言語の要件をPower Query Mに変換し、手順を説明し、更新失敗の修正案を出せる。しかしブックのレートを自動で最新にはしない。APIを呼び、JSONを解析し、通貨とメタデータの存在を確認し、数値の隣に観測情報を残すクエリが必要だ。

Geminiへのプロンプトには公開ドキュメントURLと必要なレスポンス項目を含める。APIキー、非公開のブックデータ、顧客情報は貼り付けない。

Prompt for Gemini
Gemini に、マクロを使わない Excel Power Query M クエリを書かせてください。
https://exchangerate.dev/docs/api-reference
と匿名エンドポイント /v1/latest/USD?symbols=JPY,KRW,EUR を使います。
Web.Contents の RelativePath = "v1/latest/USD" と
Query = [symbols = "JPY,KRW,EUR"] を使ってください。JSONを解析し、
rates、sources、data_updated_at、market_session の存在を検証し、
Currency、Rate、Source、DataUpdatedAt、MarketSession 列を返してください。
APIキーや推測したフォールバック値を追加しないでください。HTTPエラーを表示してください。

Power Queryを作成する

Excelでデータ → データの取得 → その他のソースから → 空のクエリを開き、詳細エディターを選ぶ。下のクエリに置き換える。Web.ContentsRelativePathQueryはMicrosoftが文書化しているオプションだ(Microsoftのドキュメント)。

Power Query M · FXTracker
let
    Response = Web.Contents(
        "https://api.exchangerate.dev",
        [
            RelativePath = "v1/latest/USD",
            Query = [symbols = "JPY,KRW,EUR"],
            ManualStatusHandling = {429}
        ]
    ),
    Status = try Value.Metadata(Response)[Response.Status] otherwise 200,
    Checked = if Status <> 200 then
        error "The FX endpoint returned HTTP " & Text.From(Status)
      else Response,
    Json = Json.Document(Checked),
    Rates = try Json[rates] otherwise error "The response has no rates field",
    Sources = try Json[sources] otherwise error "The response has no sources field",
    UpdatedAt = try Json[data_updated_at] otherwise error "The response has no data_updated_at field",
    Session = try Json[market_session] otherwise error "The response has no market_session field",
    RequireRate = (rates as record, code as text) as number =>
        let value = try Record.Field(rates, code) otherwise null
        in if value is number and value > 0 then value else error (code & " is missing or invalid"),
    RequireSource = (sources as record, code as text) as text =>
        let value = try Record.Field(sources, code) otherwise null
        in if value is text and Text.Length(value) > 0 then value else error (code & " source is missing or invalid"),
    RequiredMetadata = if UpdatedAt is text and Text.Length(UpdatedAt) > 0 and Session is text and Text.Length(Session) > 0 then true else error "Required metadata is missing or invalid",
    Rows = if RequiredMetadata then Table.FromRecords({
        [Currency = "JPY", Rate = RequireRate(Rates, "JPY"), Source = RequireSource(Sources, "JPY"), DataUpdatedAt = UpdatedAt, MarketSession = Session],
        [Currency = "KRW", Rate = RequireRate(Rates, "KRW"), Source = RequireSource(Sources, "KRW"), DataUpdatedAt = UpdatedAt, MarketSession = Session],
        [Currency = "EUR", Rate = RequireRate(Rates, "EUR"), Source = RequireSource(Sources, "EUR"), DataUpdatedAt = UpdatedAt, MarketSession = Session]
    }) else error "Required metadata is missing or invalid",
    Typed = Table.TransformColumnTypes(Rows, {{"Currency", type text}, {"Rate", type number}, {"Source", type text}, {"DataUpdatedAt", type datetimezone}, {"MarketSession", type text}})
in
    Typed

各値を説明するテーブルとして読み込む

完了 → 閉じて読み込む先… → テーブルを選ぶ。成功すれば通貨ごとに1行ができる。レートは1 USDあたりの外貨単位だ。SourceDataUpdatedAtMarketSessionは観測値を説明するもので、約定可能な気配値にはしない。

Currencyレートとメタデータ意味
JPYRate、Source、DataUpdatedAt、MarketSession観測値と文脈を1行で表示
KRWRate、Source、DataUpdatedAt、MarketSession観測値と文脈を1行で表示
EURRate、Source、DataUpdatedAt、MarketSession観測値と文脈を1行で表示
欠損値をゼロに置き換えない
通貨、メタデータ、リクエストが欠けた場合はクエリをエラーにする。ゼロは本物のレートに見え、モデルを静かに壊す。

トラッカーを更新する

データ → すべて更新でクエリを再実行する。予約更新やPower Queryの機能はExcelのエディション、OS、プライバシー設定、組織のポリシーで異なる。MacとWindowsに同じ自動更新機能があるとは限らないため、実際に使うExcel環境で確認する。

表示された失敗を調べる

失敗意味対処
HTTP 429匿名のIPごとの上限に達した。更新頻度を下げ、ペアを減らすか、キー付きサーバープロキシを使う。
HTTP 403リクエストが拒否され、Excelの組み込みの資格情報・アクセス処理が関係することがある。エンドポイントとExcelのプライバシー・ソース設定を確認し、資格情報の確認画面かクエリエラーを調べる。共有ブックにキーを貼らない。
通貨またはメタデータの欠落レスポンスが必要な形ではない。エラーを残し、Mを変える前にレスポンスを調べる。
更新しても新しい値がないクエリが再実行されなかったか、レスポンスがキャッシュされた。クエリと接続、更新詳細を確認し、古い観測値を最新と表示しない。

制約を理解する

このマクロなしのブックは、個人用トラッカーやモデル入力に使える。匿名アクセスはIPごとに毎分12回・毎時100回で、共有出口により実効容量が変わる。共有ブックで安定したアカウント単位の容量が必要なら、キーをサーバー側に置く。キーをPower Query、ブックのパラメーター、プロンプト、バージョン管理に入れない。値はインディケーティブで決済用ではない。

ER
exchangerate.dev
開発者向けの統合ガイド。

関連記事

TutorialGoogle Sheetsでライブ為替レートを取得する読む TutorialExcelでライブ為替レートを取得する読む Referencesourceとmarket_sessionの読み方読む
他の比較Fixer vs exchangerate.devOpen Exchange Rates vs exchangerate.devCurrencylayer vs exchangerate.dev
学ぶReading source and market_session in your pipelineIndicative vs executable FX rates: what a rates API actually gives youECB参照レートの解説
ライブレートEUR/USDGBP/USDUSD/JPY