javascript - 谷歌脚本在编辑或删除后检测空单元格

标签 javascript google-apps-script google-sheets triggers

我的代码有问题。看起来不错,但它不起作用,我真的不知道为什么。我尝试了一切。

我想将我的 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();
  }  

我的测试表屏幕: Sheet

最佳答案

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

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

    • e.value包含在e中。
    • e.oldValue 不包含在 e 中。
  2. 在用其他值覆盖具有值的单元格的情况下

    • e.valuee.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.
}

注意事项:

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

关于javascript - 谷歌脚本在编辑或删除后检测空单元格,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51548360/

相关文章:

google-sheets - 使用 Google Sheets 和 ImportXML 从网站获取数据

javascript - react-native - 使图像适合包含 View ,而不是整个屏幕尺寸

javascript - 随机显示配对元素

javascript - 启用具有自定义布局的数据表

javascript - Slack:如何使返回文本对任何人都可见?

javascript - 使用谷歌应用脚​​本创建按钮和输入字段

javascript - JQuery 中 slider 标题的问题

excel - 如何在 Google 电子表格单元格中调整绘图?

google-apps-script - Google Apps 脚本格式

javascript - 如何使用 YouTube API 将视频观看次数获取到 Google 电子表格中?