回答編集履歴

1

つら

2019/10/30 07:09

投稿

papinianus
papinianus

スコア12705

test CHANGED
@@ -1,65 +1,139 @@
1
- ## 推定するデータ
2
-
3
- こういうことだと考えました。行と列が正しく使えてないので間違っているかも
4
-
5
-
6
-
7
- |A|B|C|D|E|F|G|H|
8
-
9
- |--|--|--|--|--|--|--|--|
10
-
11
- |?|01|月|?|?|イベ|イベ||
12
-
13
- |?|02|火|?|?|イベ|||
14
-
15
- |?|03|水|?|?|イベ|イベ|イベ|
16
-
17
-
18
-
19
- ## 推定する得たい結果
20
-
21
-
22
-
23
- |A|B|C|D|
24
-
25
- |--|--|--|--|
26
-
27
- |04|イベ|イベ||
28
-
29
- |11|イベ|||
30
-
31
- |18|イベ|イベ|イベ|
32
-
33
-
34
-
35
- ## コード
36
-
37
- テストしてないです多分こういうこと考えます
1
+ コード未検証おそらくこういうこと思う
38
-
39
- 現状のコードについては行と列がどうあるべきか分からないので直しようがないです。行方向については、変数すらありません。
40
2
 
41
3
 
42
4
 
43
5
  ```javascript
44
6
 
45
- function q219502(){
7
+ function q219502() {
46
8
 
47
- const dateCol = 2 - 1;//row は行、colは列。コメントを信じてcolと考える
9
+ const spreadSheet = SpreadsheetApp.getActive();
48
10
 
49
- const dayCol = 3 - 1;//row は行、colは列。コメントを信じてcolと考える
11
+ const eventSheet = spreadSheet.getSheetByName('event');
50
12
 
13
+ const startOfDataRow = 2; //10/24 が C2 と仮定
14
+
15
+ const startOfDataCol = 3; //10/24 が C2 と仮定
16
+
17
+ const endRow = eventSheet.getLastRow();
18
+
51
- const eventsStartCol = 6 - 1;
19
+ const endCol = eventSheet.getLastColumn();
20
+
21
+ // 結合セルからデータをひろってくる
22
+
23
+ const allData = q180220_getMargedRangeValues(sheet, startOfDataRow, startOfDataCol, endRow, endCol);
24
+
25
+ // 曜日でフィルタ
52
26
 
53
27
  const theDay = "木";
54
28
 
55
- const book = SpreadsheetApp.getActive();
29
+ const indexOfTheDays = allData[1].reduce(function(a, c ,i) { return c === theDay ? a.concat([i]) : a;},[]);
56
30
 
57
- const events = book.getSheetByName('event').getDataRange().getValues().filter(function (r) { return r[dayCol] === theDay;});
31
+ // // 曜日行を消す
58
32
 
59
- const dateAndEvents = events.map(function(e) { return e.slice(dateCol,dateCol + 1).concat(e.slice(eventsStartCol));});7
33
+ allData.splice(1,1);
60
34
 
35
+ // // 曜日を行方向にして、空白をスキップしたデータに作り直す(求める姿とは行と列が逆転している。
36
+
37
+ const summed = indexOfTheDays.map(function(p){ return allData.reduce(function(a,c,i){ return i === p && c !== "" ? a.concat([c]) : a ;},[]);});
38
+
39
+ const maxSize = summed.reduce(function(a,c){ return c.length > a ? c : a ;}, 0);
40
+
41
+ // // 行の長さを揃える
42
+
43
+ const fixed = summed.map(function(r){ return fillingArray(r, maxSize, "");} );
44
+
45
+ // 行列転置
46
+
47
+ const transposed = fixed[0].map(function(_, c) { return fixed.map(function(r) { return r[c];});});
48
+
61
- book.getSheetByName('test').getRange(1,1,dateAndEvents,length, dateAndEvents[0].length).setValues(dateAndEvents);
49
+ spreadSheet.getSheetByName('test').getRange(1,1,transposed.length, transposed[0].length).setValues(transposed);
50
+
51
+ }
52
+
53
+
54
+
55
+ // getRangeと同じように 1-indexed で指定する
56
+
57
+ function q180220_getMargedRangeValues(sheet, startRow, startCol, endRow, endCol) {
58
+
59
+ const targetRange = sheet.getRange(startRow, startCol, endRow, endCol);
60
+
61
+ var ret = targetRange.getValues();
62
+
63
+ targetRange.getMergedRanges().forEach(function(rng) {
64
+
65
+ var startR = rng.getRow();
66
+
67
+ var startC = rng.getColumn();
68
+
69
+ var rngVal = rng.getValue();
70
+
71
+ var rngA1 = rng.getA1Notation();
72
+
73
+ var rowBoundary = startR + rng.getNumRows();
74
+
75
+ var colBoundary = startC + rng.getNumColumns();
76
+
77
+ for(var ri = startR; ri < rowBoundary ; ri++) {
78
+
79
+ var ri_a = ri - startRow;
80
+
81
+ if(ri_a < 0) { continue; }
82
+
83
+ if(ret.length <= ri_a) { break; }
84
+
85
+ for(var ci = startC; colBoundary; ci++) {
86
+
87
+ var ci_a = ci - startCol;
88
+
89
+ if(ci_a < 0) { continue; }
90
+
91
+ if(ret[ri_a].length <= ci_a) { break; }
92
+
93
+ ret[ri_a][ci_a] = rngVal;
94
+
95
+ }
96
+
97
+ }
98
+
99
+ });
100
+
101
+ return ret;
102
+
103
+ }
104
+
105
+
106
+
107
+ function fillingArray(array, len, fill) {
108
+
109
+ var pseudo = [];
110
+
111
+ for(var i = 0; i < len; i++) {
112
+
113
+ pseudo.push(fill);
114
+
115
+ }
116
+
117
+ return array.concat(pseudo).slice(0, len);
62
118
 
63
119
  }
64
120
 
65
121
  ```
122
+
123
+
124
+
125
+ ### 将来参考に訪れたかたへ
126
+
127
+ あなたのデータを見直してください。
128
+
129
+
130
+
131
+ 列方向に組まれたデータはハンドリングが大変です。
132
+
133
+ データベースもGoogle Sheet(を加工するGoogle App Script)も行方向に1データです。
134
+
135
+
136
+
137
+ 表示に最適化されすぎたデータはプログラム処理に向きません。
138
+
139
+ データモデルと表示は分離して、結合列や背景色でデータを表現しないようにしましょう。プレゼンするときにだけ、整形しましょう。またプレゼンのために新たに作らなくても、google sheetやexcelでは他のシートを参照する機能があるので、データシートと連動する表示シートを作るのはさほど難しくないはずです。