仮想通貨の現在価格をAPIで取得しよう – Googleスプレッドシート

Googleスプレッドシート x 仮想通貨 シリーズ第 1 弾です。シリーズの一覧はカテゴリ [Googleスプレッドシート x 仮想通貨] から見れます。

最近、株式投資による資産運用を始めました。主に米国のTech系ETFを買っています。Microsoft や Amazon、Google さまさまですね!株以外の選択として債券や金に加え、仮想通貨にも手を出しました。私はこれらの資産の損益を Google スプレッドシートで管理しています。

Google スプレッドシートには “GOOGLEFINANCE” という世界中の株価を参照できる便利な関数があります。しかし、仮想通貨に関してはビットコインや Ethereum などの有名な通貨の株価は取得できますが、時価総額が小さな、いわゆる草コインには対応していません。

そこで今回は草コインを含めた多くの仮想通貨の現在価格を取得できる関数を Google App Script (GAS) で作成します。いわば GOOGLEFINANCE の仮想通貨版ということになります。

1. CoinMarketCap API を使って仮想通貨の価格を取得する

仮想通貨の価格をまとめてくれているウェブサイトはいくつもありますが、最も大きなウェブサイトの1つに CoinMarketCap があります。1000種類以上の仮想通貨の情報をリアルタイムに見ることができます。

CoinMarketCap は API を公開しているため、これを利用させてもらいます。有料プランと無料プランがあり、無料プランは1日に送信できるリクエスト数や送信レートに制限がありますが、個人で利用する分には十分でしょう。(この記事で紹介する関数は、CoinMarketCap に載っていない仮想通貨の価格は取得できないということになります。でもさすがにそこまでの草コイン買う人いないよね・・・)

CoinMarketCap の API キーを取得するには https://coinmarketcap.com/api/ にアクセスしましょう。

CoinMarketCap API key

アクセスしたら、画面中央にある青背景の “GET YOUR API KEY NOW” をクリックし必要事項を入力します。Basicプラン(無料)を選択しましょう。無事アカウントを作成できれば、下の画像のようなアカウント画面が見えるはずです。

CoinMarketCap API accout

円グラフの左側にあるAPI Keyという欄にカーソルを持っていくとAPIキーを閲覧、コピーすることができます。APIキーが取得出来たら、GASで関数を作っていきます。

2. スクリプト作成

1. スプレッドシートを開き、[拡張機能] > [Apps Script] をクリック

2. 左上の [+] ボタン > [スクリプト] をクリック

3. crypto.gs などの名前をつけ新しいスクリプトを追加

4. もともとあるコードはすべて削除し、以下のコードを貼り付ける

function crypto(ticker) {

  var url = "https://pro-api.coinmarketcap.com/v1/cryptocurrency/quotes/latest?symbol=" + ticker;
  var requestOptions = {
    method: 'GET',
    uri: 'https://pro-api.coinmarketcap.com/v1/cryptocurrency/listings/latest',
    qs: {
      start: 1,
      limit: 5000,
      convert: 'USD'
    },
    headers: {
      'X-CMC_PRO_API_KEY': 'Your_API_key_is_here'
    },
    json: true,
    gzip: true
  };
  var result = UrlFetchApp.fetch(url, requestOptions);

  var txt = result.getContentText(); // JSON as a text
  var jsonData = JSON.parse(txt);
  var price = jsonData['data'][ticker]['quote']['USD']['price'];

  return price;

}

5. 上記コードの Your_API_key_is_here を先ほど取得した CoinMarketCap の API キーで置換
(シングルクォーテーションの中に API キーを貼り付ける)

6. Ctrl + S などでスクリプトを保存

3. 実際に使ってみる

本当に草コインで使えるのか、試してみましょう。2020年9月11日現在 CoinMarketCap で Rank 154位の IoTeX (IOTX) の株価を取得してみます。(実際に購入した草コインです。)

よいしょっと。

using crypto function

問題なく現在価格を取得できました。

仮想通貨のシンボルを直接指定する場合は、次のようにダブルクォーテーションでくくってください。

=crypto(“BTC”)

現在は価格を表示するだけの簡単な関数ですが、クエリを変えたりJSONのパースをいじったりすることでより便利な関数を作れると思います。

