Skip to content

Instantly share code, notes, and snippets.

@Budyn
Last active June 11, 2021 19:37
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save Budyn/99dc1ae300793e54e2653c45f27db46c to your computer and use it in GitHub Desktop.
Save Budyn/99dc1ae300793e54e2653c45f27db46c to your computer and use it in GitHub Desktop.
const pvKey = "xxx"
const puKey = "xxx"
const baseURL = "https://cloud.iexapis.com/stable"
const sheetHeader = [
{title: "Ticker", format: "@"},
{title: "Name", format: "@"},
{title: "Price", format: "$0.00"},
{title: "Change 24h", format: "@"},
{title: "Dividend", format: "$0.00"},
{title: "Dividend yield", format: "0.00%"},
{title: "Ex-dividend Date", format: "d mmmm yy"},
{title: "Pay date", format: "d mmmm yy"},
{title: "Frequency", format: "@"},
{title: "Sectors", format: "@"}
]
const symbols = [
"XOM",
"MO",
"IRM",
"AGNC",
"APLE",
"BRG",
"EPR",
"LTC",
"BSM",
"WPC",
"NNN",
"MPW",
"ACC",
"PEAK",
"ENB",
"NVS",
"AMCR"
]
function initialize() {
clear()
makeHeaderRow()
const tickers = fetchData(symbols)
tickers.forEach(ticker => makeTickerRow(ticker))
format(tickers)
}
function clear() {
const sheet = SpreadsheetApp.getActiveSheet()
sheet.clear()
}
function makeHeaderRow() {
const sheet = SpreadsheetApp.getActiveSheet()
sheet.appendRow(sheetHeader.map(e => e.title))
}
function makeTickerRow(ticker) {
const sheet = SpreadsheetApp.getActiveSheet()
const row = [
ticker.company.symbol,
ticker.company.companyName,
ticker.quote.latestPrice,
ticker.quote.change,
ticker.dividend.amount,
ticker.dividend.dividendYield,
ticker.dividend.exDate,
ticker.dividend.paymentDate,
ticker.dividend.frequency,
ticker.company.tags
]
sheet.appendRow(row)
makeWebsiteLink(ticker)
}
function format(tickers) {
const sheet = SpreadsheetApp.getActiveSheet()
sheet.autoResizeColumns(2, sheet.getLastColumn())
.setColumnWidths(1, 1, 50)
.getRange(1, 1, 1, sheet.getLastColumn())
.setHorizontalAlignment("center")
.setBackgroundRGB(255,209,220)
const formats = new Array(tickers.length).fill()
.map(e => sheetHeader.map(e => e.format))
sheet.getRange(2, 1, sheet.getLastRow() - 1, sheet.getLastColumn())
.setNumberFormats(formats)
.setHorizontalAlignment("right")
sheet.sort(6, false)
}
function makeWebsiteLink(ticker) {
const sheet = SpreadsheetApp.getActiveSheet()
const nameRange = sheet.getRange(sheet.getLastRow(), 2, 1, 1)
const hyperlink = `=HYPERLINK("${ticker.company.website}","${nameRange.getValue()}")`
nameRange.setFormula(hyperlink)
}
function fetchData(symbols) {
const dividendRequests = symbols.map(makeDividendRequest)
const quoteRequests = symbols.map(makeQuoteRequest)
const companyRequests = symbols.map(makeCompanyRequest)
const dividends = UrlFetchApp.fetchAll(dividendRequests)
.flatMap(res => JSON.parse(res.getContentText()))
const quotes = UrlFetchApp.fetchAll(quoteRequests)
.flatMap(res => JSON.parse(res.getContentText()))
const companies = UrlFetchApp.fetchAll(companyRequests)
.flatMap(res => JSON.parse(res.getContentText()))
return symbols
.map(function(sym) {
return {
dividend: dividends.find(e => e.symbol == sym),
quote: quotes.find(e => e.symbol == sym),
company: companies.find(e => e.symbol == sym)
}
})
.map(function(ticker){
const dividendYield = ticker.dividend.amount / ticker.quote.latestPrice
ticker.dividend.dividendYield = dividendYield
ticker.quote.change = String(ticker.quote.change) + " "
+ "(" + String((ticker.quote.changePercent * 100).toFixed(2)) + "%" + ")"
const reducer = (accumulator, currentValue) => accumulator + ", " + currentValue;
ticker.company.tags = ticker.company.tags.reduce(reducer)
return ticker
})
}
function makeDividendRequest(symbol) {
const url = baseURL + "/stock/" + symbol + "/dividends?token=" + puKey
return url
}
function makeQuoteRequest(symbol) {
const url = baseURL + "/stock/" + symbol + "/quote?token=" + puKey
return url
}
function makeCompanyRequest(symbol) {
const url = baseURL + "/stock/" + symbol + "/company?token=" + puKey
return url
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment