回答編集履歴
4
a
answer
CHANGED
@@ -42,20 +42,20 @@
|
|
42
42
|
};
|
43
43
|
const getRGBforEvent = (t) => {
|
44
44
|
const define = {
|
45
|
-
"mission":[255,255,0],
|
45
|
+
"mission": [255, 255, 0],
|
46
|
-
"stage":[255,0,255]
|
46
|
+
"stage": [255, 0, 255]
|
47
47
|
}
|
48
|
-
return define[t] ? define[t] : [255,255,255]
|
48
|
+
return define[t] ? define[t] : [255, 255, 255]
|
49
49
|
}
|
50
50
|
const q253621_re = () => {
|
51
51
|
const scheduleStart = new Date(2020, 3, 1); // スケジュールの開始日
|
52
52
|
const scheduleEnd = new Date(2020, 5, 30); // スケジュールの終了日
|
53
53
|
const eventsSheetName = "EventInfoSheet";
|
54
|
-
const eventColor = "yellow"; // イベントの日程を埋めるための色 #eeeeee とかでも可
|
55
54
|
// prepare
|
56
55
|
if (scheduleEnd <= scheduleStart) return;
|
57
56
|
const events = SpreadsheetApp.getActive().getSheetByName(eventsSheetName).getDataRange().getValues().slice(1).filter(([ev, tp, st, en]) => ev !== "" && tp !== "" && st <= en && en >= scheduleStart);
|
57
|
+
const eventsCnt = events.length;
|
58
|
-
if (
|
58
|
+
if (eventsCnt < 1) return;
|
59
59
|
// カレンダーを作る
|
60
60
|
const target = newSheet(`${dateToString(scheduleStart)}-${dateToString(scheduleEnd)}`); // シートを作る
|
61
61
|
/* シートを作りたくないなら↑を消して、こう。
|
@@ -64,10 +64,11 @@
|
|
64
64
|
formatSet(target);
|
65
65
|
const calendar = generateCalendar(scheduleStart, scheduleEnd);
|
66
66
|
target.getRange(1, 3, 3, calendar[0].length).setNumberFormat("dd").setValues(calendar);
|
67
|
+
calendar[2].reduce((a,c,i)=>(c === "土" || c === "日")?a.concat(i):a,[]).forEach(e=>target.getRange(2,e+3,eventsCnt+2,1).setBackgroundColor("gray"));
|
67
68
|
// イベント埋める
|
68
|
-
target.getRange(4, 1,
|
69
|
+
target.getRange(4, 1, eventsCnt, 2).setValues(events.map(([e, t]) => [e, t]));
|
69
70
|
target.autoResizeColumns(1, calendar[0].length + 2); // 記入項目は埋まったので、ここで列幅を調整
|
70
71
|
const diffFromStart = genDiffDays(scheduleStart);
|
71
|
-
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)));
|
72
|
+
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)));
|
72
73
|
};
|
73
74
|
```
|
3
あ
answer
CHANGED
@@ -21,24 +21,31 @@
|
|
21
21
|
const formatSet = sheet => {
|
22
22
|
sheet.setFrozenRows(3);
|
23
23
|
sheet.setFrozenColumns(2);
|
24
|
-
sheet.getRange(1,1,2,2).merge().setHorizontalAlignment("center").setVerticalAlignment("middle").setBackground("black").setFontColor("white").setValue("イベントカレンダー");
|
24
|
+
sheet.getRange(1, 1, 2, 2).merge().setHorizontalAlignment("center").setVerticalAlignment("middle").setBackground("black").setFontColor("white").setValue("イベントカレンダー");
|
25
|
-
sheet.getRange(3,1,1,2).setHorizontalAlignment("center").setVerticalAlignment("middle").setBackground("green").setFontColor("white").setValues([["イベント名","タイプ"]]);
|
25
|
+
sheet.getRange(3, 1, 1, 2).setHorizontalAlignment("center").setVerticalAlignment("middle").setBackground("green").setFontColor("white").setValues([["イベント名", "タイプ"]]);
|
26
|
-
}
|
26
|
+
};
|
27
27
|
const dateToString = date => Utilities.formatDate(date, "Asia/Tokyo", "MM/dd");
|
28
|
-
const dayToString = num => ["日","月","火","水","木","金","土"][num];
|
28
|
+
const dayToString = num => ["日", "月", "火", "水", "木", "金", "土"][num];
|
29
29
|
const genDiffDays = d1 => d2 => (d2 - d1) / 86400000;
|
30
30
|
const generateCalendar = (start, end) => {
|
31
31
|
let months = [];
|
32
32
|
let dates = [];
|
33
33
|
let days = [];
|
34
34
|
let cur = new Date(start.getFullYear(), start.getMonth(), start.getDate());
|
35
|
-
while(cur <= end) {
|
35
|
+
while (cur <= end) {
|
36
36
|
months.push((cur.getMonth() + 1) + "");
|
37
37
|
dates.push(cur);
|
38
38
|
days.push(dayToString(cur.getDay()));
|
39
39
|
cur = new Date(cur.getFullYear(), cur.getMonth(), cur.getDate() + 1);
|
40
40
|
}
|
41
|
-
return [months.map((e,i,a)=> (i === 0 || e !== a[i-1]) ? e : ""), dates, days];
|
41
|
+
return [months.map((e, i, a) => (i === 0 || e !== a[i - 1]) ? e : ""), dates, days];
|
42
|
+
};
|
43
|
+
const getRGBforEvent = (t) => {
|
44
|
+
const define = {
|
45
|
+
"mission":[255,255,0],
|
46
|
+
"stage":[255,0,255]
|
47
|
+
}
|
48
|
+
return define[t] ? define[t] : [255,255,255]
|
42
49
|
}
|
43
50
|
const q253621_re = () => {
|
44
51
|
const scheduleStart = new Date(2020, 3, 1); // スケジュールの開始日
|
@@ -46,9 +53,9 @@
|
|
46
53
|
const eventsSheetName = "EventInfoSheet";
|
47
54
|
const eventColor = "yellow"; // イベントの日程を埋めるための色 #eeeeee とかでも可
|
48
55
|
// prepare
|
49
|
-
if(scheduleEnd <= scheduleStart) return;
|
50
|
-
const events = SpreadsheetApp.getActive().getSheetByName(eventsSheetName).getDataRange().getValues().slice(1).filter(([ev,tp,st,en]) => ev !== "" && tp !== "" && st <= en && en >= scheduleStart);
|
51
|
-
if(events.length < 1) return;
|
56
|
+
if (scheduleEnd <= scheduleStart) return;
|
57
|
+
const events = SpreadsheetApp.getActive().getSheetByName(eventsSheetName).getDataRange().getValues().slice(1).filter(([ev, tp, st, en]) => ev !== "" && tp !== "" && st <= en && en >= scheduleStart);
|
58
|
+
if (events.length < 1) return;
|
52
59
|
// カレンダーを作る
|
53
60
|
const target = newSheet(`${dateToString(scheduleStart)}-${dateToString(scheduleEnd)}`); // シートを作る
|
54
61
|
/* シートを作りたくないなら↑を消して、こう。
|
@@ -56,11 +63,11 @@
|
|
56
63
|
*/
|
57
64
|
formatSet(target);
|
58
65
|
const calendar = generateCalendar(scheduleStart, scheduleEnd);
|
59
|
-
target.getRange(1,3,3,calendar[0].length).setNumberFormat("dd").setValues(calendar);
|
66
|
+
target.getRange(1, 3, 3, calendar[0].length).setNumberFormat("dd").setValues(calendar);
|
60
67
|
// イベント埋める
|
61
|
-
target.getRange(4,1,events.length,2).setValues(events.map(([e,t])=>[e,t]));
|
68
|
+
target.getRange(4, 1, events.length, 2).setValues(events.map(([e, t]) => [e, t]));
|
62
|
-
target.autoResizeColumns(1,calendar[0].length+2); // 記入項目は埋まったので、ここで列幅を調整
|
69
|
+
target.autoResizeColumns(1, calendar[0].length + 2); // 記入項目は埋まったので、ここで列幅を調整
|
63
70
|
const diffFromStart = genDiffDays(scheduleStart);
|
64
|
-
|
65
|
-
}
|
71
|
+
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)));
|
72
|
+
};
|
66
73
|
```
|
2
a
answer
CHANGED
@@ -13,10 +13,11 @@
|
|
13
13
|
| | | 2020/4/9 | 2020/4/19 | 10 | |
|
14
14
|
| E | mission | 2020/4/10 | 2020/4/14 | 4 | |
|
15
15
|
|
16
|
+
この名前のシートにこういうデータがあれば q253621_re を実行するだけで新規シートに色のぬられたカレンダーができます。
|
16
|
-
このデータでだいたい 9 秒。あとはデータ量次第です。
|
17
|
+
実行時間はこのデータでだいたい 9 秒。あとは、データ量次第です。
|
17
18
|
|
18
19
|
```javascript
|
19
|
-
const newSheet = name => SpreadsheetApp.getActive().insertSheet().setName(`${name}${Utilities.getUuid()}`); // 重複しないように uuid をつけているが、運用で対処するなら外していい
|
20
|
+
const newSheet = name => SpreadsheetApp.getActive().insertSheet().setName(`${name} : ${Utilities.getUuid()}`); // 重複しないように uuid をつけているが、運用で対処するなら外していい
|
20
21
|
const formatSet = sheet => {
|
21
22
|
sheet.setFrozenRows(3);
|
22
23
|
sheet.setFrozenColumns(2);
|
1
あ
answer
CHANGED
@@ -1,4 +1,4 @@
|
|
1
|
-
途中で投げ出してすみませんが、エラーの再現のためには提示のシートが必要となり、作るのが大変なのでイベント情報シートのみから新規に生成することにしました。
|
1
|
+
途中で投げ出してすみませんが、エラーの再現のためには提示のシートが必要となり、作るのが大変なのでイベント情報シートのみから新規に生成することにしました。そしたら色が塗れたのでデバッグする意味が私の中で消滅しました。
|
2
2
|
(下記のようなテーブル書式なら貼り付けできるのでデバッグ可能になります)
|
3
3
|
|
4
4
|
- EventInfoSheet
|
@@ -16,17 +16,16 @@
|
|
16
16
|
このデータでだいたい 9 秒。あとはデータ量次第です。
|
17
17
|
|
18
18
|
```javascript
|
19
|
-
const newSheet =
|
19
|
+
const newSheet = name => SpreadsheetApp.getActive().insertSheet().setName(`${name}${Utilities.getUuid()}`); // 重複しないように uuid をつけているが、運用で対処するなら外していい
|
20
|
-
const formatSet =
|
20
|
+
const formatSet = sheet => {
|
21
21
|
sheet.setFrozenRows(3);
|
22
22
|
sheet.setFrozenColumns(2);
|
23
23
|
sheet.getRange(1,1,2,2).merge().setHorizontalAlignment("center").setVerticalAlignment("middle").setBackground("black").setFontColor("white").setValue("イベントカレンダー");
|
24
24
|
sheet.getRange(3,1,1,2).setHorizontalAlignment("center").setVerticalAlignment("middle").setBackground("green").setFontColor("white").setValues([["イベント名","タイプ"]]);
|
25
25
|
}
|
26
|
-
const dateToString =
|
26
|
+
const dateToString = date => Utilities.formatDate(date, "Asia/Tokyo", "MM/dd");
|
27
|
-
const dayToString =
|
27
|
+
const dayToString = num => ["日","月","火","水","木","金","土"][num];
|
28
|
-
const genDiffDays =
|
28
|
+
const genDiffDays = d1 => d2 => (d2 - d1) / 86400000;
|
29
|
-
|
30
29
|
const generateCalendar = (start, end) => {
|
31
30
|
let months = [];
|
32
31
|
let dates = [];
|
@@ -44,7 +43,7 @@
|
|
44
43
|
const scheduleStart = new Date(2020, 3, 1); // スケジュールの開始日
|
45
44
|
const scheduleEnd = new Date(2020, 5, 30); // スケジュールの終了日
|
46
45
|
const eventsSheetName = "EventInfoSheet";
|
47
|
-
const eventColor = "yellow";
|
46
|
+
const eventColor = "yellow"; // イベントの日程を埋めるための色 #eeeeee とかでも可
|
48
47
|
// prepare
|
49
48
|
if(scheduleEnd <= scheduleStart) return;
|
50
49
|
const events = SpreadsheetApp.getActive().getSheetByName(eventsSheetName).getDataRange().getValues().slice(1).filter(([ev,tp,st,en]) => ev !== "" && tp !== "" && st <= en && en >= scheduleStart);
|