非IT企業に勤める中年サラリーマンのIT日記

非IT企業でしかもITとは全く関係ない部署にいる中年エンジニア。唯一の趣味がプログラミングという”自称”プログラマー。

外貨exの約定履歴(csvファイル)を自動集計するマクロを作った(Google Apps Script)

   

外貨exの約定履歴(csvファイル)をGASで自動集計するようにしました。これを実行するとGoogleスプレッドシート上にデータが整理されグラフ描画まで行います。以下に手順を示しますが最後にソースコードを掲載しています。

外貨exから約定履歴をダウンロードする

まず、外貨exのアカウントページから約定履歴をダウンロードしましょう。左サイドメニューから約定履歴をクリックして必要な期間を選択するとcsvファイルをダウンロードすることができます。

 

こちらが約定履歴のcsvファイルです。この状態では集計に適していないのでGASでまとめ直します。あらかじめGoogleスプレッドシートにインポートしておきましょう

 

スプレッドシート上でマクロ実行

実行すると以下のように損益が明確になります。更にグラフを自動で生成してくれます。

 

 

ソースコード

ソースコードはこちら。convertTradeHistory関数を実行すると上記のようになります。

function convertTradeHistory() {
  const mainSheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName('Main');
  const dataSheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName('trade_history');

//前のデータクリア
  mainSheet.getRange("A6:H10000").clearContent();
  //trade_historyデータ取得
  var data = dataSheet.getRange("A2:L"+dataSheet.getLastRow()).getValues();
  data = data.reverse();
  var r=6;
  var total=0;
  data.forEach(function(elements){
    if(elements[8]!=''){
      mainSheet.getRange(r,1).setValue(elements[7]);  //約定日
      mainSheet.getRange(r,2).setValue(elements[2]);  //通貨ペア
      mainSheet.getRange(r,3).setValue(elements[3]);  //売買
      mainSheet.getRange(r,4).setValue(elements[9]);  //新規価格
      mainSheet.getRange(r,5).setValue(elements[4]);  //約定価格
      mainSheet.getRange(r,6).setValue(elements[5]);  //注文数量
      mainSheet.getRange(r,7).setValue(elements[10]);  //売買損益
      total += Number(elements[10]);
      mainSheet.getRange(r,8).setValue(total);  //損益累計

<pre><code>  r++;
}
</code></pre>

});

//グラフの縦軸の上限・下限・目盛り数を計算
  var gdata = mainSheet.getRange(&quot;H6:H&quot;+mainSheet.getLastRow()).getValues();
  var max = Math.max.apply(null,gdata);
  var min = Math.min.apply(null,gdata);
  var keta = Math.abs(max).toString().length;
  if(Math.abs(min).toString().length &gt; keta) keta = Math.abs(min).toString().length;
  var order = Math.pow(10, (keta-1));
  var axis_max = Math.ceil(max / order)<em>order; //グラフ縦軸のMAX
  var axis_mix = Math.floor(min / order)</em>order; //グラフ縦軸のMIX
  var span = order / 10 * 5;
  var axis_count = (axis_max-axis_mix) / span + 1;

//グラフ描画
  createChart(axis_max, axis_mix, axis_count);
}

function createChart(axis_max, axis_mix, axis_count) {
  var spreadsheet = SpreadsheetApp.getActive();
  var sheet = spreadsheet.getActiveSheet();
  var charts = sheet.getCharts();
  chart = charts[0];
  if(chart!=undefined) sheet.removeChart(chart);<br />
  chart = sheet.newChart()
  .asLineChart()
  .addRange(spreadsheet.getRange('H6:H263'))
  .setMergeStrategy(Charts.ChartMergeStrategy.MERGE_COLUMNS)
  .setTransposeRowsAndColumns(false)
  .setNumHeaders(-1)
  .setHiddenDimensionStrategy(Charts.ChartHiddenDimensionStrategy.IGNORE_BOTH)
  .setOption('bubble.stroke', '#000000')
  .setOption('legend.position', 'none')
  .setOption('annotations.domain.textStyle.color', '#808080')
  .setOption('textStyle.color', '#000000')
  .setOption('legend.textStyle.color', '#1a1a1a')
  .setOption('titleTextStyle.color', '#757575')
  .setOption('annotations.total.textStyle.color', '#808080')
  .setOption('hAxis.textStyle.color', '#000000')
  .setOption('vAxes.0.textStyle.fontSize', 18)
  .setOption('vAxes.0.textStyle.color', '#000000')
  .setOption('series.0.pointSize', 7)
  .setOption('series.0.lineWidth', 2)
  .setRange(axis_max, axis_mix) //グラフのレンジ(min, max)
  .setOption('vAxis.gridlines.count', axis_count) //目盛数
  .setOption('height', 558)
  .setOption('width', 902)
  .setPosition(4, 9, 25, 17)
  .build();
  sheet.insertChart(chart);
}

 

 

スポンサーリンク

 - Google Apps Script