Last active
June 11, 2021 19:37
-
-
Save Budyn/99dc1ae300793e54e2653c45f27db46c to your computer and use it in GitHub Desktop.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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" | |
] |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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