TickAtlas
No Code ~10 min setup

Google Sheets Integration

Pull live financial indicators directly into Google Sheets with custom formulas. Type =CLAW_RSI("EURUSD","H1") in any cell and get real-time data.

1. Open Apps Script

In your Google Sheet, go to Extensions > Apps Script. This opens the script editor.

2. Store Your API Key

In the Apps Script editor, go to Project Settings (gear icon) > Script Properties > Add script property. Property: CLAW_API_KEY, Value: your_api_key_here.

3. Paste the Script

Replace the contents of Code.gs with:

Code.gs
// === TickAtlas for Google Sheets ===
// Paste this into Extensions > Apps Script

var API_KEY = PropertiesService.getScriptProperties().getProperty("CLAW_API_KEY");
var BASE_URL = "https://tickatlas.com/v1";

/**
 * Get a single indicator value for a symbol.
 * @param {string} symbol - e.g. "EURUSD"
 * @param {string} indicator - e.g. "RSI_14"
 * @param {string} timeframe - e.g. "H1" (default)
 * @return {number} The indicator value
 * @customfunction
 */
function CLAW_INDICATOR(symbol, indicator, timeframe) {
  timeframe = timeframe || "H1";
  var url = BASE_URL + "/indicator"
    + "?symbol=" + encodeURIComponent(symbol)
    + "&indicator=" + encodeURIComponent(indicator)
    + "&timeframe=" + encodeURIComponent(timeframe);

  var options = {
    "method": "get",
    "headers": { "X-API-Key": API_KEY },
    "muteHttpExceptions": true
  };

  var response = UrlFetchApp.fetch(url, options);
  if (response.getResponseCode() !== 200) {
    return "Error: " + response.getResponseCode();
  }

  var data = JSON.parse(response.getContentText());
  return data.value;
}

/**
 * Get the RSI value for a symbol.
 * @customfunction
 */
function CLAW_RSI(symbol, timeframe) {
  return CLAW_INDICATOR(symbol, "RSI_14", timeframe || "H1");
}

/**
 * Get the MACD histogram value for a symbol.
 * @customfunction
 */
function CLAW_MACD(symbol, timeframe) {
  return CLAW_INDICATOR(symbol, "MACD_hist", timeframe || "H1");
}

/**
 * Get a live price quote (bid, ask, or spread).
 * @customfunction
 */
function CLAW_QUOTE(symbol, field) {
  field = field || "bid";
  var url = BASE_URL + "/quote?symbol=" + encodeURIComponent(symbol);

  var options = {
    "method": "get",
    "headers": { "X-API-Key": API_KEY },
    "muteHttpExceptions": true
  };

  var response = UrlFetchApp.fetch(url, options);
  if (response.getResponseCode() !== 200) return "Error";

  var data = JSON.parse(response.getContentText());
  return data[field];
}

/**
 * Get the AI market summary for a symbol.
 * @customfunction
 */
function CLAW_SUMMARY(symbol, timeframe) {
  timeframe = timeframe || "H1";
  var url = BASE_URL + "/summary?symbol=" + encodeURIComponent(symbol)
    + "&timeframe=" + encodeURIComponent(timeframe);

  var options = {
    "method": "get",
    "headers": { "X-API-Key": API_KEY },
    "muteHttpExceptions": true
  };

  var response = UrlFetchApp.fetch(url, options);
  if (response.getResponseCode() !== 200) return "Error";

  var data = JSON.parse(response.getContentText());
  return data.bias + " (" + data.confidence + "%)";
}

4. Use in Cells

Go back to your spreadsheet and use these formulas (see table below).

Auto-Refresh Setup

Add this to a separate file in Apps Script to auto-refresh your data every 5 minutes. Run setupAutoRefresh() once from the script editor to activate it.

AutoRefresh.gs
// === Auto-Refresh Trigger ===
// Run this function once to set up automatic refresh every 5 minutes

function setupAutoRefresh() {
  // Remove any existing triggers first
  var triggers = ScriptApp.getProjectTriggers();
  for (var i = 0; i < triggers.length; i++) {
    if (triggers[i].getHandlerFunction() === "refreshData") {
      ScriptApp.deleteTrigger(triggers[i]);
    }
  }

  // Create a new time-based trigger
  ScriptApp.newTrigger("refreshData")
    .timeBased()
    .everyMinutes(5)
    .create();

  Logger.log("Auto-refresh trigger created: every 5 minutes");
}

function refreshData() {
  // Force recalculation by writing a timestamp
  var sheet = SpreadsheetApp.getActiveSpreadsheet().getActiveSheet();
  sheet.getRange("A1").setNote("Last refresh: " + new Date().toISOString());

  // Force all custom functions to re-evaluate
  SpreadsheetApp.flush();
}

function removeAutoRefresh() {
  var triggers = ScriptApp.getProjectTriggers();
  for (var i = 0; i < triggers.length; i++) {
    if (triggers[i].getHandlerFunction() === "refreshData") {
      ScriptApp.deleteTrigger(triggers[i]);
    }
  }
  Logger.log("Auto-refresh trigger removed");
}

Quick Dashboard Builder

Run this function to auto-generate a multi-symbol dashboard:

Dashboard.gs
// === Market Dashboard Builder ===
// Creates a formatted dashboard with data for multiple symbols

function buildDashboard() {
  var sheet = SpreadsheetApp.getActiveSpreadsheet().getActiveSheet();
  var symbols = ["EURUSD", "GBPUSD", "USDJPY", "XAUUSD", "BTCUSD"];
  var timeframe = "H1";

  // Headers
  sheet.getRange("A1").setValue("Symbol");
  sheet.getRange("B1").setValue("Bid");
  sheet.getRange("C1").setValue("Ask");
  sheet.getRange("D1").setValue("RSI");
  sheet.getRange("E1").setValue("MACD");
  sheet.getRange("F1").setValue("AI Bias");
  sheet.getRange("G1").setValue("Updated");
  sheet.getRange("A1:G1").setFontWeight("bold");

  for (var i = 0; i < symbols.length; i++) {
    var row = i + 2;
    sheet.getRange("A" + row).setValue(symbols[i]);
    sheet.getRange("B" + row).setFormula('=CLAW_QUOTE("' + symbols[i] + '","bid")');
    sheet.getRange("C" + row).setFormula('=CLAW_QUOTE("' + symbols[i] + '","ask")');
    sheet.getRange("D" + row).setFormula('=CLAW_RSI("' + symbols[i] + '","' + timeframe + '")');
    sheet.getRange("E" + row).setFormula('=CLAW_MACD("' + symbols[i] + '","' + timeframe + '")');
    sheet.getRange("F" + row).setFormula('=CLAW_SUMMARY("' + symbols[i] + '","' + timeframe + '")');
    sheet.getRange("G" + row).setValue(new Date().toLocaleTimeString());
  }
}

Google Sheets Limits

  • Apps Script has a 6-minute execution limit per function call
  • UrlFetchApp allows up to 20,000 calls per day
  • Custom functions cannot run longer than 30 seconds each
  • Time-based triggers can run at minimum every 1 minute

Formula Reference

FormulaReturns
=CLAW_RSI("EURUSD","H1")RSI value (e.g., 58.43)
=CLAW_MACD("XAUUSD","D1")MACD histogram for Gold daily
=CLAW_QUOTE("GBPUSD","bid")Current bid price
=CLAW_QUOTE("EURUSD","spread")Current spread
=CLAW_SUMMARY("BTCUSD","H4")"bullish (82%)"
=CLAW_INDICATOR("EURUSD","ATR_14","H1")Any indicator by name