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

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

なので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;
}

 

 

 

 

 

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です