まとめ

この記事では、仮想通貨(主に草コイン)をGoogleスプレッドシートで管理するための関数を作成しました。シンボルを渡すと現在価格を返してくれる、シンプルな関数です。

ぜひ皆さんもオリジナル関数を作ってみてはいかがでしょうか。少しでも皆さんの仮想通貨運用に役立つことを祈っています。

以下余談

リクエストが成功したときのレスポンス (JSON) は以下のような階層構造をしています。

コード内の

var price = jsonData['data'][ticker]['quote']['USD']['price'];

の部分は、この JSON からで目的の情報である price までのパスをたどっている実装になっています。

{
  "status":{
    "timestamp":"2020-09-11T08:18:53.692Z",
    "error_code":0,
    "error_message":null,
    "elapsed":17,
    "credit_count":1,
    "notice":null
  },
  "data":{
    "BTC":{
      "id":1,
      "name":"Bitcoin",
      "symbol":"BTC",
      "slug":"bitcoin",
      "num_market_pairs":9086,
      "date_added":"2013-04-28T00:00:00.000Z",
      "tags":[
        "mineable",
        "pow",
        "sha-256",
        "store-of-value",
        "state-channels"
      ],
      "max_supply":21000000,
      "circulating_supply":18485787,
      "total_supply":18485787,
      "is_active":1,
      "platform":null,
      "cmc_rank":1,
      "is_fiat":0,
      "last_updated":"2020-09-11T08:17:32.000Z",
      "quote":{
        "USD":{
          "price":10203.3238165,
          "volume_24h":55229657182.8796,
          "percent_change_1h":-0.689671,
          "percent_change_24h":-1.10781,
          "percent_change_7d":-1.84363,
          "market_cap":188616470763.8461,
          "last_updated":"2020-09-11T08:17:32.000Z"
        }
      }
    }
  }
}

