【问题标题】:Inviting guests to a "Quick Add" Google Calendar event邀请客人参加“快速添加”Google 日历活动
【发布时间】:2014-08-16 07:10:10
【问题描述】:

我正在尝试改进 Google 日历中“快速添加”功能的功能。快速添加是通常通过转到Google Calendar 并单击红色“创建”按钮旁边的向下箭头来访问的功能(参见图片:http://s2.postimg.org/95zxshivt/calendar_screenshot.png)。

我想要实现的功能是允许用户使用他们在快速添加框中键入的关键字邀请客人参加新创建的日历活动。例如,如果用户使用“快速添加”框通过输入文本 Eat pizza tomorrow at 3pm with michelle@gmail.com and john@gmail.com 添加事件,Google 日历会在第二天下午 3 点添加一个标题为 Eat pizza with michelle@gmail.com and john@gmail.com 的新事件,就像预期的那样。 我想更进一步,让 Google 还向新创建的活动发送两个日历邀请:一个给michelle@gmail.com,另一个给john@gmail.com

感谢您就此主题提出的建议。我试图了解最好的方法是什么:

  • 使用带有 Google Apps 脚本的 触发器 来捕捉用户添加日历事件的时间。触发器将访问事件的标题,选择标题中存在的任何电子邮件地址,然后将新创建的事件的邀请发送到这些电子邮件地址中的每一个。

  • 使用 Chrome 扩展 让用户通过单击 Chrome 浏览器中的扩展图标来输入他们通常会在“快速添加”框中键入的字符串。该扩展程序将从用户输入的内容中挑选电子邮件地址,在用户输入中使用createEventFromDescription(description) 来创建事件,然后将新创建的事件的邀请发送到这些电子邮件地址中的每一个。

请告诉我你的想法。非常感谢您的想法。

露西

【问题讨论】:

  • 我的日历界面中没有此功能...是否可以安装一些可选的东西?你能提供一个屏幕截图吗?还是我遗漏了一些明显的东西?
  • 谢谢。正如我所想,我没有它:dl.dropboxusercontent.com/u/211279/capture.png 它是默认配置还是你做了什么得到它?我很难过:-(
  • 我认为您无法使用该按钮,因为 Google 日历团队尚未针对您的语言实施快速添加。快速添加使用一些自然语言处理,以便根据您输入的文本决定在日历上放置什么。
  • 感谢你们的cmets,这个功能只有英文设置日历Ui才能访问确实是有道理的...
  • 查看编辑,我制作了一个完全符合您要求的脚本 ;-)

标签: google-apps-script google-calendar-api


【解决方案1】:

您可能知道,没有与从日历 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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-12-25
    • 1970-01-01
    • 2012-04-22
    • 1970-01-01
    • 1970-01-01
    • 2012-08-01
    相关资源
    最近更新 更多