如果快速输入值,Google电子表格脚本无效

时间:2017-11-01 17:28:36

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

我为Google电子表格编写了以下脚本:

function onEdit(e) 
{
  var doc = SpreadsheetApp.getActiveSpreadsheet();
  var sheet = doc.getActiveSheet();
  var cell = sheet.getActiveCell();
  var column = sheet.getActiveCell().getColumn();
  var row = sheet.getActiveCell().getRow();
  var dat = sheet.getActiveCell().getValue()+"";
  var curDate = Utilities.formatDate(new Date(), "GMT+5:30", "dd/MM/yyyy")
  var editor = doc.getViewers();
  var temp = e.oldValue;
  if(dat=="")
  {
    dat = "0.0"
  }
  if((column == 4 || column == 5) && temp != null)
  {
    cell.setComment("Value changed from ₹"+ (temp) + " to ₹" + dat + " on " + curDate);
  }

}

我在D或E列中更改值时使用此代码插入注释。我使用此脚本一个月,代码工作正常。但我最近注意到它有一个问题。

  1. 如果我在几个单元格中快速输入值,例如D2,D3,D4,D5,D6等,则不会对所有单元格执行代码,并且仅将注释添加到某些随机单元格。只有在输入记录之间保持1秒的最小间隔时,才会按预期执行。
  2. 如果我一次删除多个单元格中的值,则不会对任何单元格执行代码。
  3. 感谢您阅读代码。

2 个答案:

答案 0 :(得分:2)

关于第一个问题,我能够使用以下脚本重现问题:

function onEdit(e){
  var destination = e.range.offset(0,1);
  if(e.value){ // Do this when editing a range having only one cell
    destination.setValue(e.value);
  } else { // Do this when editing a range having multiple cells
    destination.setValues(e.range.getValues());
  }
}

应使用Issue Tracker向Google报告。

关于第二个问题,getActiveCell仅返回活动单元格,并且它看起来需要整个范围。值得注意的是,当正在编辑具有多个单元格的范围时,e.oldValue将返回null。

以下是您的脚本的替代版本,可同时将单个单元格编辑用作多个单元格编辑:

function onEdit(e){
  var column = e.range.getColumn();
  if(column == 4 || column == 5){
    if(e.range.getNumRows() == 1 && e.oldValue != undefined){
      e.range.setNote("Old value: " + ((e.oldValue)?e.oldValue:"0.0") + "| New value: " + ((e.value)?e.value:"0.0"));
    } 
    if(e.range.getNumRows() > 1){
      var values = e.range.getValues();
      for(var i = 1;i<=e.range.getNumRows();i++){
        e.range.getCell(i,1).setNote("Old value: Not available | New value: " +  ((values[i-1][0])?(values[i-1][0]):"0.0"));
      }
    }
  }
}

注意:电子表格服务的官方Google Apps脚本参考中不包含setComment。

相关问题

答案 1 :(得分:0)

我从GAS指南中了解到触发器可能对您有所帮助

使用以下方式为已编辑的范围添加注释:

function onEdit(e){
  // Set a comment on the edited cell to indicate when it was changed.
  var range = e.range;
  range.setNote('Last modified: ' + new Date());
}