口座が増えすぎて管理不能なので作ったシート スクリプト メモ

銀行、証券、クレカなど口座が増えすぎて管理不能。

なのでGoogleスプレッドシートとGASで作ったスクリプトなどを保存しておきます。

口座、口座分析シート

口座シート項目
sort1 sort2 sort1_2auto sort3 baseCurrency bankname ymd Total history

GAS

とりあえずザクっと作っただけなので色々と見苦しいコードだと思いますが用は果たすので。



function myFunction() {
  var sheet = SpreadsheetApp.
        getActiveSpreadsheet().getSheetByName('口座');
  lastRow = sheet.getLastRow();
  Logger.log(lastRow);

  lastCol = sheet.getLastColumn();
  Logger.log(lastCol);

 for(let i = 0; i <= lastCol; i++) {//列名配列を作っている。
    const body = sheet.getRange(1, i+1).getValue();
   //Logger.log(body);
   if(body==''){
     break;
   }
   //Logger.log(body);
   eval([body]+"_Col" + " = " + (i+1));

 }
  
  var komoku =['sort1','sort1_2auto','sort3','baseCurrency'];
  for(let k = 0; k < komoku.length; k++) {//項目配列を作る
    eval( "var "+komoku[k]+"_Array = []");
  }
  //var sort1_Array = [];
//  var sort1_Array = [];//重複削除
  var space_Array = [];//重複削除

  for(let i = 3; i <= lastRow; i++) {//sort1配列を作る
    for(let k = 0; k < komoku.length; k++) {  
//      eval( "const "+komoku[k]+"_Col_val = 3");
      eval( "var "+komoku[k]+"_Col_val = sheet.getRange(i, "+komoku[k]+"_Col).getValue()");
    }   //const 使えないっぽい。evalには?
//      const sort1_Col_val = sheet.getRange(i, sort1_Col).getValue();

    for(let k = 0; k < komoku.length; k++) {  
      if (!(eval(komoku[k]+"_Col_val in "+komoku[k]+"_Array"))) {
            eval(komoku[k]+"_Array["+komoku[k]+"_Col_val] = 0;");
//            sort1_Array[sort1_Col_val] = 0;
      }
    }
/*
      if (!(sort1_Col_val in sort1_Array)) {
            sort1_Array[sort1_Col_val] = 0;
      }
*/
    let gak = parseInt(sheet.getRange(i,Total_Col).getValue());
    if(!isNaN_(gak)){
      for(let k = 0; k < komoku.length; k++) {  
        eval(komoku[k]+"_Array["+komoku[k]+"_Col_val] = "+komoku[k]+"_Array["+komoku[k]+"_Col_val] + gak;");
      }
  //    sort1_Array[sort1_Col_val] = sort1_Array[sort1_Col_val] + gak;
    }
  }

 //ソート
 for(let k = 0; k < komoku.length; k++) {  
        eval(komoku[k]+"_Array = sorting_desc("+komoku[k]+"_Array);");
 }
//  sort1_Array = sorting_desc(sort1_Array);


/////////////////////特別処理
sort1_2auto_mod_Array = [];
//sort1_2auto_mod_Array.push('strawberry');
for (let basekey in sort1_Array) {
  if(basekey==""){
    continue;
  }
//  Logger.log('basekey:' + basekey + ' value:' + sort1_Array[basekey]);
  for (let key in sort1_2auto_Array) {
    if ( key.match(basekey+",")) {
      sort1_2auto_mod_Array[key]=sort1_2auto_Array[key];
    }
  }  
}
  //分析シート出力
  var analystic_sheet = SpreadsheetApp.
          getActiveSpreadsheet().getSheetByName('口座分析');

  analystic_sheet.appendRow(['集計開始']);
  analystic_sheet.deleteRows(1,analystic_sheet.getMaxRows()-1);

  for(let k = 0; k < komoku.length; k++) {  
    eval("set_data_for_analystic_sheet(analystic_sheet,"+komoku[k]+"_Array,'"+komoku[k]+"');");
  }
//  set_data_for_analystic_sheet(analystic_sheet,sort1_Array,'sort1');
  set_data_for_analystic_sheet(analystic_sheet,sort1_2auto_mod_Array,'sort1_2auto_mod');
  //set_data_for_analystic_sheet(analystic_sheet,space_Array,'filler');


///色分けなど
  analystic_sheet_lastRow = analystic_sheet.getLastRow();
  analystic_sheet_lastCol = analystic_sheet.getLastColumn();

  for(let i = 1; i <=analystic_sheet_lastRow; i++) {
      const midashi_val = analystic_sheet.getRange(i, 1).getValue();
      //Logger.log('midashi_val:' + midashi_val);
      var cells = analystic_sheet.getRange(i,1,1,analystic_sheet_lastCol);
      if(midashi_val == '合計'){
  //      analystic_sheet.getRange(i,1,1,2).setNumberFormat('[$¥-411]#,##0');
        cells.setNumberFormat('[$¥-411]#,##0');
      }
      if(midashi_val == '金額'){
        cells.setNumberFormat('[$¥-411]#,##0');
      }
      if(midashi_val == '%'){
        cells.setNumberFormat('0.00%');
      }
      if(midashi_val == 'filler'){
        cells.setBackground("#FFFF00");
      }else{
        cells.setBackground("#FFFFFF");
      }


  }
}



