-
-
Notifications
You must be signed in to change notification settings - Fork 2
Expand file tree
/
Copy pathTask.ts
More file actions
109 lines (93 loc) · 2.31 KB
/
Task.ts
File metadata and controls
109 lines (93 loc) · 2.31 KB
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
interface Task {
isValid(): boolean
getTaskName(): string
getScheduledTimestamp(): number
execute(args): any
}
abstract class DefaultTask {
public readonly taskRaw: string
public readonly func: (args) => any
protected constructor(taskRaw: string, func: (args) => any) {
this.taskRaw = taskRaw;
this.func = func;
}
execute(args): any {
Context.debugMsg(`Running ${this.getTaskName()}`);
try {
this.func(args);
} catch (e) {
Context.debugMsg(`${this.getTaskName()} FAILED: ${e.message}`);
console.error(e);
}
}
isValid(): boolean {
return (typeof this.func == 'function')
}
abstract getTaskName(): string
}
function ClockTriggerBuilder(name, buildFunction) {
return {
create() {
try {
return execute({
context: null,
attempts: 30,
runnable(context) {
const triggerSetup = ScriptApp.newTrigger(name).timeBased();
buildFunction(triggerSetup);
return triggerSetup.create();
},
});
} catch (e) {
Context.debugMsg('Failed to create trigger "' + name + '. ' + e.message);
}
},
};
}
interface ExecParams {
context: any;
runnable: (any) => any;
interval?: number;
attempts?: number;
}
function execute({context, runnable, interval = 2000, attempts = 5}: ExecParams) {
let errorMessage = '';
do {
try {
return runnable(context);
} catch (e) {
errorMessage = e.message;
if (errorMessage.includes('INTERRUPT')) {
break;
}
}
if (attempts > 0) {
Utilities.sleep(interval)
}
} while (--attempts > 0);
Context.debugMsg('All attempts failed. Error message: ' + errorMessage);
throw Error(errorMessage);
}
function isWeekEnd(date) {
return isSaturday(date) || isSunday(date);
}
function isSaturday(date) {
const day = (date || new Date()).getDay();
return day === 6;
}
function isSunday(date) {
const day = (date || new Date()).getDay();
return day === 0;
}
function isLastWeekDayOfMonth(date) {
if (!isWeekEnd(date)) {
const todayDate = date.getDate();
date.setDate(date.getDate() + 1);
while (isWeekEnd(date)) {
date.setDate(date.getDate() + 1);
}
return +date.getDate() < +todayDate; // next working day in next month
} else {
return false;
}
}