首页 > 解决方案 > 谷歌脚本在编辑或删除后检测空单元格

问题描述

我的代码有问题。看起来很好,但它不起作用,我真的不知道为什么。我什么都试过了。

我想将我的 google excel 与我的 google 日历同步。一切正常,但现在我想在我只编辑空白单元格时在日历中制作事件:

if (e.oldValue == null) { // also tried if(e.oldValue == undefinded)
var date = new Date(dayRange);
cal.createAllDayEvent(
  e.value,
  date,
)

}

它工作正常。但是接下来我想在删除单元格时从日历中删除事件(所以它又是空白的):

else if(e.value==null){
  var events = cal.getEvents(date, {
  search: ss.getRange(row,2)
  });  
  for (i in events){
    events[i].deleteEvent();
}

在我“删除”日历中的单元格后,我得到下一个带有闪烁标题的事件,我不知道为什么会创建这个事件。似乎这个“else if”不起作用。我真的不知道为什么。我阅读了所有示例,代码似乎还可以。

这就是我创建触发器的方式:

function createEditTrigger() {
   var ss = SpreadsheetApp.getActive();
   ScriptApp.newTrigger('ToCalendar')
   .forSpreadsheet(ss)
   .onEdit()
   .create();
 }     

我将非常感谢所有的建议。

编辑

完整代码:

function ToCalendar(e) {  
    var ss = SpreadsheetApp.getActiveSheet();
    var cal = CalendarApp.getCalendarById("myID");

    var range = e.range;
    var column = range.getColumn();
    var row = range.getRow();

    var day = ss.getRange(1,column);
    var dayRange = day.getValues();

    if ((e.value != null) && (e.oldValue == null)) {
        var date = new Date(dayRange);
         cal.createAllDayEvent(
         ss.getRange(row,2).getValue(),
         date,
         {
             description: e.value,//ss.getRange(row, column).getValue(),
         }
        )
     }

    //If we edit cell:

     else if(e.oldValue!=undefined){
        var events= cal.getEventsForDay(date,{search: e.oldValue});
        var ev= events[0];
        Logger.log(ev);
        ev.deleteEvent();
        cal.createAllDayEvent(ss.getRange(row,2).getValue(),date, 
        {description: ss.getRange(row, column).getValue()})


   // If we delete cell   



    else if((e.value == null) && (e.oldValue != null)){
         var events = cal.getEvents(date, {
         search: ss.getRange(row,2)
       });  
         for (i in events){
            events[i].deleteEvent();
          }

  }

创建触发器:

function createEditTrigger() {
   var ss = SpreadsheetApp.getActive();
   ScriptApp.newTrigger('ToCalendar')
   .forSpreadsheet(ss)
   .onEdit()
   .create();
  }  

和我的测试表的屏幕: 床单

标签: javascriptgoogle-apps-script

解决方案


您想为编辑空单元格的情况和删除单元格值的情况运行每个函数。如果我的理解是正确的,这个解决方法怎么样?我认为可能有几种解决方法。因此,请将此视为其中之一。在此解决方法中,它假设您正在使用onEdit(e). 当单元格改变时,eofonEdit(e)改变如下。

  1. 在将值编辑为空单元格的情况下

    • e.value包含在e.
    • e.oldValue不包含在e.
  2. 在用其他值覆盖一个值的单元格的情况下

    • e.value和都e.oldValue包含在e.
  3. 在从具有值的单元格中删除值的情况下

    • 两者e.valuee.oldValue都不包含在e.

使用上述结果,为了在编辑空单元格和删除单元格值的情况下运行每个函数,您可以使用以下示例脚本。

示例脚本:

function onEdit(e) {
  if (("value" in e) && !("oldValue" in e)) {
    Logger.log("In the case for editing a value to empty cell")
  }
  if (!("value" in e) && !("oldValue" in e)) {
    Logger.log("In the case for deleting a value from a cell with a value")
  }
}

当然,您也可以使用以下脚本。

function onEdit(e) {
  if ((e.value != null) && (e.oldValue == null)) {
    Logger.log("In the case for editing a value to empty cell")
  }
  if ((e.value == null) && (e.oldValue == null)) {
    Logger.log("In the case for deleting a value from a cell with a value")
  }
}

笔记 :

  • 如果要运行需要授权的方法,请安装触发器到onEdit().

参考 :

如果我误解了你的问题,我很抱歉。

编辑 :

语法错误已删除并修改了您的脚本。在这个修改后的脚本中,

  • 编辑空单元格时,将if ((e.value != null) && (e.oldValue == null)) { script }运行脚本。
  • 当具有值的单元格被值覆盖时,将else if(e.oldValue!=undefined) { script }运行脚本。
  • 当删除带有值的单元格的值时,将else if((e.value == null) && (e.oldValue == null)) { script }运行脚本。

修改后的脚本:

function ToCalendar(e) {  
  var ss = SpreadsheetApp.getActiveSheet();
  var cal = CalendarApp.getCalendarById("myID");
  var range = e.range;
  var column = range.getColumn();
  var row = range.getRow();
  var day = ss.getRange(1,column);
  var dayRange = day.getValues();
  if ((e.value != null) && (e.oldValue == null)) { // When the empty cell is edited, this becomes true.
    var date = new Date(dayRange);
    cal.createAllDayEvent(ss.getRange(row,2).getValue(),date,{
      description: e.value,//ss.getRange(row, column).getValue(),
    })

  // In your situation, this might not be required.
  } else if(e.oldValue!=undefined) { // When the cell with a value is overwritten by a value, this becomes true.
    //If we edit cell:
    var events= cal.getEventsForDay(date,{search: e.oldValue});
    var ev= events[0];
    Logger.log(ev);
    ev.deleteEvent();
    cal.createAllDayEvent(ss.getRange(row,2).getValue(),date,{description: ss.getRange(row, column).getValue()})

  } else if((e.value == null) && (e.oldValue == null)) { // When the value of cell with a value is removed, this becomes true.
    // If we delete cell
    var events = cal.getEvents(date, {
      search: ss.getRange(row,2)
    });  
    for (i in events){
      events[i].deleteEvent();
    }
  }
}

添加:

已确认事件对象的规范已更改。确认了以下修改。@I'-'I提到了这一点。

从:

  • 在从具有值的单元格中删除值的情况下
    • 两者e.valuee.oldValue都不包含在e.

到:

  • 在从具有值的单元格中删除值的情况下
    • e.valuee.oldValue包含在e.
      • e.value是一个像{"oldValue":"deleted value"}.
      • e.oldValue是一个字符串,如"deleted value".

通过这种修改,当值从具有该值的单元格中删除时,可以通过以下脚本进行检查。

if (e.value.oldValue) {
    // value was removed from cell.
} else {
    // value is NOT removed from cell.
}

笔记 :

  • 在将一个值编辑为空单元格的情况下,以及用另一个值覆盖一个值的单元格的情况下,每个结果都不会改变。

推荐阅读