function set_data_for_analystic_sheet(analystic_sheet,Data_Array,msg){

  
  //Date型でオブジェクト生成(初期値は現在日時)
  var date = new Date();
  //現在時刻を表示
  //Logger.log(Utilities.formatDate( date, 'Asia/Tokyo', 'yyyy/MM/dd hh:mm:ss'));
  var ymd = Utilities.formatDate( date, 'Asia/Tokyo', 'yyyy/MM/dd HH:mm:ss');
  analystic_sheet.appendRow(['filler',msg,ymd]);
	
  var total_sum = 0;
	for(var key in Data_Array){
	  total_sum = total_sum + Data_Array[key];
	}
	analystic_sheet.appendRow(['合計',total_sum]);

	var val_Array = ['項目'];
	for(var key in Data_Array){
	//  Logger.log('key:' + key);
	  //Logger.log('value:' + Data_Array[key]);
	  val_Array.push(key);
	}
	analystic_sheet.appendRow(val_Array);


	var val_Array = ['金額'];
	for(var key in Data_Array){
//	  Logger.log('key:' + key);
	  //Logger.log('value:' + Data_Array[key]);
	  val_Array.push(Data_Array[key]);
	}
	analystic_sheet.appendRow(val_Array);

	var val_Array = ['%'];
	for(var key in Data_Array){
//	  Logger.log('key:' + key);
	  //Logger.log('value:' + Data_Array[key]);
	  val_Array.push(Data_Array[key]/total_sum);
	}
	analystic_sheet.appendRow(val_Array);

  

}




function isNaN_ (value) {
  return typeof value === 'number' && value !== value
}

function sorting_desc(obj){
  var pairs = Object.entries(obj);
  pairs.sort(function(p1, p2){
    var p1Val = p1[1], p2Val = p2[1];
  //  return p1Val - p2Val;
    return p2Val - p1Val;
  })
  obj = Object.fromEntries(pairs);
  return obj;
}

 

 

 

 

 

2022 cryptactくリプタクト上の残高との突合スクリプト作成

残高スクリプトはこちらでできています。

環境はGASで、【確定申告_暗号資産数量計算シート】で作っています。

2022 確定申告の為。仮想通貨保有残高合計計算スクリプトを作りました。

それとは別に合計を計算したデータとクリプタクト上のデータの突合、差分を作るスクリプトを書きました。

用は人間業では不可能になると思われますので。

確定申告_暗号資産数量計算シートに、中間Dataシートを作成しました。ここに計算結果を出すことにします。

 

元データはマニュアルでコピーします。

 

 

A1:Cryptact_web_貼付説明

メモ内容



A1:Cryptact_web_貼付説明

メモ:

クリプタクトから通貨一覧コピー、
フォーマットは以下
ーーーーーーーーー
1

ネクスト NXT

208.54175065 0.4792 +4.08% 31.9473 99.9356 -6,562
2

デジバイト DGB

82.85082873 1.1262 +0.93% 4.3408 93.3057 -266
3

オミセゴー OMG

66.94169324 137.8163 -0.26% 539.7042 9,225.6551 -26,903

 

 

A2:メモ設定貼付CELL

メモ欄にクリプタクトのWEBからコピペします。

F,G,Hカラム。

計算結果シートから手動でコピペします。

