【问题标题】:Google spreadsheet auto timestamp: I don't want timestamp when I delete cell content谷歌电子表格自动时间戳:我在删除单元格内容时不想要时间戳
【发布时间】:2019-03-17 20:55:50
【问题描述】:

当我尝试删除脚本检查的单元格的内容时,脚本会粘贴一个新的时间戳。我只需要在写入新值时使用脚本,而不是在删除值时使用。

function onEdit() {
  
  var COLUMNTOCHECK = 1;
  var DATETIMELOCATION = [0,1];
  var SHEETNAME = 'STOCKOUT' 
  var ss = SpreadsheetApp.getActiveSpreadsheet();
  var sheet = ss.getActiveSheet();
  
  if( sheet.getSheetName() == SHEETNAME ) { 
    var selectedCell = ss.getActiveCell();
    if( selectedCell.getColumn() == COLUMNTOCHECK) { 
      var balance = sheet.getRange("i1").getValue();
      var dateTimeCell = selectedCell.offset(DATETIMELOCATION[0],DATETIMELOCATION[1]);
      dateTimeCell.setValue([balance]);
      }
  }

这是一个例子:

当我更新 A 和 C 列并尝试删除 A、B、C、I 时,脚本将运行并在 B 列上粘贴一个新值 Google Spreadsheet Example

【问题讨论】:

    标签: google-apps-script google-sheets spreadsheet


    【解决方案1】:

    这个修改怎么样?当从单元格中删除一个值时,onEdit(e) 的事件对象e 具有e.value.oldValue。使用它,您的脚本可以编写如下。

    修改脚本:

    function onEdit(e) { // Modified
      if (!e.value.oldValue) { // Added
        var COLUMNTOCHECK = 1;
        var DATETIMELOCATION = [0,1];
        var SHEETNAME = 'STOCKOUT' 
        var ss = SpreadsheetApp.getActiveSpreadsheet();
        var sheet = ss.getActiveSheet();
    
        if( sheet.getSheetName() == SHEETNAME ) { 
          var selectedCell = ss.getActiveCell();
            if( selectedCell.getColumn() == COLUMNTOCHECK) { 
            var balance = sheet.getRange("i1").getValue();
            var dateTimeCell = selectedCell.offset(DATETIMELOCATION[0],DATETIMELOCATION[1]);
            dateTimeCell.setValue([balance]);
          }
        }
      }
    }
    

    参考:

    如果我误解了您的问题并且这不是您想要的结果,我深表歉意。

    编辑:

    我想到了编辑单元格的三种情况。

    1. 一个值被放入空单元格。

      • e.value 包含在事件对象中。
        • oldValue 不包含在 e.value 中。
      • e.oldValue 不包含在事件对象中。
    2. 单元格的现有值被编辑。

      • e.valuee.oldValue 包含在事件对象中。
        • oldValue 不包含在 e.value 中。
    3. 值从单元格中删除。

      • e.valuee.oldValue 包含在事件对象中。
        • oldValue 包含在 e.value 中。

    我认为模式3可以用于OP的情况。

    【讨论】:

    • 您的意思是写“e.value.oldValue”吗?也许“e.valuee.oldValue”是你的意图?
    • @tehhowch 我更新了我的答案。你能确认一下吗?在 OP 的情况下,OP 不想在删除值时运行脚本。我认为情况3适合OP的情况。所以我提议if (!e.value.oldValue) {}。如果我误解了您的评论,我深表歉意。
    • 我想我今天学到了一些东西,因为我不知道e.value 会有用于删除单元格内容的对象类型。似乎您缺少属性保护,因为某些编辑 e.value 未定义,因此无法访问属性 oldValue
    • @tehhowch 感谢您的回复。 e.value 包含在以上 3 种情况中。所以我只使用了!e.value.oldValue。如果有事件对象没有value属性的情况,e.value && !e.value.oldValue比较合适。
    【解决方案2】:

    试试这个:

    function onEdit(e) {  
      if( e.range.getSheet().getName()=='STOCKOUT' && e.range.columnStart==1) {
          e.range.offset(0,1).setValue((e.value)?e.range.getSheet().getRange("I1").getValue():'');
      }else{
        return;
      }
    }
    

    【讨论】:

      猜你喜欢
      • 2014-12-10
      • 2015-07-28
      • 2020-08-30
      • 1970-01-01
      • 2018-01-09
      • 2012-12-04
      • 2012-07-12
      • 2018-04-10
      相关资源
      最近更新 更多