Mulla on Google Sheets -viritelmä, joka hakee osakkeiden kurssit automaattisesti ja laskee myös salkun arvon (arki)päivisin aina tiettyyn kellonaikaan. Google Sheetsiin saa melko helposti väkerrettyä käynnistimiä haluamilleen parametreille. Homma tosin vaatii skriptausta, mutta netistä löytyy keittokirjaohjeet tähän, jos koodaaminen ei ole entuudestaan tuttua.
Kun ohjelma laskee salkun arvon joka päivä, niin siitä saa helposti piirettyä TWR-graafin ja salkun arvonkehityksestä piirtyy kaunis graafi. Halutessaan tälle voi vielä etsiä jonkun vertailuindeksin ja seurata salkun kehitystä tätä vastaan.
Jotenkin virittämällä skriptiä saisi sen varmaan laskemaan TWR-arvon myös, mutta tähän ei mene montaa sekuntia kun kopioi vaan tiedon ylemmältä riviltä. Kaavaa toki pitää muokata kun salkkuun tallettaa/salkusta nostaa rahaa, mutta se nyt on pientä kun salkun muutokset muutenkin pitää syöttää käsin.
Tässä valmis koodipätkä, jota voit sitten muokata omaa tarvetta varten. Eli tarvitset “Portfolio” ja “Historia” -nimiset välilehdet.
Komento var value = portfolioSheet.getRange(17, 8, 1, 1).getValue(); lukee solun riviltä 17 ja sarakkeesta 8 (kaksi seuraavaa arvoa kertoo miten monta solua luetaan). Toinen luettava arvo on rivillä 49 ja sarakkeessa 8. Vastaavasti voit lisätä luettavia soluja lisäämällä alle uuden rivin (muutoin sama mutta käytä value 3 jne).
Seuraava kappale kertoo mihin edellä luettu arvo sijoitetaan. Ekaan sarakkeeseen tulee päivämäärä ja sitten em. lukuarvo seuraavaan. Uusi arvo tulee aina seuraavalle tyhjälle riville.
function addResult() {
var spreadsheet = SpreadsheetApp.getActiveSpreadsheet();
var portfolioSheet = spreadsheet.getSheetByName(“Portfolio”);
var historySheet = spreadsheet.getSheetByName(“Historia”);
// Refresh until all N/A values disappear
var dataArrayRange = portfolioSheet.getRange(1,1,portfolioSheet.getLastRow(),portfolioSheet.getLastColumn());
var dataArray = dataArrayRange.getValues(); // necessary to refresh custom functions
var nanFound = true;
while(nanFound) {
for(var i = 0; i < dataArray.length; i++) {
if(dataArray[i].indexOf(‘#N/A’) >= 0) {
nanFound = true;
dataArray = dataArrayRange.getValues();
break;
} // end if
else if(i == dataArray.length - 1) nanFound = false;
} // end for
} // end while
// Fetch date and portfolio value
var value = portfolioSheet.getRange(17, 8, 1, 1).getValue();
var value2 = portfolioSheet.getRange(49, 8, 1, 1).getValue();
var date = new Date();
var date = new Date();
// Calculate where to write new information
var lastRow = historySheet.getLastRow();
var dateCell = historySheet.getRange(lastRow+1, 1);
var valueCell = historySheet.getRange(lastRow+1, 2);
var value2Cell = historySheet.getRange(lastRow+1, 3);
// Store values
dateCell.setValue(date);
valueCell.setValue(value);
value2Cell.setValue(value2);
}