diff --git a/packages/colo17/UI.js b/packages/colo17/UI.js new file mode 100644 index 0000000..fcb9a10 --- /dev/null +++ b/packages/colo17/UI.js @@ -0,0 +1,23 @@ +// cribbed from : https://developers.google.com/apps-script/guides/menus +// also: https://developers.google.com/apps-script/guides/sheets/functions + +function onOpen() { + console.warn('AMBIENT: SpreadsheetApp'); + const ui = SpreadsheetApp.getUi(); + + ui.createMenu('MadMode') + .addItem('Load Colo Invoices', 'LoadColoInvoices') + .addToUi(); + // .addSubMenu( + // ui + // .createMenu('Lunch Money') + // .addItem('Load Txs', 'loadLunchMoneyTransactions') + // .addItem('Save Txs', 'saveLunchMoneyTransactions'), + // ) +} + +function LoadColoInvoices() { + console.warn('AMBIENT: SpreadsheetApp'); + SpreadsheetApp.getUi() + .alert('TODO'); +} \ No newline at end of file diff --git a/packages/colo17/appsscript.json b/packages/colo17/appsscript.json new file mode 100644 index 0000000..aa87b75 --- /dev/null +++ b/packages/colo17/appsscript.json @@ -0,0 +1,21 @@ +{ + "timeZone": "America/Chicago", + "dependencies": { + "enabledAdvancedServices": [ + { + "userSymbol": "Sheets", + "version": "v4", + "serviceId": "sheets" + } + ], + "libraries": [ + { + "userSymbol": "Cheerio", + "version": "14", + "libraryId": "1ReeQ6WO8kKNxoaA_O0XEQ589cIrRvEBA9qcWpNqdOP17i47u6N9M5Xh0" + } + ] + }, + "exceptionLogging": "STACKDRIVER", + "runtimeVersion": "V8" +} \ No newline at end of file diff --git a/packages/colo17/coloInvoices.js b/packages/colo17/coloInvoices.js new file mode 100644 index 0000000..2756043 --- /dev/null +++ b/packages/colo17/coloInvoices.js @@ -0,0 +1,63 @@ +const Colo = { + sheet: 'Expenses', + queryRange: 'coloInvoiceQuery', + hd: [ + 'Date', + 'Message Id', + 'From', + 'Subject', + 'Item #', + 'Description', + 'Amount', + ], +}; + +function tableRecord_($) { + const { fromEntries } = Object; + + const [hd, detail] = $('tr', 'table'); + const td = [...$('td', detail)]; + const entries = [...$('th', hd)].map((th, col) => { + return [$(th).text(), $(td[col]).text()]; + }) + + return fromEntries(entries); +} + +function messageDetail_(m) { + const $ = Cheerio.load(m.getBody()); + const detail = tableRecord_($); + + return [ + m.getDate(), + m.getId(), + m.getFrom(), + m.getSubject(), + detail['Item #'], + detail['Description'], + detail['Amount'], + ]; +} + +function LoadColoInvoices() { + console.warn('AMBIENT: SpreadsheetApp'); + const doc = SpreadsheetApp.getActive(); + const sheet = doc.getSheetByName(Colo.sheet); + + const query = doc.getRangeByName(Colo.queryRange).getValue(); + console.warn('AMBIENT: GmailApp'); + const threads = GmailApp.search(query); + const rows = []; + threads.forEach(thread => + thread.getMessages().forEach((m, ix) => { + if (ix > 0) { + console.warn('more than 1 thread in message', m); + return; + }; + const values = messageDetail_(m); + rows.push(values); + }), + ); + sheet.clear(); + setRange(sheet, Colo.hd, rows); +} diff --git a/packages/colo17/package.json b/packages/colo17/package.json new file mode 100644 index 0000000..7fab460 --- /dev/null +++ b/packages/colo17/package.json @@ -0,0 +1,5 @@ +{ + "scripts": { + "pull": "clasp -P . pull $SCRIPT_ID" + } +} diff --git a/packages/colo17/priceFetch.js b/packages/colo17/priceFetch.js new file mode 100644 index 0000000..777d429 --- /dev/null +++ b/packages/colo17/priceFetch.js @@ -0,0 +1,24 @@ +const CoinGecko = { + keyRange: 'priceKey', + priceApi: 'https://pro-api.coingecko.com/api/v3/simple/price' +}; + +/** + * ack: https://www.coingecko.com/en/api/documentation + */ +function FetchPrice(token='agoric', vs='usd') { + console.warn('AMBIENT: UrlFetchApp'); + const { fetch } = UrlFetchApp; + console.warn('AMBIENT: SpreadsheetApp'); + const doc = SpreadsheetApp.getActive(); + const apiKey = doc.getRangeByName(CoinGecko.keyRange).getValue(); + + const url = `${CoinGecko.priceApi}?ids=${token}&vs_currencies=${vs}&x_cg_pro_api_key=${apiKey}`; + + const resp = fetch(url, + { headers: {accept: 'application/json'}}); + const data = JSON.parse(resp.getContentText()); + // console.log(data); + const price = data[token].usd; + return price; +} diff --git a/packages/colo17/sheetTools.js b/packages/colo17/sheetTools.js new file mode 100644 index 0000000..ea03823 --- /dev/null +++ b/packages/colo17/sheetTools.js @@ -0,0 +1,4 @@ +function setRange(sheet, hd, rows, hdRow = 1, detailRow = hdRow + 1) { + sheet.getRange(hdRow, 1, 1, hd.length).setValues([hd]); + sheet.getRange(detailRow, 1, rows.length, hd.length).setValues(rows); +}