teratail header banner
teratail header banner
質問するログイン新規登録

回答編集履歴

4

a

2020/04/27 13:37

投稿

papinianus
papinianus

スコア12705

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

2020/04/27 13:37

投稿

papinianus
papinianus

スコア12705

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
- 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);
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

2020/04/26 15:48

投稿

papinianus
papinianus

スコア12705

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

2020/04/18 16:29

投稿

papinianus
papinianus

スコア12705

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