回答編集履歴
4
a
test
CHANGED
@@ -86,13 +86,13 @@
|
|
86
86
|
|
87
87
|
const define = {
|
88
88
|
|
89
|
-
"mission":[255,255,0],
|
89
|
+
"mission": [255, 255, 0],
|
90
90
|
|
91
|
-
"stage":[255,0,255]
|
91
|
+
"stage": [255, 0, 255]
|
92
92
|
|
93
93
|
}
|
94
94
|
|
95
|
-
return define[t] ? define[t] : [255,255,255]
|
95
|
+
return define[t] ? define[t] : [255, 255, 255]
|
96
96
|
|
97
97
|
}
|
98
98
|
|
@@ -104,15 +104,15 @@
|
|
104
104
|
|
105
105
|
const eventsSheetName = "EventInfoSheet";
|
106
106
|
|
107
|
-
const eventColor = "yellow"; // イベントの日程を埋めるための色 #eeeeee とかでも可
|
108
|
-
|
109
107
|
// prepare
|
110
108
|
|
111
109
|
if (scheduleEnd <= scheduleStart) return;
|
112
110
|
|
113
111
|
const events = SpreadsheetApp.getActive().getSheetByName(eventsSheetName).getDataRange().getValues().slice(1).filter(([ev, tp, st, en]) => ev !== "" && tp !== "" && st <= en && en >= scheduleStart);
|
114
112
|
|
113
|
+
const eventsCnt = events.length;
|
114
|
+
|
115
|
-
if (events
|
115
|
+
if (eventsCnt < 1) return;
|
116
116
|
|
117
117
|
// カレンダーを作る
|
118
118
|
|
@@ -130,15 +130,17 @@
|
|
130
130
|
|
131
131
|
target.getRange(1, 3, 3, calendar[0].length).setNumberFormat("dd").setValues(calendar);
|
132
132
|
|
133
|
+
calendar[2].reduce((a,c,i)=>(c === "土" || c === "日")?a.concat(i):a,[]).forEach(e=>target.getRange(2,e+3,eventsCnt+2,1).setBackgroundColor("gray"));
|
134
|
+
|
133
135
|
// イベント埋める
|
134
136
|
|
135
|
-
target.getRange(4, 1, events
|
137
|
+
target.getRange(4, 1, eventsCnt, 2).setValues(events.map(([e, t]) => [e, t]));
|
136
138
|
|
137
139
|
target.autoResizeColumns(1, calendar[0].length + 2); // 記入項目は埋まったので、ここで列幅を調整
|
138
140
|
|
139
141
|
const diffFromStart = genDiffDays(scheduleStart);
|
140
142
|
|
141
|
-
events.map(([, t, s, e], i) => getRGBforEvent(t).concat([i + 4, 3 + diffFromStart(Math.max(scheduleStart, s)), 1, diffFromStart(Math.min(scheduleEnd, e)) - diffFromStart(Math.max(scheduleStart, s)) + 1])).forEach(e => target.getRange(...e.slice(3)).setBackgroundRGB(...e.slice(0,3)));
|
143
|
+
events.map(([, t, s, e], i) => getRGBforEvent(t).concat([i + 4, 3 + diffFromStart(Math.max(scheduleStart, s)), 1, diffFromStart(Math.min(scheduleEnd, e)) - diffFromStart(Math.max(scheduleStart, s)) + 1])).forEach(e => target.getRange(...e.slice(3)).setBackgroundRGB(...e.slice(0, 3)));
|
142
144
|
|
143
145
|
};
|
144
146
|
|
3
あ
test
CHANGED
@@ -44,15 +44,15 @@
|
|
44
44
|
|
45
45
|
sheet.setFrozenColumns(2);
|
46
46
|
|
47
|
-
sheet.getRange(1,1,2,2).merge().setHorizontalAlignment("center").setVerticalAlignment("middle").setBackground("black").setFontColor("white").setValue("イベントカレンダー");
|
47
|
+
sheet.getRange(1, 1, 2, 2).merge().setHorizontalAlignment("center").setVerticalAlignment("middle").setBackground("black").setFontColor("white").setValue("イベントカレンダー");
|
48
48
|
|
49
|
-
sheet.getRange(3,1,1,2).setHorizontalAlignment("center").setVerticalAlignment("middle").setBackground("green").setFontColor("white").setValues([["イベント名","タイプ"]]);
|
49
|
+
sheet.getRange(3, 1, 1, 2).setHorizontalAlignment("center").setVerticalAlignment("middle").setBackground("green").setFontColor("white").setValues([["イベント名", "タイプ"]]);
|
50
50
|
|
51
|
-
}
|
51
|
+
};
|
52
52
|
|
53
53
|
const dateToString = date => Utilities.formatDate(date, "Asia/Tokyo", "MM/dd");
|
54
54
|
|
55
|
-
const dayToString = num => ["日","月","火","水","木","金","土"][num];
|
55
|
+
const dayToString = num => ["日", "月", "火", "水", "木", "金", "土"][num];
|
56
56
|
|
57
57
|
const genDiffDays = d1 => d2 => (d2 - d1) / 86400000;
|
58
58
|
|
@@ -66,7 +66,7 @@
|
|
66
66
|
|
67
67
|
let cur = new Date(start.getFullYear(), start.getMonth(), start.getDate());
|
68
68
|
|
69
|
-
while(cur <= end) {
|
69
|
+
while (cur <= end) {
|
70
70
|
|
71
71
|
months.push((cur.getMonth() + 1) + "");
|
72
72
|
|
@@ -78,7 +78,21 @@
|
|
78
78
|
|
79
79
|
}
|
80
80
|
|
81
|
-
return [months.map((e,i,a)=> (i === 0 || e !== a[i-1]) ? e : ""), dates, days];
|
81
|
+
return [months.map((e, i, a) => (i === 0 || e !== a[i - 1]) ? e : ""), dates, days];
|
82
|
+
|
83
|
+
};
|
84
|
+
|
85
|
+
const getRGBforEvent = (t) => {
|
86
|
+
|
87
|
+
const define = {
|
88
|
+
|
89
|
+
"mission":[255,255,0],
|
90
|
+
|
91
|
+
"stage":[255,0,255]
|
92
|
+
|
93
|
+
}
|
94
|
+
|
95
|
+
return define[t] ? define[t] : [255,255,255]
|
82
96
|
|
83
97
|
}
|
84
98
|
|
@@ -94,11 +108,11 @@
|
|
94
108
|
|
95
109
|
// prepare
|
96
110
|
|
97
|
-
if(scheduleEnd <= scheduleStart) return;
|
111
|
+
if (scheduleEnd <= scheduleStart) return;
|
98
112
|
|
99
|
-
const events = SpreadsheetApp.getActive().getSheetByName(eventsSheetName).getDataRange().getValues().slice(1).filter(([ev,tp,st,en]) => ev !== "" && tp !== "" && st <= en && en >= scheduleStart);
|
113
|
+
const events = SpreadsheetApp.getActive().getSheetByName(eventsSheetName).getDataRange().getValues().slice(1).filter(([ev, tp, st, en]) => ev !== "" && tp !== "" && st <= en && en >= scheduleStart);
|
100
114
|
|
101
|
-
if(events.length < 1) return;
|
115
|
+
if (events.length < 1) return;
|
102
116
|
|
103
117
|
// カレンダーを作る
|
104
118
|
|
@@ -114,18 +128,18 @@
|
|
114
128
|
|
115
129
|
const calendar = generateCalendar(scheduleStart, scheduleEnd);
|
116
130
|
|
117
|
-
target.getRange(1,3,3,calendar[0].length).setNumberFormat("dd").setValues(calendar);
|
131
|
+
target.getRange(1, 3, 3, calendar[0].length).setNumberFormat("dd").setValues(calendar);
|
118
132
|
|
119
133
|
// イベント埋める
|
120
134
|
|
121
|
-
target.getRange(4,1,events.length,2).setValues(events.map(([e,t])=>[e,t]));
|
135
|
+
target.getRange(4, 1, events.length, 2).setValues(events.map(([e, t]) => [e, t]));
|
122
136
|
|
123
|
-
target.autoResizeColumns(1,calendar[0].length+2); // 記入項目は埋まったので、ここで列幅を調整
|
137
|
+
target.autoResizeColumns(1, calendar[0].length + 2); // 記入項目は埋まったので、ここで列幅を調整
|
124
138
|
|
125
139
|
const diffFromStart = genDiffDays(scheduleStart);
|
126
140
|
|
127
|
-
|
141
|
+
events.map(([, t, s, e], i) => getRGBforEvent(t).concat([i + 4, 3 + diffFromStart(Math.max(scheduleStart, s)), 1, diffFromStart(Math.min(scheduleEnd, e)) - diffFromStart(Math.max(scheduleStart, s)) + 1])).forEach(e => target.getRange(...e.slice(3)).setBackgroundRGB(...e.slice(0,3)));
|
128
142
|
|
129
|
-
}
|
143
|
+
};
|
130
144
|
|
131
145
|
```
|
2
a
test
CHANGED
@@ -28,13 +28,15 @@
|
|
28
28
|
|
29
29
|
|
30
30
|
|
31
|
+
この名前のシートにこういうデータがあれば q253621_re を実行するだけで新規シートに色のぬられたカレンダーができます。
|
32
|
+
|
31
|
-
このデータでだいたい 9 秒。あとはデータ量次第です。
|
33
|
+
実行時間はこのデータでだいたい 9 秒。あとは、データ量次第です。
|
32
34
|
|
33
35
|
|
34
36
|
|
35
37
|
```javascript
|
36
38
|
|
37
|
-
const newSheet = name => SpreadsheetApp.getActive().insertSheet().setName(`${name}${Utilities.getUuid()}`); // 重複しないように uuid をつけているが、運用で対処するなら外していい
|
39
|
+
const newSheet = name => SpreadsheetApp.getActive().insertSheet().setName(`${name} : ${Utilities.getUuid()}`); // 重複しないように uuid をつけているが、運用で対処するなら外していい
|
38
40
|
|
39
41
|
const formatSet = sheet => {
|
40
42
|
|
1
あ
test
CHANGED
@@ -1,4 +1,4 @@
|
|
1
|
-
途中で投げ出してすみませんが、エラーの再現のためには提示のシートが必要となり、作るのが大変なのでイベント情報シートのみから新規に生成することにしました。
|
1
|
+
途中で投げ出してすみませんが、エラーの再現のためには提示のシートが必要となり、作るのが大変なのでイベント情報シートのみから新規に生成することにしました。そしたら色が塗れたのでデバッグする意味が私の中で消滅しました。
|
2
2
|
|
3
3
|
(下記のようなテーブル書式なら貼り付けできるのでデバッグ可能になります)
|
4
4
|
|
@@ -34,9 +34,9 @@
|
|
34
34
|
|
35
35
|
```javascript
|
36
36
|
|
37
|
-
const newSheet =
|
37
|
+
const newSheet = name => SpreadsheetApp.getActive().insertSheet().setName(`${name}${Utilities.getUuid()}`); // 重複しないように uuid をつけているが、運用で対処するなら外していい
|
38
38
|
|
39
|
-
const formatSet =
|
39
|
+
const formatSet = sheet => {
|
40
40
|
|
41
41
|
sheet.setFrozenRows(3);
|
42
42
|
|
@@ -48,13 +48,11 @@
|
|
48
48
|
|
49
49
|
}
|
50
50
|
|
51
|
-
const dateToString =
|
51
|
+
const dateToString = date => Utilities.formatDate(date, "Asia/Tokyo", "MM/dd");
|
52
52
|
|
53
|
-
const dayToString =
|
53
|
+
const dayToString = num => ["日","月","火","水","木","金","土"][num];
|
54
54
|
|
55
|
-
const genDiffDays =
|
55
|
+
const genDiffDays = d1 => d2 => (d2 - d1) / 86400000;
|
56
|
-
|
57
|
-
|
58
56
|
|
59
57
|
const generateCalendar = (start, end) => {
|
60
58
|
|
@@ -90,7 +88,7 @@
|
|
90
88
|
|
91
89
|
const eventsSheetName = "EventInfoSheet";
|
92
90
|
|
93
|
-
const eventColor = "yellow";
|
91
|
+
const eventColor = "yellow"; // イベントの日程を埋めるための色 #eeeeee とかでも可
|
94
92
|
|
95
93
|
// prepare
|
96
94
|
|