取りあえず確定申告で必要と思うので。
各取引所など保有場所の通貨ごと合計を出力するGASプロジェクト。
事前処理として各取引所はSheetごとに記録しておきます。
取りあえずなので何の検証もしていない状態ですが、やっつけで作りました。
テストプログラム、テストデータを使ってとりあえず動いているのではないかな?
このまま修正なく正確に計算してくれることを祈る。
2022-11-07(MO)各取引所の残高を一覧で見えるように修正。とりあえず
取りあえず突合に必要なため機能追加。
// ver 0.1_20221020
function onOpen() {
var ui = SpreadsheetApp.getUi();
var menu = ui.createMenu('追加したメニュー');
menu.addItem('計算実行', 'myFunction');
menu.addToUi();
}
function myFunction() {
var sheets = SpreadsheetApp.getActiveSpreadsheet().getSheets();
sheet_ar = [];
if (sheets.length > 0){
for(sheet of sheets){
if(sheet.getName()=="計算結果"){
}else{
data = get_sheet_data_merge(sheet.getName());
for(var i=0;i<data.length;i++){
sheet_ar.push(data[i]);
}
}
}
//連想配列化,各シートの情報を取得しています
var keys = ["取引所説明","記録時間","仮想通貨","残高","コメント"];
object = convertRowToObject(keys,sheet_ar)
//通貨一覧作成,各シートのトークンリストを纏めて重複をなくす
var token_array = [];
for(var i=0;i<object.length;i++){
if(token_array.includes(object[i]['仮想通貨'])){
}else{
token_array.push(object[i]['仮想通貨']);
}
}
//合計計算
var token_renso={};
var token_detail_renso={};
for(var i=0;i<token_array.length;i++){
token_renso[token_array[i]]=0;
token_detail_renso[token_array[i]]="";
}
for(var i=0;i<token_array.length;i++){
for(var j=0;j<object.length;j++){
if(token_array[i] == object[j]['仮想通貨']){
token_renso[token_array[i]] = token_renso[token_array[i]] *1 + object[j]['残高'];
token_detail_renso[token_array[i]] = token_detail_renso[token_array[i]] + "{" + object[j]['取引所説明']+":"+object[j]['残高']+"}";
}
}
}
//Logger.log(token_detail_renso);
//縦配列化、detailの情報も追加
const d1 = dayjs.dayjs();
var tate_ar = [["実行時刻",d1.format('YYYY-MM-DD HH:mm:ss'),"detail"]];
//const array = [Object.keys(token_renso),Object.values(token_renso)];
for(var key in token_renso){
var tmp_ar = [key,token_renso[key],token_detail_renso[key]];
tate_ar.push(tmp_ar);
}
//書き出し
var sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("計算結果");
sheet.clearContents();
//Sheetオブジェクト.getRange(行番号, 列番号, 行数, 列数)
var range = sheet.getRange(1,1,tate_ar.length,3);
range.setValues(tate_ar);
//書き出したデータのソート
var data = sheet.getRange(2, 1, tate_ar.length, tate_ar[0].length + 1);
data.sort({column: 1, ascending: true});
//会社と取得日付を出力
//取引所説明、記録時間を纏めてリスト化します。
var company_getymd_array = [];
for(var i=0;i<object.length;i++){
//Utilities.formatDate(new Date(), "JST", "yyyy/MM/dd HH:mm:ss")
//Utilities.formatDate(object[i]['記録時間'], "JST", "yyyy/MM/dd HH:mm:ss")
if(company_getymd_array.includes(object[i]['取引所説明']+";;;"+Utilities.formatDate(object[i]['記録時間'], "JST", "yyyy/MM/dd"))){
}else{
company_getymd_array.push(object[i]['取引所説明']+";;;"+Utilities.formatDate(object[i]['記録時間'], "JST", "yyyy/MM/dd"));
}
}
var tate_ar = [["取引所説明","取得時間"]];
for(var i=0;i<company_getymd_array.length;i++){
company_getymd_array_explode = company_getymd_array[i].split(";;;");
tate_ar.push(company_getymd_array_explode);
}
var range = sheet.getRange(1,5,tate_ar.length,2);
// range.setNumberFormat("yyyy/mm/dd日 dddd");
range.setValues(tate_ar);
}
}
function convertRowToObject(keys,values) {
return values.map(function(row) {
var object = {};
row.map(function(column, index) {
object[keys[index]] = column;
});
return object;
});
}
function get_sheet_data_merge(sheet_name,sheet_ar){
//sheet_ar = [];
var sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName(sheet_name);
//Sheetオブジェクト.getRange(行番号, 列番号, 行数, 列数)
//列数はEで決め打ち
range = sheet.getRange(2,1,sheet.getLastRow(),5);
var data = range.getValues();
for (var i = 0; i < data.length; i++) {
if (data[i][1]==""){
data.splice(i);
}
}
return data;
}
2022年10月20日 機能追加スクリプト変更
メニューに追加と、一応取引所毎のデータ取得日時を出すようにしました。
要は突合で全データを取得したよと言うのが一覧で分かるように。
取得日付も一覧で分かった方が良いかと。
// ver 0.1_20221020
function onOpen() {
var ui = SpreadsheetApp.getUi();
var menu = ui.createMenu('追加したメニュー');
menu.addItem('計算実行', 'myFunction');
menu.addToUi();
}
function myFunction() {
var sheets = SpreadsheetApp.getActiveSpreadsheet().getSheets();
sheet_ar = [];
if (sheets.length > 0){
for(sheet of sheets){
if(sheet.getName()=="計算結果"){
}else{
data = get_sheet_data_merge(sheet.getName());
for(var i=0;i<data.length;i++){
sheet_ar.push(data[i]);
}
}
}
//連想配列化,各シートの情報を取得しています
var keys = ["取引所説明","記録時間","仮想通貨","残高","コメント"];
object = convertRowToObject(keys,sheet_ar)
//通貨一覧作成,各シートのトークンリストを纏めて重複をなくす
var token_array = [];
for(var i=0;i<object.length;i++){
if(token_array.includes(object[i]['仮想通貨'])){
}else{
token_array.push(object[i]['仮想通貨']);
}
}
//合計計算
var token_renso={};
for(var i=0;i<token_array.length;i++){
token_renso[token_array[i]]=0;
}
for(var i=0;i<token_array.length;i++){
for(var j=0;j<object.length;j++){
if(token_array[i] == object[j]['仮想通貨']){
token_renso[token_array[i]] = token_renso[token_array[i]] *1 + object[j]['残高'];
}
}
}
//縦配列化
const d1 = dayjs.dayjs();
var tate_ar = [["実行時刻",d1.format('YYYY-MM-DD HH:mm:ss')]];
//const array = [Object.keys(token_renso),Object.values(token_renso)];
for(var key in token_renso){
var tmp_ar = [key,token_renso[key]];
tate_ar.push(tmp_ar);
}
//書き出し
var sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("計算結果");
sheet.clearContents();
//Sheetオブジェクト.getRange(行番号, 列番号, 行数, 列数)
var range = sheet.getRange(1,1,tate_ar.length,2);
range.setValues(tate_ar);
//会社と取得日付を出力
//取引所説明、記録時間を纏めてリスト化します。
var company_getymd_array = [];
for(var i=0;i<object.length;i++){
//Utilities.formatDate(new Date(), "JST", "yyyy/MM/dd HH:mm:ss")
//Utilities.formatDate(object[i]['記録時間'], "JST", "yyyy/MM/dd HH:mm:ss")
if(company_getymd_array.includes(object[i]['取引所説明']+";;;"+Utilities.formatDate(object[i]['記録時間'], "JST", "yyyy/MM/dd"))){
}else{
company_getymd_array.push(object[i]['取引所説明']+";;;"+Utilities.formatDate(object[i]['記録時間'], "JST", "yyyy/MM/dd"));
}
}
var tate_ar = [["取引所説明","取得時間"]];
for(var i=0;i<company_getymd_array.length;i++){
company_getymd_array_explode = company_getymd_array[i].split(";;;");
tate_ar.push(company_getymd_array_explode);
}
var range = sheet.getRange(1,4,tate_ar.length,2);
// range.setNumberFormat("yyyy/mm/dd日 dddd");
range.setValues(tate_ar);
}
}
function convertRowToObject(keys,values) {
return values.map(function(row) {
var object = {};
row.map(function(column, index) {
object[keys[index]] = column;
});
return object;
});
}
function get_sheet_data_merge(sheet_name,sheet_ar){
//sheet_ar = [];
var sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName(sheet_name);
//Sheetオブジェクト.getRange(行番号, 列番号, 行数, 列数)
//列数はEで決め打ち
range = sheet.getRange(2,1,sheet.getLastRow(),5);
var data = range.getValues();
for (var i = 0; i < data.length; i++) {
if (data[i][1]==""){
data.splice(i);
}
}
return data;
}
2022年10月17日
計算方法は以下。ソースのままだけど要はそれぞれの場所ごとに合計して出力しています。
function myFunction() {
var sheets = SpreadsheetApp.getActiveSpreadsheet().getSheets();
sheet_ar = [];
if (sheets.length > 0){
for(sheet of sheets){
if(sheet.getName()=="計算結果"){
}else{
data = get_sheet_data_merge(sheet.getName());
for(var i=0;i<data.length;i++){
sheet_ar.push(data[i]);
}
}
}
//連想配列化
var keys = ["取引所説明","記録時間","仮想通貨","残高","コメント"];
object = convertRowToObject(keys,sheet_ar)
//通貨一覧作成
var token_array = [];
for(var i=0;i<object.length;i++){
if(token_array.includes(object[i]['仮想通貨'])){
}else{
token_array.push(object[i]['仮想通貨']);
}
}
//合計計算
var token_renso={};
for(var i=0;i<token_array.length;i++){
token_renso[token_array[i]]=0;
}
for(var i=0;i<token_array.length;i++){
for(var j=0;j<object.length;j++){
if(token_array[i] == object[j]['仮想通貨']){
token_renso[token_array[i]] = token_renso[token_array[i]] *1 + object[j]['残高'];
}
}
}
//縦配列化
const d1 = dayjs.dayjs();
var tate_ar = [["実行時刻",d1.format('YYYY-MM-DD HH:mm:ss')]];
//const array = [Object.keys(token_renso),Object.values(token_renso)];
for(var key in token_renso){
var tmp_ar = [key,token_renso[key]];
tate_ar.push(tmp_ar);
}
//書き出し
var sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("計算結果");
//Sheetオブジェクト.getRange(行番号, 列番号, 行数, 列数)
const range = sheet.getRange(1,1,tate_ar.length,2);
range.setValues(tate_ar);
}
}
function convertRowToObject(keys,values) {
return values.map(function(row) {
var object = {};
row.map(function(column, index) {
object[keys[index]] = column;
});
return object;
});
}
function get_sheet_data_merge(sheet_name,sheet_ar){
//sheet_ar = [];
var sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName(sheet_name);
//Sheetオブジェクト.getRange(行番号, 列番号, 行数, 列数)
//列数はEで決め打ち
range = sheet.getRange(2,1,sheet.getLastRow(),5);
var data = range.getValues();
for (var i = 0; i < data.length; i++) {
if (data[i][1]==""){
data.splice(i);
}
}
return data;
}