首页 > 解决方案 > 如何在 Google 表格/应用程序脚本中仅针对一个特定列(按列名)进行定位和迭代?

问题描述

所以我有一个 OnEdit 函数,它检测数据何时被复制并粘贴到电子表格中,然后在找到颜色值的地方,单元格背景颜色变为该颜色。

但是,目前它正在遍历电子表格中的每个单元格,这在复制和粘贴数据时非常慢。我只希望它在我的电子表格的“CategoryColor”列中迭代并检测复制和粘贴的更改。

这是我到目前为止所拥有的,任何帮助将不胜感激!谢谢!

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 {
                // changes background colour of cell
                e.source.getActiveSheet().getRange(firstRow + i, firstColumn + j).setBackground(values[i][j]);
               
            } catch (e) {
              Logger.log(e);
            }
        }
    }
  
  // sets data validation
  setDataValidation(createColorList());
  getColumnData(activeSpreadsheet);
  getFullColumn(columnIndex, startIndex);
}

标签: javascriptgoogle-apps-scriptgoogle-sheetsgoogle-sheets-macros

解决方案


您只需要if在执行脚本的其余部分之前实现一个评估已编辑列的语句。

使用方法indexOf()查找正确列的示例:

function onEdit(e) {
 var sheet=e.source.getActiveSheet();
 var headers=sheet.getRange(1,1,1, sheet.getLastColumn()).getValues; //assuming the headers are in row 1, otherwise change it accordingly
var column=headers[0].indexOf("CategoryColor")+1; //finds the column with the header "CategoryColor" 
 if(e.range.getColumn()==column){
// YOUR SCRIPT
    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 {
                // changes background colour of cell
                e.source.getActiveSheet().getRange(firstRow + i, firstColumn + j).setBackground(values[i][j]);

            } catch (e) {
              Logger.log(e);
            }
        }
    }

  // sets data validation
  setDataValidation(createColorList());
  getColumnData(activeSpreadsheet);
  getFullColumn(columnIndex, startIndex);
  }
}

笔记:

  • e.range将是一个单元格,因此将只包含一个值。

  • var values = e.range.getValues(); 因此, 评估是否 e.source.getActiveSheet().getRange(firstRow + i, firstColumn + j).setBackground(values[i][j]); 有意义。

  • 如果您只想更改已编辑单元格的背景颜色,也许您可​​以使用 var value = e.range.getValue();e.range.setBackground(value);


推荐阅读