GeminiはPower Query Mの作成とトラブルシューティングを助けるが、Excelのレートを取得するものではない。取得するのはWeb.Contentsを実行するExcelだ。本ガイドは匿名の最新エンドポイントを使い、レスポンスを検証し、source、data_updated_at、market_sessionを表示する。
- GeminiはMを下書き・説明し、Excel Power QueryがHTTPリクエストとテーブル更新を行う。
Web.ContentsのRelativePathとQueryで、壊れやすいURL連結を避ける。- USDに対するJPY、KRW、EURを取得し、sourceと観測時刻を表示する。
- 匿名アクセスはIPごとに毎分10回・毎時100回まで。共有ブックにAPIキーを入れない。
- レートはモデル、分析、表示向けのインディケーティブ値で、決済には使えない。
Geminiはクエリを作る補助、データソースではない
Geminiは自然言語の要件をPower Query Mに変換し、手順を説明し、更新失敗の修正案を出せる。しかしブックのレートを自動で最新にはしない。APIを呼び、JSONを解析し、通貨とメタデータの存在を確認し、数値の隣に観測情報を残すクエリが必要だ。
Geminiへのプロンプトには公開ドキュメントURLと必要なレスポンス項目を含める。APIキー、非公開のブックデータ、顧客情報は貼り付けない。
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.ContentsのRelativePathとQueryはMicrosoftが文書化しているオプションだ(Microsoftのドキュメント)。
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あたりの外貨単位だ。Source、DataUpdatedAt、MarketSessionは観測値を説明するもので、約定可能な気配値にはしない。
| Currency | レートとメタデータ | 意味 |
|---|---|---|
| JPY | Rate、Source、DataUpdatedAt、MarketSession | 観測値と文脈を1行で表示 |
| KRW | Rate、Source、DataUpdatedAt、MarketSession | 観測値と文脈を1行で表示 |
| EUR | Rate、Source、DataUpdatedAt、MarketSession | 観測値と文脈を1行で表示 |
通貨、メタデータ、リクエストが欠けた場合はクエリをエラーにする。ゼロは本物のレートに見え、モデルを静かに壊す。
トラッカーを更新する
データ → すべて更新でクエリを再実行する。予約更新やPower Queryの機能はExcelのエディション、OS、プライバシー設定、組織のポリシーで異なる。MacとWindowsに同じ自動更新機能があるとは限らないため、実際に使うExcel環境で確認する。
表示された失敗を調べる
| 失敗 | 意味 | 対処 |
|---|---|---|
| HTTP 429 | 匿名のIPごとの上限に達した。 | 更新頻度を下げ、ペアを減らすか、キー付きサーバープロキシを使う。 |
| HTTP 403 | リクエストが拒否され、Excelの組み込みの資格情報・アクセス処理が関係することがある。 | エンドポイントとExcelのプライバシー・ソース設定を確認し、資格情報の確認画面かクエリエラーを調べる。共有ブックにキーを貼らない。 |
| 通貨またはメタデータの欠落 | レスポンスが必要な形ではない。 | エラーを残し、Mを変える前にレスポンスを調べる。 |
| 更新しても新しい値がない | クエリが再実行されなかったか、レスポンスがキャッシュされた。 | クエリと接続、更新詳細を確認し、古い観測値を最新と表示しない。 |
制約を理解する
このマクロなしのブックは、個人用トラッカーやモデル入力に使える。匿名アクセスはIPごとに毎分10回・毎時100回で、共有出口により実効容量が変わる。共有ブックで安定したアカウント単位の容量が必要なら、キーをサーバー側に置く。キーをPower Query、ブックのパラメーター、プロンプト、バージョン管理に入れない。値はインディケーティブで決済用ではない。