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:
// === 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.
// === 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:
// === 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
| Formula | Returns |
|---|---|
| =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 |