Get Real Time Crypto Prices Inside Google Sheets Crypto Portfolio

By April 21, 2018February 20th, 2021API, Blog, Crypto, Google, Google Scripts, Javascript
How To Send Google Form Responses With Google Scripts

If you’re serious about investing, you know that price tracking is critical to success. I’m always looking to minimize costs, so I don’t purchase any paid portfolio tracking apps. I use Google Sheets for tracking my crypto portfolio.

In this article, I will show you how to use the free crypto currency price API from CryptoCompare inside of your Google Sheets crypto portfolio. I will provide you with the Google Script you need to use and instructions on how to implement it, so no coding knowledge is necessary.

To start off with I’ll assume you have a simple crypto portfolio in Google Sheets. For example, something that looks like this:

Simple Crypto Portfolio

What is this spreadsheet missing? Why, the real time price surely!

How To Add Real Time Crypto Prices To Google Sheet

Here’s comes the fun part of creating the Google Script that will pull prices and create a custom function that we can use anywhere in our spreadsheet.

Step 1: Open The Script Editor

Open Google Script Editor

Open Google Script Editor

Empty Google Script

Empty Google Script

Step 2: Insert Code For Getting Crypto Price

Get your CryptoCompare API key from here (free for 100k calls per month): https://min-api.cryptocompare.com/

function CryptoPrice(ticker) {
  var url = 'https://min-api.cryptocompare.com/data/price?fsym=' + ticker + '&tsyms=USD&api_key=API_KEY_GOES_HERE';
  var response = JSON.parse(UrlFetchApp.fetch(url).getContentText());

  SpreadsheetApp.flush();

  return response.USD;
}

This is what it should look like:

Complete Crypto Price Google Script

Complete Crypto Price Google Script

Final step here is to save the code: File > Save and close the tab.

Step 3: Using Our New CryptoPrice Function

Now we can use our new function to pull in prices for any coin ticker. For example, to get the Bitcoin price we would enter =CryptoPrice("BTC")  into a spreadsheet cell. For Stellar Lumens it would be =CryptoPrice("XLM")

Step 4: Update Our Spreadsheet With A Price Column

To make everything nice and dynamic, we will use a formula to get current price based on the coin ticker in column A and quantity in column C. For example, the Bitcoin (row 2) formula will look like this =CryptoPrice(A2)*C2. We can then copy that formula down the entire column.

This is how it will look in the end:

That is all. It really is that simple.

Bonus: How To Get Historical Prices To Calculate Profit / Loss

Get your CoinAPI key (for historical prices) from here (free 100 daily requests): https://www.coinapi.io

We update our script with this:

function CryptoPrice(ticker, date) {
  var url,
      date = String(date).includes('GMT') ? new Date(String(date)).toISOString().slice(0,10) : date;

  if (date) {
    url = 'https://rest.coinapi.io/v1/ohlcv/' + ticker + '/USD/history?period_id=1DAY&limit=1&time_start=' + date + '&apikey=API_KEY_GOES_HERE'
    return JSON.parse(UrlFetchApp.fetch(url).getContentText())[0].price_close;
  } else {
    url = 'https://min-api.cryptocompare.com/data/price?fsym=' + ticker + '&tsyms=USD&api_key=API_KEY_GOES_HERE';
    return JSON.parse(UrlFetchApp.fetch(url).getContentText()).USD;
  } 
  
  SpreadsheetApp.flush();
}

Usage in an excel formula for this would be =CryptoPrice("BTC", "2021-01-01") or =CryptoPrice("BTC", Today() - 5).

And a full example of our Crypto Google Sheet:

Google Sheet Crypto Portfolio with Profit / Loss

See Example Google Sheet Crypto Portfolio
Mike Doubintchik

Author Mike Doubintchik

More posts by Mike Doubintchik

Join the discussion 13 Comments

  • J.R. says:

    Script isn’t returning values when I tried it this morning? Did they close/stop the API?

  • GV says:

    It doesn’t return values for me either.

  • MJS says:

    I tried it today but it did not return any values. Does that mean the 100k calls per month have already been used up for October?

    • Mike Doubintchik says:

      Should be good now. I’ve updated the article as well with instructions to implement the API Key from cryptocompare.

  • Gary says:

    Thank you very helpful, can someone advise how to set it in Google Sheets so it only refreshes manually so I don’t use up all my calls

    • Mike Doubintchik says:

      There’s different triggers you can setup inside the script editor. If you don’t setup any triggers, it will only refresh when you first open up the google sheet.

      I have a google drawing of an update button that I inserted into my google sheet. Then you can assign an action to the button to run a script called updateData.

      My helpers file (which contains the method updatedata) looks something like this:

      /**
       * Get all sheet names from active spreadsheet
       */
      function sheetNames() {
        var sheetNames = [];
        var sheets = SpreadsheetApp.getActiveSpreadsheet().getSheets();
        for (var i = 0; i < sheets.length; i++) sheetNames.push( sheets[i].getName() );
        return sheetNames;
      }
      
      /**
       * Update all formula data in cell range
       */
      function updateData() {
          var spreadsheet     = SpreadsheetApp.getActiveSpreadsheet(),
              activeSheet     = spreadsheet.getActiveSheet()
              activeSheetName = activeSheet.getSheetName(),
              activeRange     = activeSheet.getActiveRange(),
              sheets          = sheetNames(),
              range           = '';
                      
          // loop through all sheets
          sheets.forEach(function(sheet) {
              var originalFormulas = [],
                  range            = activeRange,
                  defaultRanges    = {
                      'Alts': 'J2:J64',
                      'Ledger': 'D2:D10'
                  };
                      
              // set range to active range, otherwise fall back to defined cell range
              range = spreadsheet.getSheetByName(sheet).getRange(defaultRanges[sheet]);
              
              originalFormulas = range.getFormulas();
                  
              // modify formulas
              var modified = originalFormulas.map(function (row) {
                  return row.map(function (col) { 
                    return col.replace('=', '?');
                  }); 
              });
              
              // update formulas
              range.setFormulas(modified);
              SpreadsheetApp.flush();
              
              // return formulas to original
              range.setFormulas(originalFormulas);
          });
      }
      
  • Josef P Lagorio says:

    Great stuff! Two questions
    1. The historical script doesn’t seem to work. I tried switching the API URL to their v2 after it didn’t work the first time and still now dice.
    2. Secondly, love the refresh button with the script, but I’m running into the following error after clicking the button “exception: Argument cannot be null: a1NotationDetails”

    • Mike Doubintchik says:

      1. Yeah, the code is pretty old, but it should still give a good baseline to modify. Maybe by using a different API completely.
      2. Do you mean the refresh button in the comment section? If so, you probably just need to adjust the parameters inside the code.

  • Luke says:

    Hi – thanks for the code! Like Josef said the historical script does not appear to work – it only returns the current price (ELSE argument) no matter what. I tried tinkering with the script, but I’m not a programmer – any chance you could provide an updated script? It looks like it’s not working in your Crypto Portfolio Example link either. I double checked the URL path on CryptoCompare for historical prices and it has stayed the same so not sure where the disconnect is.

  • Luke says:

    Awesome – thanks Mike. Only modification I had to make on the formula side was =CryptoPrice("BTC", TEXT( TODAY( ) - 1, """""YYYY-MM-DD""""")) if I want the script to work with dynamic dates.

  • skinny says:

    amazing, works like a charm, thanks!

Leave a Reply