日々の金額データをDBのようにためこんで、そこから月ごとの収支表を出してみたいと考えています。下記のコードは、ざっくりとこんな感じを想定して作っています。
【データ作成の流れ】
DBから日付のみを二次元配列でごっそりとってきて、yyyy/mmの形にする。
1 行数をもとに1番目のyyyy/mm(2019/01など)をとってきて、日付配列の中にそれがいくつ含まれているかを数える
2 最初のデータの行がわかれば、1のデータを足せばDB上で最後のデータの行がわかるため(大体ひと月31日とかになります)、1列ずつ縦にデータを足し、各項目の1ヶ月の総合金額が算出できるようにする。さらに、それらを集めて配列にし、1か月分の配列データを作る。
1,2をループさせ、1ヶ月分のデータを一つの二次元配列になるように押し込んでいく。ループ内で行数とyyyy/mmを取ってくる部分が増えていくため、重複なしで1か月分が取り出せる想定。
【未解決部分】
1 何回も実験したが、最終的にシートに張り付けた際に、最後に算出した月のデータしか張り付かなかった。(二次元配列化の失敗?)
2 張り付いたデータについて、1ヶ月目はきれいに合計が出ていたが、2か月目は、次の月の分まで加算した算出データとなってしまっていた。さらに、その次の月では、3か月分が合計されてしまった
非常に複雑になってしまったかと思います。すみません。
コード内で不審な点があれば、ご指摘をお願いします。
Javascript
1//実際にデータが一覧となるシートへ張り付けるための配列データをつくる 2function dateChanging1(){ 3 var data1 = DBSheet.getRange(1, 1, 93, 1).getValues(); 4 for(var i = 0; i < data1.length; i++){ 5 data1[i][0] = Utilities.formatDate(data1[i][0],"JST","yyyy/MM"); 6 } 7 var counter = 0; 8 for(var row = counter + 1; row < 93; row = counter + 1){ 9 var originData = DBSheet.getRange(row, 1, 1, 1).getValues(); 10 originData = Utilities.formatDate(originData[0][0],"JST","yyyy/MM"); 11 counter = getDatacounter(originData,row,data1,counter);//最初のデータを取得・そのデータがいくつあるかを数える→counterのデータを返す 12 var makeArrayData = makeData(row,originData,counter);//対象行の範囲データを取得 13 //var insertplusCalculate = makeCalculate();//tsumekomiで作った配列に収支それぞれの計算結果を入れる 14 var superarray = []; 15 superarray.push(makeArrayData); 16 } 17 input(superarray); 18} 19//日付の配列から、探したい日付がいくつあるかを調べる 20function getDatacounter(originData,row,data1,counter){ 21Logger.log(originData) 22 for (var i = 0; i < data1.length; i++) { 23 if(data1[i][0] == originData){ 24 counter++; 25 } 26 } 27 return counter; 28} 29//探したい日付の個数を実際のDBスプレッドシートにて行数とし、列ごとにデータを配列化する 30function makeData(row,originData,counter){ 31 var N_DBData = []; 32 var AAA = DBSheet.getRange(row, 1, counter, DBSheet.getLastColumn()).getValues(); 33 N_DBData.push(originData); 34 for(var i2 = 1; i2 < DBSheet.getLastColumn(); i2++){ 35 var v = 0; 36 for(var i1 = 0; i1 < counter; i1++){ 37 v = v + AAA[i1][i2]; 38 } 39 N_DBData.push(v); 40 } 41 return N_DBData; 42} 43function input(superarray){ 44 MonthlySheet.getRange("C2:P2").setValues(superarray); 45}
回答1件
あなたの回答
tips
プレビュー