复制输入数据并将其粘贴到电子表格中时,使用什么触发器来更新单元格?(Google表格/应用脚本)

twt333

所以我有一个OnEdit函数,当用户从列表中选择一种颜色时,单元格的背景颜色即成为该选定值。

这可以正常工作,但是当数据复制并粘贴到电子表格以及用户编辑单元格时,我试图获取立即更新单元格背景色的功能。当前,当您将数据复制并粘贴到表中时,我编写的用于更改单元格背景色的代码不会触发,因为没有任何内容被“编辑”。我试图使代码适用于OnEdit,以及何时将数据复制并粘贴到工作表中。任何想法将不胜感激!谢谢!

这是我到目前为止所拥有的..

// Validates the colours using the above map and changes the cell background to the input colour..
function onEdit(e) {
  try {
    var range = e.range;
    var sheet = range.getSheet();
    var tabColumnData = getColumnData(sheet);
    if(!tabColumnData.hasOwnProperty('Color')) return;
    var col = range.getColumn();
    
    if (col == tabColumnData['Color'] + 1) {
      var color = e.value;
      if(validateCellValue(color) || COLOR_TO_HEX_MAP.hasOwnProperty(color)) {
        range.setBackground(color);
      } else {
        range.clear();
        SpreadsheetApp.getUi().alert('Please select a color from the list or a hex color code.');
      }
    }
    
    if (col == tabColumnData['Name'] + 1) {
      setDataValidation(createColorList());
    }
  } catch(e) {
    Logger.log(e);
  }
}


// Sets the data validation when the spreadsheet is opened.
function onOpen(e){
   setDataValidation(createColorList());
}

雅克·古泽尔·苍鹭

阅读您的问题后,我假设以下内容:

  • 您要检测何时编辑一组单元格。
  • 检测到修改后,您想要更改每个单元格的颜色以使其内容匹配。

如果我的假设正确,则可以使用以下示例满足您的要求:

function onEdit(e) {
  var firstRow = e.range.getLastRow() - e.range.getHeight() + 1;
  var firstColumn = e.range.getLastColumn() - e.range.getWidth() + 1;
  var values = e.range.getValues();
  for (var i = 0; i < e.range.getHeight(); i++) {
    for (var j = 0; j < e.range.getWidth(); j++) {
      try {
        e.source.getActiveSheet().getRange(firstRow + i, firstColumn + j)
          .setBackground(values[i][j]);
      } catch (e) {
        // You might want some error handling or logging here
      }
    }
  }
}

行为

该代码将在每次编辑一个或一组单元格时运行。当检测到版本时,代码将迭代每个单元格并尝试将其背景色更改为单元格的内容。

观察

  • 此代码适用于电子表格的每个工作表。要使其仅适用于工作表,应使用getSheet方法s [as getSheetByName() ]。
  • 由于onEdit触发器的限制,如果修改是通过脚本进行的(与用户编辑相反),则此代码将无法运行。
  • 限制背景颜色,直到CSS颜色3定义的背景颜色为止您可以在此处查看完整列表

典故

请不要犹豫,将任何其他疑问寄给我,或要求我进一步澄清。

更新

先前的代码将仅在已编辑的单元格上迭代,而不会在所有工作表上迭代。此行为将在所有电子表格上发生。如果要在特定范围内减少效果(例如categorycolor列),则需要一个条件语句来检查修改后的单元格是否在所需范围内。

要解决这种情况的第一步是创建一个命名的范围作为描述在这里在此示例中,我使用了name ColourRange,但是您可以更改代码以设置自己的命名范围。将此作为可能的解决方案之一:

function onEdit(e) {
  // Colour range
  var colourRange = SpreadsheetApp.getActiveSheet().getRange('ColourRange');
  var firstColourRow = colourRange.getRow();
  var lastColourRow = colourRange.getLastRow();
  var firstColourColumn = colourRange.getColumn();
  var lastColourColumn = colourRange.getLastColumn();

  // Modified range
  var firstRow = e.range.getLastRow() - e.range.getHeight() + 1;
  var firstColumn = e.range.getLastColumn() - e.range.getWidth() + 1;
  var values = e.range.getValues();

  for (var i = 0; i < e.range.getHeight(); i++) {
    for (var j = 0; j < e.range.getWidth(); j++) {
      var modifiedCell = e.source.getActiveSheet().getRange(firstRow + i,
        firstColumn + j);
      if (modifiedCell.getRow() >= firstColourRow && modifiedCell
      .getLastRow() <= lastColourRow && modifiedCell.getColumn() >=
        firstColourColumn && modifiedCell.getLastColumn() <= lastColourColumn) {
        try {
          e.source.getActiveSheet().getRange(firstRow + i, firstColumn + j)
            .setBackground(values[i][j]);
        } catch (e) {
          // You might want some error handling or logging here
        }
      }
    }
  }
}

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章