ここまでを元データとしてスクリプトで計算します。

JからNまで:計算した結果を出力します。

J:存在場所:detailのコピー

コイン名:各コインのアルファベットのみ

計算結果残高:合計計算シート上の残高

クリプタクト残高:クリプタクト上の残高

差分:クリプタクト上で誤差としてプラスマイナスする予定の残高。

スクリプトの内容



function onOpen() {//メニュー追加、変更
  var ui = SpreadsheetApp.getUi();           
  var menu = ui.createMenu('追加したメニュー');  
  menu.addItem('計算実行', 'myFunction');   
  menu.addItem('中間データ差分計算', 'totsugoData');   
  menu.addToUi();                            
}

function cryptact_diff_calc_result(){
  var sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("中間Data");
  range = sheet.getRange(2,6,sheet.getLastRow(),3);
  var datas = range.getValues();
  return datas;
}
function totsugoData(){
  var sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("中間Data");
  var range = sheet.getRange(2,1,1,1);
  var data = range.getNote();
  var data_ar1 = data.split("\n");
  var cryptact_mod_out = [];
  for(var i=0;i<data_ar1.length;i++){
    if(i%5=="0.0"){//項目ごと
      var crypt_each_ar = [];
      crypt_each_ar[0]=data_ar1[i].replace("	","");
      var crypt_name_ar = data_ar1[i+2].split(" ");
      crypt_each_ar[1]=crypt_name_ar[crypt_name_ar.length - 1];
      var quantity_ar = data_ar1[i+4].split("	");
      crypt_each_ar[2]=quantity_ar[0];
      cryptact_mod_out.push(crypt_each_ar);
    }

  }
  //クリプタクト残高出力
  var out_range = sheet.getRange(2,2,cryptact_mod_out.length,cryptact_mod_out[0].length);
  out_range.deleteCells(SpreadsheetApp.Dimension.ROWS);
  out_range.setValues(cryptact_mod_out);

  var calc_result_ar = cryptact_diff_calc_result();

  var out_diff_calc_ar = [];
  for(var i=0;i<calc_result_ar.length;i++){
    if(calc_result_ar[i][0] == ""){
      break;
    }
    var match_array = [];
    match_array[0]=calc_result_ar[i][2];
    match_array[1]=calc_result_ar[i][0];
    match_array[2]=parseFloat(calc_result_ar[i][1]);
    for(var k=0;k<cryptact_mod_out.length;k++){
      var cryptact_zandaka = 0;
      if(calc_result_ar[i][0] == cryptact_mod_out[k][1]){
        cryptact_zandaka = cryptact_mod_out[k][2];
        break;
      }
    }
    match_array[3]=cryptact_zandaka.toString().replace(",","");
    match_array[4]=-1 * parseFloat(match_array[3]*1 - match_array[2]*1);
    out_diff_calc_ar.push(match_array);
  }
  //逆にCryptactだけにあるやつを追加
  for(var k=0;k<cryptact_mod_out.length;k++){
    match_flg = 0;
    for(var i=0;i<calc_result_ar.length;i++){
      if(calc_result_ar[i][0] == cryptact_mod_out[k][1]){
        match_flg = 1;
        break;
      }
    }
    if(match_flg == 0){
      var match_array = [];
      match_array[0]="Cryptact上にしかない";
      match_array[1]=cryptact_mod_out[k][1];
      match_array[2]=0;
      match_array[3]=parseFloat(cryptact_mod_out[k][2]);
      match_array[4]=-1 * parseFloat(cryptact_mod_out[k][2]);
      out_diff_calc_ar.push(match_array);
    }
  }

  var out_range = sheet.getRange(2,10,out_diff_calc_ar.length,out_diff_calc_ar[0].length);
  out_range.deleteCells(SpreadsheetApp.Dimension.ROWS);
  out_range.setValues(out_diff_calc_ar);


}


 

合計を計算する時に「中間」と付くやつを除外しないといけない。若干修正。



function myFunction() {
  var sheets = SpreadsheetApp.getActiveSpreadsheet().getSheets();
  sheet_ar = [];
  if (sheets.length > 0){
    for(sheet of sheets){
      if(sheet.getName()=="計算結果"){
      }
      else if(sheet.getName().match("中間")!=null){
      }
      else{
          data = get_sheet_data_merge(sheet.getName());
          for(var i=0;i