33件のコメント

  1. 素敵な投稿ありがとうございます。
    参考にさせて頂いているのですが、
    コードをコピペして、APIコードを代入してみた所、「18行目、UrlFetchApp関数を用いてリクエストを送信し、JSON形式で返ってくるレスポンスを変数resultに代入しています。」
    ここでスタックしているっぽく、ご助言頂けますと幸いです。

    1. Author

      こちらこそご質問ありがとうございます。

      私もコードをコピペして試しましたが、正常に価格は返ってきました。1つ自分でも引っかかった点なのですが、現在の実装だと引数は必ずテキストでないといけません。

      したがって「=crypto(IOTX)」のようにそのままティッカーを書くのではなく、
      1.記事の中にあるように「=crypto(A1)」として他のセルを参照するか、
      2.「=crypto(“IOTX”)」のようにダブルクォーテーションでくくらないといけません。

      これでもうまくいかない場合は、エラーメッセージを載せていただけませんか。ポンコツ実装ですみません。。。

  2. アドバイスありがとうございました!無事反映されました!ポンコツなんてとんでもない!めちゃめちゃ助かりました!!

    1. Author

      無事動いたようでよかったです!

  3. 素敵な記事ありがとうございます。

    コードをコピペさせて頂いてAPIコードを代入し、実行したところエラー400となりました。

    ご助言いただけますと幸いです。

    1. Author

      ご質問ありがとうございます。

      何が原因なのかあまり思いつきませんが、例えばCoinMarketCapにないティッカーを引数に指定すると、以下のように「そんなティッカーはないよ」とサーバから帰ってきます。

      returned code 400. Truncated server response: {“status”:{“timestamp”:”2021-06-09T10:31:45.298Z”,”error_code”:400,”error_message”:”Invalid value for \”symbol\”: \”AAAAA\””,”elapsed”:0,”credit_co…

      「=cypro(“IOTX”)」のように確実に存在するティッカーを指定しても同じエラーが返ってきますか?その場合はエラーメッセージをここに載せていただけないでしょうか。

  4. 早速ご連絡ありがとうございます!
    以下のようなエラーメッセージが出ます。

    Exception: Request failed for https://pro-api.coinmarketcap.com returned code 400. Truncated server response: {“status”:{“timestamp”:”2021-06-09T12:10:50.965Z”,”error_code”:400,”error_message”:”Invalid value for \”symbol\”: \”UNDEFINED\””,”elapsed”:0,”credi… (use muteHttpExceptions option to examine full response)

    1. Author

      UNDEFINEDと書いてあるので、関数にティッカーを正しく渡せていないようです。

      正しくコピペができていないか、引数として参照しているセルが間違っているのだと思います。。

      1. ご連絡ありがとうございます!
        コピペするところ間違えていました。。

        出来ました!
        お手数おかけしました。

        1. Author

          いえいえ、動いたようで何よりです。

  5. 初めまして。
    こちらを参考に無事実装できました。
    ありがとうございます。

    一つ質問があります。
    現状だと確認した時の時価ですが、例えば毎日「終値」を自動取得するようなことも可能なのでしょうか?

    セルA1に日付「2022/3/13」
    セルB1に価格「44342.34234」
    のようにデータ用シートに毎日自動入力できるのであれば非常に助かります。

    欲しいコイン情報は3つなので、無料クレジット内で収まる予定です。

    もし簡単に実装できるのであればご教授いただきたく思います。
    お忙しいところ大変恐縮ですが、ご検討いただけますと幸いです。

    1. Author

      コメントいただき、ありがとうございます。連絡が遅れて申し訳ありません。

      > 現状だと確認した時の時価ですが、例えば毎日「終値」を自動取得するようなことも可能なのでしょうか?

      はい、可能です。
      ただ、シートに値を書き込む際の実装を変更する必要があるので、すぐには作れなさそうです。

      希望の動作にはなりませんが、毎日価格を取得する場合はこちらの記事のスクリプトのほうが参考になると思います。
      https://www.ryomorishima.com/2021/10/31/get-all-crypto-price/

      上記のスクリプトをスプレッドシートのトリガー設定で毎日決まった時間に走らせれば、毎日価格が更新されます。
      しかし現状は日付を更新して1行ずつ書き足していくような実装ではなく、同じ場所に価格を書き込むことしかできません。

      いつまでに作れるか確約はできないのですが、書いていただいた毎日価格を書き足していくスクリプトは、作ってみようと思います。

      1. 返信ありがとうございます。
        おぉ可能なのですね。
        まさに1行ずつ書き足していく実装ができればとの思いでした。
        私自身はこのへん疎く、かなりググってみたのですが、良い方法が見つからず諦めていたところです。
        では森島様のご厚意に甘えて、ブログ楽しみにしております。
        お時間のある時で構いませんので、何卒宜しくお願い致します。

  6. 記事を読み無事に価格が取得できました。ありがとうございます。超初心者で恐縮なのですが、この取得価格の更新はどのように行われるのでしょうか?スプレッドシートを更新した際に価格も取得し直すよう設定することは可能ですか?よろしくお願いいたします。

    1. Author

      申し訳ありませんが、調べても情報が出てこず、何をトリガーとして式が更新されるかは分かりませんでした。
      CoinMarketCap の API キーが表示される画面にログインすると、送信したリクエストの履歴が表示されるので
      これを監視すればいつ処理が更新されているか調べられるかもしれません。

      セルを更新する、みたいな操作はスプレッドシートは提供していませんが
      一度 Del キーでセルを削除 > Ctrl + Z で戻る、とすると確実にリロードされます。
      ただ、リロードするとその分 API のクレジットを消費するので、気をつけてください。

      1. とんでもないです。更新する方法をご教授いただきありがとうございます(APIクレジットの件承知しました)。大変使いやすくなりました。

  7. symbol以外の情報でpriceを抜きたいです。同じsymbolのクリプトがあるからです。mapでslugやidは判明したので提供くださった関数の最初を?slugやidに変えればうまくいくはずだと思うのですが動きません。curlでうつと正常に返ってきます。どうしたらよいか教えていただけると嬉しいです。

    1. Author

      コメントいただきありがとうございます。

      ご認識の通り同じ symbol の仮想通貨は複数あるので、id で指定することが推奨されます。
      最新の記事では id から仮想通貨の価格を取得するように実装したので、こちらを参考にしていただけますか。
      https://www.ryomorishima.com/2022/04/05/track-daily-crypto-price/
      記事内の getCryptoPrice 関数が該当します。

  8. これで動きそうだな、という感じですがだめなようです。。

    function cryptoid(ticker) {

    var url = “https://pro-api.coinmarketcap.com/v1/cryptocurrency/quotes/latest?id=” + ticker + “&convert=USD”;
    var requestOptions = {
    method: ‘GET’,
    headers: {
    ‘X-CMC_PRO_API_KEY’: ‘MYKEY’
    },
    json: true,
    gzip: true
    };
    var result = UrlFetchApp.fetch(url, requestOptions);

    var txt = result.getContentText(); // JSON as a text
    var jsonData = JSON.parse(txt);
    var path = “jsonData.data.” + ticker + “.quote.USD.price”; // path to the current price
    var price = eval(path);

    return price;

    }

    1. Author

      連絡が遅れてすみません。
      パスを評価する部分を書き直してみたので以下のコードで実行してみてください。
      ダブルクオーテーション、シングルクオーテーションは入力しなおす必要があるかもしれません。

      function cryptoid(ticker) {

      var url = “https://pro-api.coinmarketcap.com/v1/cryptocurrency/quotes/latest?id=” + ticker + “&convert=USD”;
      var requestOptions = {
      method: ‘GET’,
      headers: {
      ‘X-CMC_PRO_API_KEY’: ‘MYKEY’
      },
      json: true,
      gzip: true
      };
      var result = UrlFetchApp.fetch(url, requestOptions);

      var txt = result.getContentText(); // JSON as a text
      var jsonData = JSON.parse(txt);
      var price = jsonData[‘data’][ticker][‘quote’][‘USD’][‘price’];

      return price;

      }

      1. ありがとうございます!!!!
        そこがうまくいってないんだろうとは思っていましたが、書き方がわからず詰んでいました。

        大変たすかりましたm( _ _ )m

  9. 森島さん作成のスクリプト大変参考なりました。
    記載されたとおり実施しましたが問題なく価格が取得できました。
    とても便利なスクリプト作成共有いただいて感謝御礼申し上げます。

    1. Author

      コメントありがとうございます。
      お役に立てれば幸いです。

  10. スプレッドシートのスクリプトに仕込んだAPIですが、叩かれるタイミングはいつなのでしょうか。

    自分はまったく開いていなくても毎日リミットいっぱいになるのは少しだけ友達に共有かけたからなのでしょうかねぇ。

  11. Author

    これは自分もよく分かりませんでした。

    CoinMarketCap のアカウントにログインすると、いつ API を使用したか履歴が出るのでそこから動きを推測するくらいしか思いつきません。
    結局自分は現在はこの記事の関数ではなく vol3 の実装を使っています。

    1. vol3とは何でしょうか!?
      よろしければ教えてくださいm( _ _ I)m

    2. vol3見てきました。これだとAPIはトリガーでしか叩かれないんですね・・・。

      1. Author

        はい、そういうことになります。長期的な投資として価格をトラックする分には大丈夫だと思います。

        リアルタイムで価格が欲しい場合は、スプレッドシートだと難しいかもしれませんね。python などを使えばできるのですが、手軽にやりたかったのでスプレッドシートで実装してます。

  12. お世話になっております。
    こちらのスクリプトを便利に使わせていただいております。
    1点質問ですが、名前が同じものがある場合、指定の銘柄で価格を表示させたい場合は、どのようにしたらよいでしょうか?
    具体的にはSRX(StorX Network)を表示させたいのですが、Syrup Financeの価格が表示されてしまいます。
    お手数をおかけしますが、ご教示をよろしくお願い致します。

    1. Author

      ご連絡が遅れました。おっしゃる通りこの記事のスクリプトには、同じ銘柄の通貨は区別できないという問題があります。

      この記事は vol.1 ですが、 vol.3 で仮想通貨の ID を参照することでこの問題が一応修正されています。
      https://www.ryomorishima.com/2022/04/05/track-daily-crypto-price/
      こちら参考にしてみていただけますでしょうか。

      1. ありがとうございます。無事にIDで取得することができました。
        素晴らしい記事ありがとうございました。

        1. Author

          ありがとうございます。無事できましたようで何よりです!

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です