您可能知道,没有与从日历 Ui 创建事件相关联的触发源。
你确实有两种可能性:
- 使用专用的 Ui(Chrome 扩展程序或独立的 Web 应用程序)对事件进行编码,该 Ui 将负责发送邀请,但可能无法满足您描述为“扩展 quickAdd 功能的功能”的初始要求李>
- 找到一种方法来检测活动创建并自动从其内容中发送邀请。
最后一种可能性完全可以使用计时器触发器来监控您的日历并检测任何新事件(通过将存储在某处的列表与实际日历内容进行比较)。
我为不同的目的制作了这样一个应用程序,它运行良好,但您应该注意一些困难。
在 scriptProperties 中存储事件时(这可能是最好的选择),您的可用存储空间有限,因此您必须知道可以处理多少事件。
活动中的任何更改(例如添加详细信息或纠正拼写错误)都会重新触发邀请流程并再次发送邀请。虽然这可能可以避免,但它会相当复杂。
当脚本在事件结束后立即运行时,比较会检测到更改,因为缺少一个事件(来自脚本 pov),因此它可以发送邮件取消该事件(当然,如果您选择实现该功能但我想这是“必须的”)。处理这种情况可能有点棘手......(将事件结束时间与触发器触发脚本的实际时间进行比较,可能是毫秒;-)。
除了这些困难之外,大体思路如下:
- 创建一个计时器触发器,每隔一小时左右运行一次
- 将此日历中的每个事件存储在脚本属性中(或最终存储在电子表格中),从当前日期开始并在几天后结束(不要提前太远,因为为接下来发生的事件发送邀请没有意义年)
- 将列表与日历内容进行比较
- 抓取每个“新”事件并从描述中提取电子邮件地址(例如使用正则表达式或字符串操作)
- 发送邀请(这是最简单的部分)
此工作流程有效,但在比较和电子邮件检测中可能有点脆弱。
编辑
因为这是一个有趣的主题(恕我直言)并且我认为我可以有效地使用它(现在我在日历 UI 中切换到英语;-D)我编写了一个代码来实现它......
我将代码嵌入到电子表格中,以简化我拥有的许多日历中事件的处理和存储。
这个电子表格是viewable here,如果你复制它,你就可以运行代码。
我设置了一个计时器触发器,每小时运行一次autoCheckAllCal 函数,它似乎可以正常工作。
告诉我你的想法。
下面复制了完整的代码,它从日历中获取数据,检查活动是否有客人,如果没有,它检查任何有效电子邮件地址(一个或多个)的标题并自动发送邀请。
我使用正则表达式从标题字符串中提取电子邮件(这个正则表达式是从an answer on SO 借来的,因为我在这方面做得不够好!)
注意:为 myOnOpen 设置一个 onOpen 触发器(因为使用 SS 服务的全局 var 声明)
// update the ID below to your copy ID and run the Callist() function to get the calendars ID on first sheet.
//set up an onOpen trigger for the myOnOpen function
var ss = SpreadsheetApp.openById('1xDOaoSl3HbkS95cj8Jl-82rdiui7G0sFz96PIO6iVF4');// this spreadsheet
var calNamesSheet = ss.getSheetByName('calNames');
var calList = calNamesSheet.getDataRange().getValues();
function MyOnOpen() {
var menuEntries = [ {name: "Lauch autoTest", functionName: "autoCheckAllCals"},
{name: "delete created sheets", functionName: "delsheets"}
];
ss.addMenu("Tracking utilities",menuEntries);//
}
function autoCheckAllCals(){
var today = new Date(); // now
var startDate = new Date(today.setHours(0,0,0,0));// today @ 0 AM
var endDate = new Date(new Date(startDate).setDate(startDate.getDate()+7)); // adjust time frame to read here = 7 days
for(var nn=0;nn<calList.length;nn++){
var logArray = new Array();
logArray.push(['Calendar + Title','Description','Start','End','Location','Creators','Date Created','Duration','Guests']);
var calName = calList[nn][0];
var calId = calList[nn][1];
var Calendar = CalendarApp.getCalendarById(calId);
var events = Calendar.getEvents(startDate , endDate);
if (events[0]) {
for (var i = 0; i < events.length; i++) {
var row = new Array();
row.push(calName +' : '+events[i].getTitle());
row.push(events[i].getDescription());
row.push(Utilities.formatDate(events[i].getStartTime(), Session.getScriptTimeZone(), "MMM-dd-yy")+' @ ' +Utilities.formatDate(events[i].getStartTime(), Session.getScriptTimeZone(), "HH:mm"));
row.push(Utilities.formatDate(events[i].getEndTime(), Session.getScriptTimeZone(), "MMM-dd-yy")+' @ ' +Utilities.formatDate(events[i].getEndTime(), Session.getScriptTimeZone(), "HH:mm"));
row.push(events[i].getLocation());
row.push(events[i].getCreators().join());
row.push('on '+Utilities.formatDate(events[i].getLastUpdated(), Session.getScriptTimeZone(), "MMM-dd-yyyy"));
row.push(((events[i].getEndTime() - events[i].getStartTime()) / 3600000)+' hours');//duration
var inviteList = checkInvites(events[i]);
if (inviteList.length==0){ // if guests were found in checkInvites() then don't read it from event since checkInvites() added them to the cal but this event is not yet updated
var list = events[i].getGuestList();
for(n=0;n<list.length;++n){inviteList.push(list[n].getEmail())};
}else{
for(var n in inviteList){
events[i].addGuest(inviteList[n]);
}
}
row.push(inviteList.join(', '));
logArray.push(row);
}
}
// Logger.log(logArray);
if(logArray.length==0){continue};
try{
var sheetToWrite = ss.insertSheet(calName,ss.getNumSheets());// create sheet if doesn't exist
}catch(err){
var sheetToWrite = ss.getSheetByName(calName);// else open it
}
sheetToWrite.getRange(1,1,logArray.length,logArray[0].length).setValues(logArray).setHorizontalAlignment('left'); // enhance formating
sheetToWrite.getRange(1,1,1,logArray[0].length).setBackground('#EEA').setBorder(true,true,true,true,true,true).setHorizontalAlignment('left').setFontSize(12);
for(var w in logArray[0]){
sheetToWrite.setColumnWidth(Number(w)+1,180);
}
}
}
function checkInvites(event){
var email = []
var title = event.getTitle();
if(title.indexOf('@')==-1){return email};
email = title.match(/([\w-\.]+)@((?:[\w]+\.)+)([a-zA-Z]{2,4})/g);
Logger.log('email var = '+email);
return email;
}
function delsheets(){
var numbofsheet = ss.getNumSheets();// check how many sheets in the spreadsheet
for (var pa=numbofsheet-1;pa>0;pa--){
ss.setActiveSheet(ss.getSheets()[pa]);
if(ss.getSheets()[pa].getSheetName()!='calNames'){
ss.deleteActiveSheet(); // delete sheets begining with the last one
Utilities.sleep(400);
}
}
SpreadsheetApp.flush();
}
// This small function is to get the list of calendar names & Ids that you have access to, please edit the calNames sheet to keep only the ones you want to monitor (without empty rows).
function Callist(){
calNamesSheet.getDataRange().clearContent();
var list = new Array();
var store = new Array();
list = CalendarApp.getAllCalendars()
for (n=0;n<list.length;++n){
var name = list[n].getName() ;
var id = list[n].getId() ;
store.push( [name,id])
}
calNamesSheet.getRange(1,1,store.length,store[0].length).setValues(store);
}
// Serge insas - 08-2014