无法使用脚本删除我的Google日历中的事件

时间:2016-04-15 19:51:08

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

我制作了一个电子表格,可以在Google日历中轻松管理我的活动。 在电子表格中,第1行包含日期,第2行具有约会的细节,第3行保存由脚本创建的事件的eventId。 每周都会开始新的一行。

脚本的工作方式应该如下所示:

function CalenderUpdate() {

  var calId = "xxxxxxxxxxxxxxxx@group.calendar.google.com";
  var descr = "";
  var date
  var titel
  var sheet = SpreadsheetApp.getActiveSheet();
  var Afspraak = sheet.getRange(2,1,3,5).getValues();
  var cal = CalendarApp.getCalendarById(calId);

  for (j=2;j<9;j=j+3){
    Afspraak = sheet.getRange(j,1,3,5).getValues();

    for (i=0; i<5; i++){
      descr ="";
      date = Afspraak[0][i];
      titel = Afspraak[1][i];

      if (titel == "A"){ descr = "Late 14:00 - 21:00";}
      if (titel == "M"){ descr = "Early 6:00 - 14:00";}
      if (Afspraak[1][i] != ""){
        var event = cal.createAllDayEvent(titel,date,{description:descr});
        sheet.getRange(j+2,i+1).setValue(event.getId());
      }
    }
  }
}

现在我想要一个新功能。如果我在计划中编辑某些内容,我希望它在我的日历中更新。所以我添加了一个函数onEdit,它会删除当天创建的事件,并在必要时创建一个新事件。 我开始使用此代码删除事件,如果编辑了某些内容。但它并没有删除约会,我无法弄清楚原因。

function onEdit(e){
  var ss = SpreadsheetApp.getActiveSheet();
  var range = e.range;
  var rij = range.getRow();
  var col = range.getColumn();
  var afspraakId = ss.getRange(rij+1,col).getValue();

  if (rij % 3 == 0) { ss.getRange(1,1).setValue(afspraakId); }

  var calId = "xxxxxxxxxxxxxxx@group.calendar.google.com";
  var cal = CalendarApp.getCalendarById(calId);
  var event = cal.getEventSeriesById(id);
  event.deleteEventSeries();

}

希望有人可以帮助我?

编辑:

我将onEdit(e)更改为onEditInstallable(e),但脚本永远不会被触发。
Even if I add a trigger by the menu

我做错了什么?

EDIT2:

我已经对我的脚本进行了一些编辑。这是最终结果:

function test_onEdit() {
  onEditInstallable({
    user : Session.getActiveUser().getEmail(),
    source : SpreadsheetApp.getActiveSpreadsheet(),
    range : SpreadsheetApp.getActiveSpreadsheet().getActiveCell(),
    value : SpreadsheetApp.getActiveSpreadsheet().getActiveCell().getValue(),
    authMode : "LIMITED"
  });
}

function onEditInstallable(e){ 
  var ss = SpreadsheetApp.getActiveSheet();
  var range = e.range;
  var rij = range.getRow();
  var col = range.getColumn();

  if (rij % 3 == 0 && col < 8) {

    var cal = CalendarApp.getCalendarById("xxxxxxxxxxxxxxxxxx@group.calendar.google.com");

    var event
    var geg = ["","",""];
    var descr ="";


    for (i = 0 ; i < 3 ; i++){ geg[i] = ss.getRange(rij-1+i,col).getValue();}

    if (geg[2] != ""){
      event = cal.getEventSeriesById(geg[2]);
      event.deleteEventSeries();
      ss.getRange(rij+1,col).setValue("");
    }

    if (geg[1] != ""){
      event = cal.createAllDayEvent(geg[1],geg[0],{description:descr});
      ss.getRange(rij+1,col).setValue(event.getId());
    }
  } 
}

