【问题标题】:Google Sheets onEdit(e) not capturing multiple editsGoogle 表格 onEdit(e) 未捕获多个编辑
【发布时间】:2019-10-28 14:13:56
【问题描述】:

Google 表格脚本编辑器中的 onEdit(e) 函数仅捕获对单个单元格的编辑。有没有办法让它捕获对多个单元格的编辑,例如,如果我将信息复制到 20 个单元格中,onEdit(e) 是否可以识别出 20 个单元格已被编辑而不仅仅是第一个单元格?

我到处寻找解决方案,但找不到任何人提出这个问题的例子。

function recordChange(c){
  var range = c.range;
  var column = 8; //Column for change log
  var row = range.getRow();
  var ss = SpreadsheetApp.getActiveSpreadsheet();
  var sheet = ss.getSheets()[0];

  var oldRow = range.getRow();
  var oldColumn = range.getColumn();

  sheet.getRange(oldRow, oldColumn).setBackground("orange");

  var changeCell = sheet.getRange(row, column)
  changeCell.setValue(new Date())

  var testCell = sheet.getRange(2, 2)
  var test = range.getValues();
  var newT = test.map(function(x){ return x});
  testCell.setValue(newT)

}

function recordAction(c){

  var range = c.range;
  var ss = SpreadsheetApp.getActiveSpreadsheet();
  var sheet = ss.getSheets()[0];
  var row = range.getRow();

  for (var i = 1; i<9; i++){
    sheet.getRange(row, i).setBackground(null);
  }

}

//Main Function
function onEdit(e){

  var range = e.range;
  if (range.getRow() != 1){
    if (range.getColumn() != 9 && range.getColumn() != 8) {recordChange(e);} else {recordAction(e);}
  }
}

编辑单元格应在单独的列中添加日期并以橙色突出显示单元格。这行得通,但是当我尝试编辑多个单元格时,它只会注册第一个单元格,因此作为在工作表上记录编辑的一种方式非常无用。

我假设有一种方法可以捕获数组中的多个编辑,但是我找不到任何明显的方法。

【问题讨论】:

  • on edit 功能有点慢。您是通过复制和粘贴多单元格更改还是从下拉菜单中说话?根据我的经验,每次编辑更改后都有 0.5 秒的时间缓冲。
  • 您好,请问您的问题解决了吗?请记住,如果您想将您的问题标记为已解决,您应该接受为您的问题提供解决方案的任何答案。如果情况并非如此,并且您的问题没有解决,请考虑解释为什么不是这样,以便该社区可以为您提供帮助。

标签: google-apps-script google-sheets


【解决方案1】:

基本上你的代码没有达到你的预期,因为你得到的范围是这样的:

sheet.getRange(oldRow, oldColumn).setBackground("orange");

只是一个单元格。

使用getRange 时,如果您希望范围分别包含多于一行或一列,则应包含参数numRowsnumColumns(请参阅更多信息here)。

你的函数recordChange 可能是这样的:

function recordChange(c) {
  var range = c.range;
  var ss = c.source; // This returns the spreadsheet from which the event was triggered
  var sheet = ss.getSheets()[0];
  var column = 8; //Column for change log
  var firstRow = range.getRow();
  var numRows = range.getNumRows();
  range.setBackground("orange");
  var dateCells = sheet.getRange(firstRow, column, numRows);
  dateCells.setValue(new Date())
}

请注意,您不需要获取新范围来更改已编辑单元格的背景颜色(您可以将此确切范围作为event object 的属性,如上面的代码所示)。

在第 8 列设置版本日期时,您需要使用getRange。如您所见,您需要提供范围将具有的行数(对应于已编辑范围的行数),您可以通过使用getNumRows 获得此行数。

关于函数recordAction,如果我理解正确的话,如果相应的行被编辑,你希望它删除第一列中的背景颜色。如果是这样的话,你的函数可能是这样的:

function recordAction(c) {
  var range = c.range;
  var ss = c.source;
  var sheet = ss.getSheets()[0];
  var row = range.getRow();
  var firstRow = range.getRow();
  var firstColumn = 1;
  var numRows = range.getNumRows();
  var numCols = 8;
  var editedRange = sheet.getRange(firstRow, firstColumn, numRows, numCols);
  editedRange.setBackground(null);
}

这里你还需要使用getRange,因为你要修改的范围与来自事件对象的范围不同。为此,您需要提供适当的参数。同样,您可以使用getNumRows 获取行数。如果您想移除前 8 列的背景,您已经知道两个列参数(1 和 8)。

希望对你有帮助。

【讨论】:

    【解决方案2】:

    您需要使用 e.range 对象中的一些方法。

    我在这里写了一个小示例代码:

    function onEdit(e) {
    
      var sheet = SpreadsheetApp.getActive().getActiveSheet();
      var changes = e.range.getValues();
      // +1 because of header row
      var lastRow = e.range.getLastRow() + 1;
      var date = new Date();
      var dateOfChange = date.toLocaleDateString() + " at " + date.toLocaleTimeString();
      var timeColumn = 4
    
      //sheet.getDataRange().getLastColumn()
      for (var i = 0; i < changes.length; i++) {
        var row = (lastRow - changes.length) + i;
        var timeCell = sheet.getRange(row, timeColumn);
    
        //this is quick and dirty but you will probably want to add more advanced data validation
        var validator = 0
        changes[i].forEach(function(x) {x.toString().length > 0 ? validator++ : null;})
    
        if (validator > 0 && e.range.getLastColumn() < timeColumn) {
          timeCell.setValue(dateOfChange);
        } else {
          timeCell.clear()
        }
      }
    }
    
    

    只需将时间列值更改为您自己的时间戳列整数,并确保该列位于您要粘贴数据的最后一列之后,否则您需要编写更复杂的代码。

    这是它在一个简单的电子表格上工作的图片:

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多