コードにはやりたいことに挑戦しようとした痕跡がありませんので、具体的な直しが入れられません。
・週間に予定がない時は通知しない。
予定がありません、となったときの個数をかぞえる。7より少ないときのみ通知をする
・日を超える予定は次の日に入れない。
例 19日予定 22:00-8:00の場合 表示は19日のみ(現在は19日と20日に表示されてしまいます。)
開始時間が取得しようとした日であるか判定する。これは過去のコードにてお示ししています。
・22:00-翌日8:00 の場合 22:00-32:00 の表示にしたい。
開始時間と終了時間が同じ日でないとき、日数差✕24を足す。便利機能はないので自力で頑張るしかないです。
javascript
1// 219287 style
2const lineToken = "LINE コード";
3
4function q219287() {
5 const today = new Date();
6 const days = [0,1,2,3,4,5,6].map(function (d) { return (new Date()).setDate(today.getDate() + d);});
7 const events = days.reduce(function (a, c) {
8 const eves = getEvents(c);
9 return eves.length === 0 ? a : a.concat([c, eves]);
10 },[]);
11 if(events.length === 0) { return; }
12 const message = events.map(function (e) { return [toDate(e[0])].concat(e[1].map(eventAsText));}).join("\n");
13 sendToLine(message);
14}
15
16function getEvents(thedate) {
17 const calendars = {
18 "①@group.calendar.google.com" : "①",
19 "②@group.calendar.google.com" : "②",
20 "③@group.calendar.google.com" : "③",
21 "④@group.calendar.google.com" : "④",
22 "⑤@group.calendar.google.com" : "⑤",
23 "⑥@gmail.com" : "⑥",
24 };
25 return Object.keys(calendars).map(function (e) { return CalendarApp.getCalendarById(e);}).map(function (cal) {
26 return [calendars[e], getEventsStartsInTheDay(cal, thedate)];
27 }).filter(function (e) {
28 return e[1].length > 0;
29 });
30}
31
32function eventAsText(events) {
33 return events.map(function (e) {
34 return '◆ ' + e[0] + '\n' + e[1].map(eventToString).join('\n\n');
35 }).join('\n');
36}
37function sendToLine(text) {
38 const token = lineToken;
39 const options = {
40 "method": "post",
41 "payload": "message=" + text,
42 "headers": {"Authorization": "Bearer " + token}
43 };
44 UrlFetchApp.fetch("https://notify-api.line.me/api/notify", options);
45}
46
47function toTime(targetdate, basedate) {
48 const min = Utilities.formatDate(str, 'JST', "mm");
49 const hour = Utilities.formatDate(str, 'JST', "HH");
50 if(targetdate.getDate() === basedate.getDate()) {
51 return hour + ":" + min;
52 }
53 const target = new Date(targetdate.getFullYear(), targetdate.getMonth(), targetdate.getDate());
54 const base = new Date(basedate.getFullYear(), basedate.getMonth(), basedate.getDate());
55 const datediff = Math.floor(target - base / 86400000);
56 return ("0" + ((hour - 0) + 24 * datediff)).slice(-2) + ":" + min;
57}
58function toDate(date) {
59 return Utilities.formatDate(dt, 'JST', '★ MM/dd(' + ["日", "月", "火", "水", "木", "金", "土"][date.getDay()] + ')');
60}
61
62function getEventsStartsInTheDay(calendar, thedate) {
63 const dateNum = thedate.getDate();// 219287 のエラーからすると (new Date(thedate)).getDate(); か。
64 return calendar.getEventsForDay(thedate).filter(function (e) {
65 return e.getStartTime().getDate() === dateNum;
66 });
67}
68function eventToString(event) {
69 const start = event.getStartTime();
70 return toTime(start, start) + ' - ' + toTime(event.getEndTime(), start) + '\n ' + event.getTitle() + '\n\n';
71}
72// 219287
73// 219724 style
74function sendTodaySchedule() {
75 var accessToken = PropertiesService.getScriptProperties().getProperty('LINE_TOKEN');
76
77 const message = [0,1,2,3,4,5,6].map(function (d) { return getMessage(d);}).filter(function (e) { return e !== "";}).join("\n");
78 if (!_isNull(message)) {
79 const options =
80 {
81 'method': 'post'
82 , 'payload': 'message=' + message
83 , 'headers': {'Authorization': 'Bearer ' + accessToken}
84 , muteHttpExceptions: true
85 };
86 UrlFetchApp.fetch('https://notify-api.line.me/api/notify', options);
87 }
88}
89
90function getMessage(prm) {
91 const week = ['日', '月', '火', '水', '木', '金', '土'];
92
93 var arrCals = [];
94 arrCals.push(CalendarApp.getCalendarById('Googleカレンダー@gmail.com'));
95 arrCals.push(CalendarApp.getCalendarById('Googleカレンダー@group.calendar.google.com'));//①
96 arrCals.push(CalendarApp.getCalendarById('Googleカレンダー@group.calendar.google.com'));//②
97 arrCals.push(CalendarApp.getCalendarById('Googleカレンダー@group.calendar.google.com'));//③
98 arrCals.push(CalendarApp.getCalendarById('Googleカレンダー@group.calendar.google.com'));//④
99 arrCals.push(CalendarApp.getCalendarById('Googleカレンダー@group.calendar.google.com'));//⑤
100
101 var date = new Date();
102 var strHeader = '';
103 date = new Date(date.getYear(), date.getMonth(), date.getDate() + prm);
104 strHeader += Utilities.formatDate(date, 'JST', 'yyyy/M/d')
105 + '(' + week[date.getDay()] + ') の予定\n';
106
107 var strBody = getEvents(arrCals, date);
108 //if ( _isNull(strBody) ) strBody = '予定はありません。';
109 return _isNull(strBody) ? '' : strHeader + strBody;
110}
111
112function getEvents(prmarrCals, prmDate) {
113 var strEvents = '';
114 var strStart = '';
115 var strEnd = '';
116 var strTime = '';
117 var strLocation = '';
118 var strDescription = '';
119 if (!_isNull(prmarrCals)) {
120 for (var j = 0; j < prmarrCals.length; j++) {
121 var currentEvents = '';
122 var arrEvents = prmarrCals[j].getEventsForDay(new Date(prmDate));
123 for (var i = 0; i < arrEvents.length; i++) {
124// if (!_isNull(strEvents)) strEvents += '\n';
125 var starts = arrEvents[i].getStartTime();
126 if (starts.getDate() !== prmDate.getDate()) continue;
127 strStart = _HHmm(starts);
128 strEnd = toTime(arrEvents[i].getEndTime(), starts);
129 if (strStart === strEnd) {
130 strTime = '終日';
131 } else {
132 strTime = strStart + '~' + strEnd;
133 }
134 currentEvents += '・' + strTime + '【' + arrEvents[i].getTitle() + '】';
135 strLocation = arrEvents[i].getLocation();
136 strDescription = arrEvents[i].getDescription();
137 if (!_isNull(strLocation)) currentEvents += '\n 場所:' + strLocation;
138 if (!_isNull(strDescription)) currentEvents += '\n 説明:' + strDescription;
139 }
140 if (_isNull(currentEvents)) continue;
141 if (!_isNull(strEvents)) strEvents += '\n';
142 strEvents += prmarrCals[j].getName() + '\n' + currentEvents;
143 }
144 }
145 return strEvents;
146}
147
148function _HHmm(str) {
149 return Utilities.formatDate(str, 'JST', 'HH:mm');
150}
151
152function _isNull(prm) {
153 if (prm == '' || prm === null || prm === undefined) {
154 return true;
155 } else {
156 return false;
157 }
158}
159//219724
160//236158 style
161const token = "LINE_TOKEN";
162
163const calendarTitleMap = {
164 "①@group.calendar.google.com" : "①",
165 "②@group.calendar.google.com" : "②",
166 "③@group.calendar.google.com" : "③",
167 "④@group.calendar.google.com" : "④",
168 "⑤@group.calendar.google.com" : "⑤",
169 "⑥@gmail.com" : "⑥",
170
171};
172
173const weekday = ["日", "月", "火", "水", "木", "金", "土"];
174
175function notifyWeekly() {
176 var _counter = 0;
177 const calendars = CalendarApp.getAllCalendars();
178 var dt = new Date()
179 var message = "週間予定\n\n";
180
181 for ( var i = 3; i < 8; i++ ) {
182
183 dt.setDate(dt.getDate() + 2);
184 message += Utilities.formatDate(dt, 'JST', '★ MM/dd(' + weekday[dt.getDay()] + ')') + "\n";
185
186 var dayText = "";
187 for(j in calendars) {
188 var calendar = calendars[j];
189
190 var calendarName = calendarTitleMap[calendar.getId()]
191 if ( calendarName == undefined ) {
192 continue;
193 }
194
195 var events = calendar.getEventsForDay(dt);
196 if( events.length == 0 ) {
197 continue;
198 }
199
200 dayText += "< " + calendarName + " >\n";
201 for(j in events) {
202 var tmp = toDayText(events[j], dt);
203 dayText += tmp === "" ? "" : tmp + "\n";
204 }
205 //dayText += "\n"
206 }
207
208 if ( dayText == "") {
209 dayText += "予定はありません\n\n";
210 counter++;
211 }
212 message += dayText;
213 }
214 if(_counter === 5) { return; }
215 sendToLine(message);
216}
217
218function toDayText(event, date) {
219 const st = event.getStartTime();
220 if(st.getDate() !== date.getDate()) { return ""; }
221 return toTimeText(st) + ' - ' + toTime(event.getEndTime(), st) + " " + event.getTitle() + '\n';
222}
223
224function toTimeText(str){
225 return Utilities.formatDate(str, 'JST', 'HH:mm');
226}
227//236158
3 つにわけようかと思ってたんですが相互に依存する関数があるので 1 回答にしました。219724 のときにおもったんですがよくこれだけ以前の回答がまるでなかったかのような処理を再発明できますよね。感服します。手直ししてて 219724 のコードが動きそうだなーと思いました。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2020/01/19 18:36
2020/02/01 11:06
2020/02/12 03:07