如果我运行test_OnEdit,该脚本可以正常工作。但onEditInstallable不会自动触发?我是编程方面的业余爱好者,我对this page的了解不多。希望有人可以帮我解决这个问题。

3 个答案:

答案 0 :(得分:0)

您的第二次编辑是一种很好的方法,我建议在脚本中添加几个日志来检查条件值。

我宁愿使用这些评论,但它肯定会太长而且难以阅读,所以我使用'答案'格式。

function onEditInstallable(e){ 
  var ss = SpreadsheetApp.getActiveSheet();
  var range = e.range;
  var rij = range.getRow();
  var col = range.getColumn();
  Logger.log('rij = '+rij+'  col = '+col);
  if (rij % 3 == 0 && col < 8) {

    var cal = CalendarApp.getCalendarById("xxxxxxxxxxxxxxxxxx@group.calendar.google.com");

    var event
    var geg = ["","",""];
    var descr ="";


    for (i = 0 ; i < 3 ; i++){ geg[i] = ss.getRange(rij-1+i,col).getValue();}
    Logger.log('geg[2] = '+geg[2]);
    if (geg[2] != ""){
      event = cal.getEventSeriesById(geg[2]);
      event.deleteEventSeries();
      ss.getRange(rij+1,col).setValue("");
    }

    if (geg[1] != ""){
      event = cal.createAllDayEvent(geg[1],geg[0],{description:descr});
      ss.getRange(rij+1,col).setValue(event.getId());
    }
  } 
}

答案 1 :(得分:0)

我使用了最后一段代码并将test_onEdit脚本链接到电子表格中的按钮。在第一次测试它时,Google提供了一个弹出窗口,要求提供额外的授权。从那时起,一切都像魅力一样。

如果我在电子表格中更改了某些内容,现在我的电子表格会自动编辑我的日程。

感谢大家的帮助。

function test_onEdit() {
      onEditInstallable({
        user : Session.getActiveUser().getEmail(),
        source : SpreadsheetApp.getActiveSpreadsheet(),
        range : SpreadsheetApp.getActiveSpreadsheet().getActiveCell(),
        value : SpreadsheetApp.getActiveSpreadsheet().getActiveCell().getValue(),
        authMode : "LIMITED"
      });
    }
    function onEditInstallable(e){ 
      var ss = SpreadsheetApp.getActiveSheet();
      var range = e.range;
      var rij = range.getRow();
      var col = range.getColumn();
      Logger.log('rij = '+rij+'  col = '+col);
      if (rij % 3 == 0 && col < 8) {

        var cal = CalendarApp.getCalendarById("xxxxxxxxxxxxxxxxxx@group.calendar.google.com");

        var event
        var geg = ["","",""];
        var descr ="";


        for (i = 0 ; i < 3 ; i++){ geg[i] = ss.getRange(rij-1+i,col).getValue();}
        Logger.log('geg[2] = '+geg[2]);
        if (geg[2] != ""){
          event = cal.getEventSeriesById(geg[2]);
          event.deleteEventSeries();
          ss.getRange(rij+1,col).setValue("");
        }

        if (geg[1] != ""){
          event = cal.createAllDayEvent(geg[1],geg[0],{description:descr});
          ss.getRange(rij+1,col).setValue(event.getId());
        }
      } 
    }

答案 2 :(得分:0)

尝试一下:

function deleteEvent(event) {
  if (typeof event != 'undefined') {
    Logger.log("Deleting event %s", event.getTitle())
     event.deleteEvent()
  }
}

function deleteEvents(eventCal,startTime,endTime,title){
    //  var oldEvents = eventCal.getEvents(startTime, endTime, {search: title});  
      var oldEvents = eventCal.getEvents(startTime, endTime);
      Logger.log("oldEvents %s", oldEvents);
      for (var j = 0; j < oldEvents.length; j++){  
         Logger.log("oldEvents[j] %s", oldEvents[j]);
         deleteEvent(oldEvents[j]);
      }
  }