有没有办法在事件开始时或事件开始前不久获取 webhook?
Google Calendar API 允许创建事件提醒。当事件被激活或开始时是否可以获取 webhook?
例如,如果我为“2020 年 12 月 15 日 15:45 +0530”创建一个事件,我可以在那个时间或几分钟前获得 Webhook?
Google 可能正在使用此类网络钩子来发送提醒电子邮件或警报。我想用它在我的应用程序内发送通知。
目前 Google 问题跟踪器上有一个开放的功能请求,要求添加用于日历提醒的 API。
在这种情况下,您可以做的就是在此处给问题加注星标,并最终添加评论。
您可以使用 Apps 脚本创建一个脚本,该脚本将获取特定日期的所有事件并检查其开始时间。
function getEvents() {
let today = new Date();
let calendar = CalendarApp.getCalendarById(id);
let events = calendar.getEventsForDay(today);
let startTime = today.getHours();
for (let i = 0; i < events.length; i++) {
if (events[0].getStartTime() <= startTime) {
// send email, notification etc;
}
}
}
之后,您可以添加一个可安装的时间驱动触发器,例如每 15 分钟运行一次,以触发上述函数的执行。
function createTrigger() {
ScriptApp.newTrigger('getEvents')
.timeBased()
.everyMinutes(15)
.create();
}
请记住,您可以自定义脚本和触发器,以满足您的需求。
您可以使用 IPaaS 轻松做到这一点
使用 IFTTT 的 Google 日历和 Webhook 小程序, IF=> 任何事件开始(您可以设置多少分钟/小时) 然后=>发布Webhooks
您可以设置它;
虽然触发的时机不太准确。
或者,您可以使用 Integromat 的 Mailhook 来处理提醒通知。
您还拥有此类服务;
用于将电子邮件转换为网络钩子。
用于创建发布 webhook 的计划。
这里有一些死胡同,但根据分享的内容,我构建了一些对其他有相同需求的人有用的东西。
Hook 帖子适用于 Mattermost。我没有尝试过其他服务,但我希望大多数服务的工作原理完全相同。
function getEvents() {
// read user input from sheet
let remind_min_before = SpreadsheetApp.getActiveSheet().getRange("B1").getValue();
let webhookURL = SpreadsheetApp.getActiveSheet().getRange("B2").getValue();
let now = new Date();
let tomorrow = new Date(now);
tomorrow.setDate(tomorrow.getDate() + 1);
tomorrow.setHours(1);
Logger.log("Start Time : " +now)
// Cleanup existing triggers and re-add the trigger for tomorrow morning 1AM
deleteTriggers();
ScriptApp.newTrigger('getEvents').timeBased().at(tomorrow).create();
// Add a trigger for eeach modification of current users calendar
ScriptApp.newTrigger('getEvents').forUserCalendar(Calendar.CalendarList.get("primary").getId()).onEventUpdated().create();
Logger.log("Added trigger at "+tomorrow)
const calendarId = 'primary';
const events = Calendar.Events.list(calendarId, {
timeMin: now.toISOString(),
timeMax: tomorrow.toISOString(),
singleEvents: true,
orderBy: 'startTime'
});
for (const event of events.items) {
let start = new Date(event.start.dateTime)
let diff = start - now
diff = diff / (1000 * 60);
Logger.log("Event Starts at "+start+" in "+diff+" minutes");
if ( diff > 0 ) { // do not consider past meetings
if (diff < (remind_min_before + 1 )) {
// imminent event : send notification
Logger.log("Warning imminent meeting !")
sendHook(event, webhookURL);
}else{
//event to come : add a scheduled run
let nextRun = new Date(start - remind_min_before * 60000);
ScriptApp.newTrigger('getEvents').timeBased().at(nextRun).create();
Logger.log("Added trigger at "+nextRun)
}
}
}
}
// Deletes all triggers of this script
function deleteTriggers(){
var triggers = ScriptApp.getProjectTriggers();
for (var i = 0; i < triggers.length; i++) {
ScriptApp.deleteTrigger(triggers[i]);
}
}
function sendHook(event, webhookURL) {
let timeBeforeMeeting = Math.floor((new Date(event.start.dateTime) - new Date()) / (60 * 1000));
const payload = JSON.stringify({ text: "Reminder : **"+event.summary +"** starts in "+timeBeforeMeeting+" minutes ! https://meet.google.com/"+event.conferenceData.conferenceId });
const options = {
method: 'POST',
contentType: 'application/json',
payload: payload,
};
UrlFetchApp.fetch(webhookURL, options);
}
此外,
appscript.json
用于更精细的权限处理(可选):
{
"timeZone": "Europe/Paris",
"dependencies": {
"enabledAdvancedServices": [
{
"userSymbol": "Calendar",
"version": "v3",
"serviceId": "calendar"
}
]
},
"exceptionLogging": "STACKDRIVER",
"runtimeVersion": "V8",
"oauthScopes": [
"https://www.googleapis.com/auth/spreadsheets.currentonly",
"https://www.googleapis.com/auth/calendar.readonly",
"https://www.googleapis.com/auth/script.scriptapp",
"https://www.googleapis.com/auth/script.external_request"
]
}
注意事项: