回答編集履歴

4

a

2020/04/27 13:37

投稿

papinianus
papinianus

スコア12705

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.length < 1) return;
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.length, 2).setValues(events.map(([e, t]) => [e, t]));
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

2020/04/27 13:37

投稿

papinianus
papinianus

スコア12705

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
- target.getRangeList(events.map(([_,__,s,e],i) => [i + 4, 3 + diffFromStart(Math.max(scheduleStart,s)), 1, diffFromStart(Math.min(scheduleEnd,e)) - diffFromStart(Math.max(scheduleStart,s)) + 1]).map(e=>target.getRange(...e).getA1Notation())).setBackground(eventColor);
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

2020/04/26 15:48

投稿

papinianus
papinianus

スコア12705

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

2020/04/18 16:29

投稿

papinianus
papinianus

スコア12705

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 = (name) => SpreadsheetApp.getActive().insertSheet().setName(`${name}${Utilities.getUuid()}`); // 重複しないように uuid をつけているが、運用で対処するなら外していい
37
+ const newSheet = name => SpreadsheetApp.getActive().insertSheet().setName(`${name}${Utilities.getUuid()}`); // 重複しないように uuid をつけているが、運用で対処するなら外していい
38
38
 
39
- const formatSet = (sheet) => {
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 = (date) => Utilities.formatDate(date, "Asia/Tokyo", "MM/dd");
51
+ const dateToString = date => Utilities.formatDate(date, "Asia/Tokyo", "MM/dd");
52
52
 
53
- const dayToString = (num) => ["日","月","火","水","木","金","土"][num];
53
+ const dayToString = num => ["日","月","火","水","木","金","土"][num];
54
54
 
55
- const genDiffDays = (d1) => (d2) => (d2 - d1) / 86400000;
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