【问题标题】:Can't delete an event in my google calendar using scripts无法使用脚本删除我的谷歌日历中的事件
【发布时间】:2016-04-15 19:51:08
【问题描述】:

我制作了一个电子表格,可以在其中轻松管理我的谷歌日历中的活动。 在电子表格中,第 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

我做错了什么?

编辑2:

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

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 不太了解。希望有人能帮我解决这个问题。

【问题讨论】:

  • 您需要一个可安装的触发器,请参阅this answer
  • “onEdit()”触发器基本上是“只读”的。
  • 编辑后:手动运行函数时脚本是否正常工作?
  • 如果我改变:var rij = range.getRow();var col = range.getColumn();太 rij = 3 & col = 1 如果我手动运行脚本,它就可以工作
  • 为了帮助调试,您可以将电子邮件通知设置为“立即”,或者更好的是,通过脚本模拟事件以重现真实的使用情况。请参阅这篇文章(来自 Mogsdad)以获得出色的示例:stackoverflow.com/questions/16089041/…

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


【解决方案1】:

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

我宁愿为此使用 cmets,但它肯定太长且难以阅读,所以我使用“答案”格式。

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】:

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

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

    感谢大家的帮助。

    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());
            }
          } 
        }
    

    【讨论】:

      【解决方案3】:

      试试这个:

      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]);
            }
        }
      

      【讨论】:

        猜你喜欢
        • 2017-03-31
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-02-04
        • 1970-01-01
        相关资源
        最近更新 更多