-
Notifications
You must be signed in to change notification settings - Fork 0
/
GoogleCalendar.gs
169 lines (145 loc) · 5.11 KB
/
GoogleCalendar.gs
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
// НЕ менять это значение
var VERSION = 5.0;
function getHandlerFunctionName() {
return "UpdateCalendar";
}
function createTimeTrigger() {
ScriptApp.newTrigger(getHandlerFunctionName())
.timeBased()
.everyHours(6)
.create();
}
function getLatestVersion() {
var res = UrlFetchApp.fetch('https://raw.githubusercontent.com/MinyazevR/spbu-timetable-gas-integration/main/versions.json');
var dct = JSON.parse(res);
return dct["versions"][0];
}
function handler(requests) {
// if limit > 2 then rateLimitExceeded
var limit = 2;
var numberForDelete = Math.ceil(requests.length / limit);
var delay = 200
for (let k = 0; k < numberForDelete + 1; k++) {
var bound = Math.min(requests.length, (k + 1) * limit);
var slice = requests.slice(k * limit, bound);
try {
var res = UrlFetchApp.fetchAll(slice);
}
catch(e) {
if (delay <= 1000 * 8) {
Utilities.sleep(delay);
delay *= 2
k -= 1
}
else {
var res = UrlFetchApp.fetchAll(slice);
}
}
}
}
function getCurrentVersion() {
return VERSION;
}
function UpdateCalendar() {
var now = new Date();
// Получаем дату 30+ дней
var rightDate = new Date(now);
rightDate.setDate(rightDate.getDate() + 30);
rightDateStr = rightDate.toISOString().slice(0, 10);
// Получаем дату -1 день
var leftDate = new Date(now);
leftDate.setDate(leftDate.getDate() - 1);
leftDate.setUTCHours(0,0,0,0);
leftDateStr = leftDate.toISOString().slice(0, 10);
try {
var res = UrlFetchApp.fetch(`https://timetable.spbu.ru/api/v1/${USERTYPE}/${timetableId}/events/${leftDateStr}/${rightDateStr}`);
var dct = JSON.parse(res);
}
catch (e) {
Logger.log("Ошибка с Timetable, расписание остается прежним " + e);
return;
}
// Получаем календарь
var calendar = CalendarApp.getCalendarById(calendarIdentificator);
var postRequests = [];
var events_days = (USERTYPE == 'educators') ? dct['EducatorEventsDays'] : dct['Days'];
events_days.forEach(event => {
var day_study_events = event['DayStudyEvents'];
day_study_events.forEach(day_event => {
var start = day_event['Start'];
var startDate = new Date(start);
var end = day_event['End'];
var endDate = new Date(end);
var subject = day_event['Subject'];
var location = day_event['LocationsDisplayText'];
var groups_or_educator_names = (USERTYPE == 'educators') ? day_event['ContingentUnitName'] : day_event['EducatorsDisplayText'];
var is_cancelled = day_event['IsCancelled'];
var is_assigned = day_study_events['IsAssigned'];
var time_was_changed = day_study_events['TimeWasChanged'];
if (groups_or_educator_names == "Нет"){
is_cancelled = true;
}
if (is_cancelled){
return;
}
var formData = {
"summary": subject,
"description": groups_or_educator_names,
"location": location,
"start": {
"dateTime": startDate,
},
"end": {
"dateTime": endDate,
}};
var paramsForPost = {
url: `https://www.googleapis.com/calendar/v3/calendars/${calendarIdentificator}/events`,
headers: {Authorization: "Bearer " + ScriptApp.getOAuthToken()},
muteHttpExceptions: true,
method:"POST",
payload: JSON.stringify(formData)};
postRequests.push(paramsForPost);
})
})
try {
// Получаем события за последний месяц
var requests = calendar.getEvents(leftDate, rightDate).map(event => (
{url: `https://www.googleapis.com/calendar/v3/calendars/${calendarIdentificator}/events/${event.getId().replace("@google.com", "")}`,
headers: {Authorization: "Bearer " + ScriptApp.getOAuthToken()},
method: "DELETE"}));
}
catch(e) {
Logger.log("Не удалось получить текущие события, расписание остается прежним " + e);
return;
}
try {
handler(postRequests);
}
catch(e) {
Logger.log("Не получилось добавить новые события " + e);
return;
}
Logger.log('Новые события успешно добавлены');
Logger.log(`Количество событий для удаления: ${requests.length}`);
try {
handler(requests);
}
catch(e) {
Logger.log("Не удалось удалить нужные события " + e);
return;
}
Logger.log('События успешно удалены');
try {
var lastVersionInfo = getLatestVersion();
var lastVersion = lastVersionInfo['versionNumber'];
var updateMessage = lastVersionInfo['description'];
var currentVersion = getCurrentVersion();
if (currentVersion != lastVersion) {
calendar.createAllDayEvent('Пожалуйста, обновите скрипт.', now, {description: updateMessage});
Logger.log("Пожалуйста, обновите скрипт");
}
}
catch(e) {
Logger.log("Не удалость получить информацию о версии скрипта " + e);
}
}