Instant CurrencyInstant Currency

Google スプレッドシートで過去の為替レートを取得する方法

今日の為替レートが必要なレートと違う、という場面はよくあります。先月の帳簿を締めていて期末日のレートが必要だったり、6週間前の出張の経費精算書を作っていたり、入金時点でその支払いが実際にいくらだったかを確認しなければならなかったり。そういった場面では、現在の市場レートではなく過去のレートが必要です。このガイドでは、GOOGLEFINANCE を使って過去のレートを Google スプレッドシートに直接取り込む方法を説明します。

特定の日付のレートを取得する

1つの日付の過去レートを取得する数式はこうです:

=INDEX(GOOGLEFINANCE("CURRENCY:USDEUR", "price", DATE(2024,1,15)), 2, 2)

INDEX で囲む必要はないように見えるかもしれませんが、実は必須です。GOOGLEFINANCE に日付を渡すと、1つの数値は返ってきません。「Date」と「Close」というラベルのヘッダー行と、実際の値が入ったデータ行の2列テーブルが返されます。このテーブルをそのまま使おうとすると、たとえばドルの金額に掛け算しようとしても、Google スプレッドシートはテーブルに数値を掛ける方法がわからないためエラーになります。

INDEX(_, 2, 2) はそのテーブルから特定のセルを取り出します。2, 2 は2行目・2列目を意味し、実際のレートが入っている場所です。

日付と価格の列を示す GOOGLEFINANCE の生の出力

この値が取得できれば、セルの値との掛け算はリアルタイムレートを使う場合と同じです:

=INDEX(GOOGLEFINANCE("CURRENCY:USDEUR", "price", DATE(2024,1,15)), 2, 2) * A2

A2 のドル金額を、2024年1月15日のレートでユーロに換算します。

過去レートをドル金額に掛け合わせる

数式では "2024-01-15" のようなテキスト文字列ではなく DATE() 関数を使っている点に注目してください。どちらも多くの場合に動作しますが、DATE() のほうが確実です。スプレッドシートを別の地域の設定を使う人と共有している場合や、テンプレートを使っている場合、日付文字列は地域設定によって異なる解釈をされることがあります。DATE() にはそのあいまいさがありません。

INDEX と GOOGLEFINANCE を使った過去レートの数式

期間のレートを取得する

1か月間の通貨の動きを追うなど、複数の日にわたるレートが必要な場合は、開始日と終了日を渡せます:

=GOOGLEFINANCE("CURRENCY:USDEUR", "price", DATE(2024,1,1), DATE(2024,1,31))

結果は自動的に複数行に展開されます。最初の行はヘッダーで、それ以降の各行が1日の日付と終値レートです。ここでは INDEX は不要です。特定の1つの値ではなくテーブル全体が必要だからです。

グラフを作るときに便利です。数式をセルに貼り付けて展開させ、そのデータ範囲からグラフを挿入すると、期間中のレートの動きを一目で確認できます。

Google スプレッドシートの為替レート日付範囲

注意点として、この数式の出力は指定した期間内の日数分の行を占有します。数式を入力したセルの下に別のデータがある場合、そのデータは上書きされます。十分な空きスペースがある場所に数式を置くか、出力専用のシートを用意してください。

出力の書式設定

ほぼ毎回同じ2つの書式の問題が発生します。

まず、日付列が読みやすい日付ではなくシリアル番号で表示されることがあります。Google スプレッドシートでは日付は内部的に数値(1899年12月30日からの日数)として保存されており、GOOGLEFINANCE の出力に日付書式が適用されていないことがあります。修正するには、その列を選択して「表示形式」>「数値」>「日付」を選んでください。

次に、レート列はそのままの小数値です。スプレッドシートの用途に合わせて書式を設定してください。精度が必要なら小数点以下4桁、プレゼンテーション用なら2桁など。「表示形式」>「数値」>「カスタム数値形式」で 0.0000 のように入力すれば4桁になります。

知っておくべきこと

日付書式の問題。 前述のとおり、地域設定に依存する日付解析の問題を避けるため、テキスト文字列ではなく DATE() を使ってください。DATE(2024, 1, 15) はどの地域設定でも2024年1月15日を意味します。"1/15/2024" は違います。

仲値レート。 GOOGLEFINANCE が使用するのは仲値(買いレートと売りレートの中間)です。銀行はこのレートを使いません。為替手数料として上乗せした独自のレートを使います。そのため、Google スプレッドシートで表示される数値は銀行口座の明細や決済サービスの領収書に記載された金額と若干異なります。会計目的では、GOOGLEFINANCE のレートではなく銀行の過去レートを確認する必要がある場合もあります。

取得できない通貨ペア。 すべての通貨ペアが Google Finance にあるわけではありません。主要ペア(USD/EUR、GBP/USD、USD/JPY)は問題なく動作します。マイナーな通貨では #N/A が返ることがあります。通貨コードが正しいのにエラーが出る場合は、数式の問題を疑う前に、まずそのペアが Google Finance に存在するかどうかを確認してください。

セル参照の日付を使うには

DATE() の引数をセル参照に置き換えることができます。目的の日付が B2 に入っている場合:

=INDEX(GOOGLEFINANCE("CURRENCY:USDEUR", "price", B2), 2, 2)

B2 が Google スプレッドシートで日付として書式設定されていること(テキストではないこと)を確認してください。日付をテキストとして入力した場合、GOOGLEFINANCE が認識しない可能性があります。セルを選択して「表示形式」>「数値」を確認することで書式を確かめられます。「日付」と表示されているべきで、「書式なしテキスト」や「自動」ではいけません。

GOOGLEFINANCE の日付引数にセル参照を使う

取引日付が並んだ列があって、それぞれのレートを自動で参照したい場合にこの方法が役立ちます。日付列の隣の列に GOOGLEFINANCE 数式を入力し、B2(または最初の日付セル)を日付引数にして、下にドラッグしてください。

動的な日付を使った換算テーブルを作る

経費精算でよく出てくる構成があります。A列に金額、B列に日付が並んでいて、各行の日付に基づいた換算値が欲しい場合です。

C列に:

=INDEX(GOOGLEFINANCE("CURRENCY:USDEUR", "price", B2), 2, 2) * A2

すべての行にドラッグします。各行がその行の日付のレートを参照します。結果として、それぞれが正しい過去のレートを使った換算値の列ができあがります。

行ごとに過去の為替レートを適用した経費テーブル

注意点として、GOOGLEFINANCE の呼び出しは1回ずつ個別のデータリクエストとして扱われます。数百行あるスプレッドシートでは速度が落ちたり、レート制限に引っかかることがあります。データ量が多い場合は、ユニークな日付だけを別途参照し、レートを参照テーブルに入れて VLOOKUP や XLOOKUP で照合する方法が現実的です。各日付の照会が1回で済みます。

Instant Currency

INDEX で囲む手間を省きたいなら、Instant Currency に過去レート用の日付ピッカーがあります。通貨と日付を選ぶだけで、数式の組み立てと書式設定を自動で処理します。数式なしでセルを直接換算することもできるので、計算結果の数値だけ欲しいときにも便利です。

過去レート用 Instant Currency の日付ピッカー

通貨換算の一般的な数式については、GOOGLEFINANCE ステップバイステップガイドをご覧ください。特定のユースケースについてご質問があれば、お気軽にお問い合わせください