您需要先安装一个扩展,例如 篡改猴、Greasemonkey 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 Userscripts ,之后才能安装此脚本。
您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey,才能安装此脚本。
您需要先安装用户脚本管理器扩展后才能安装此脚本。
Download a YNAB compatible .csv file from splitwise
// ==UserScript== // @name SplitwiseCSV // @namespace http://tampermonkey.net/ // @version 0.1 // @description Download a YNAB compatible .csv file from splitwise // @author Noah D. Brenowitz // @match https://secure.splitwise.com/* // @grant GM_addStyle // @require http://ajax.googleapis.com/ajax/libs/jquery/1.8.3/jquery.min.js // @require https://code.jquery.com/ui/1.12.1/jquery-ui.min.js // ==/UserScript== function pad(n, width, z) { z = z || '0'; n = n + ''; return n.length >= width ? n : new Array(width - n.length + 1).join(z) + n; } function printDate(date){ return [ pad(date.getMonth()+1, 2), pad(date.getDate(), 2), date.getFullYear()] .join("/"); } function processExpense(id, exp) { // Process expense // See YNAB CSV importing rules http://classic.youneedabudget.com/support/article/csv-file-importing // Example // Date,Payee,Category,Memo,Outflow,Inflow // 01/25/12,Sample Payee,,Sample Memo for an outflow,100.00, // 01/26/12,Sample Payee 2,,Sample memo for an inflow,,500.00 // Get sum var paid = exp.users .filter(function(user) { return user.user_id == id; return 1;}) .map(function (user) { return Number(user.paid_share); }).reduce(function(a,b) { return a + b;}, 0.0);; var owed = exp.users .filter(function(user) { return user.user_id == id; return 1;}) .map(function (user) { return Number(user.owed_share); }).reduce(function(a,b) { return a + b;}, 0.0); var net = paid - owed; var out = (net < 0 ? -net : 0); var inf = (net > 0 ? net : 0); return {"Date": printDate(new Date(exp.date)), "Payee": exp.description, "Category": "", "Memo": "paid: " + paid + " owed:"+ owed + " cost:"+exp.cost, "Outflow" : out, "Inflow" : inf}; } function printExpenses(id, exps){ var str = "Date,Payee,Category,Memo,Outflow,Inflow\n"; console.log(id); str += exps.map(x=>processExpense(id, x)) .map(function (exp) { return [exp.Date, exp.Payee, exp.Category, exp.Memo, exp.Outflow, exp.Inflow].join(",");}) .join("\n"); return str; }; // Save text file function saveText(text, filename){ var a = document.createElement('a'); a.setAttribute('href', 'data:text/plain;charset=utf-u,'+encodeURIComponent(text)); a.setAttribute('download', filename); a.click(); } function downloadSplitwiseCSV(start_date, end_date) { $.get( "https://secure.splitwise.com/api/v3.0/get_expenses", {"dated_after": start_date, "dated_before": end_date, "limit":0}, function( data ) { $.get("https://secure.splitwise.com/api/v3.0/get_current_user", function (user) { saveText(printExpenses(user.user.id, data.expenses), "splitwise.csv"); }); }); } $("#right_sidebar").append(` <h2> Download CSV file </h2> <link rel="stylesheet" href="https://ajax.googleapis.com/ajax/libs/jqueryui/1.12.1/themes/smoothness/jquery-ui.css"> <style> .date { width:10em;} </style> <div id="ncontent" onsubmit="return false;"> <form id="myform" action=""> <input name="start" type="text" class="date" value="Start Date"/> <input name="end" type="text" class="date" value="End Date"/> <input class="btn-orange btn-large btn" id="submit" type="submit" value="Download CSV"/> </form> </div> `); $(function () { $("input.date").datepicker(); }); $("#submit").click(function () { var data = {}; $("#myform").serializeArray() .forEach(function (x) { var fmt = "m/d/yy"; var d = $.datepicker.parseDate(fmt, x.value); return data[x.name] = d; }); downloadSplitwiseCSV(data["start"], data["end"]); });