Google Apps脚本电子表格:如果单元格值未包含在其他列中,则将整行显示为红色

时间:2013-10-22 08:09:17

标签: google-apps-script google-sheets

我有一个包含两个电子表格的Google工作簿。在第一个电子表格中,人们将向B列添加各种ID,我想确保B列中的ID包含在第二个工作表的A列中包含的有效ID列表中。

如果第一个工作表的B列中的ID无效,请将整行着色为红色。

这是我当前的工作代码,但运行缓慢 - 我认为因为第二个电子表格(~5400)上有很多有效的ID。另外,如果删除了一行,我想取消该行的颜色。

有没有更好的方法:

function onEdit(){
  var ss = SpreadsheetApp.getActiveSpreadsheet();
  var s = ss.getActiveSheet();
  var r = s.getActiveCell();
  var activeRange = s.getActiveRange();

  var changeRange = s.getRange(activeRange.getRow(),1,1,s.getLastColumn());


    if (r.getColumn() == 2 && r.getValue() == "") {
      changeRange.setBackground("none");
     }

    if (r.getColumn() == 2 && findRow(r.getValue()) !=1) {
      changeRange.setBackground("red");
    }
  }


function findRow(item) {;// the actual search function
        var resultArray = []
        var ss = SpreadsheetApp.getActiveSpreadsheet();
        var sheet=ss.getSheets()[1];
        var values = sheet.getRange("A:A").getValues(); 
        for(cc =0; cc < values.length; ++cc) {
            if(values[cc].toString().match(item)){
                return 1;
             }

        }
}

2 个答案:

答案 0 :(得分:1)

当您说您的代码运行缓慢时。大概多久了?

以下代码,或许可以提供帮助。

function onEdit(e) {
  var ss = e.source,
      s = ss.getActiveSheet(),
      sName = s.getName(),
      range = e.range,
      sheet1 = 'Sheet1',
      sheet2 = 'Sheet2',
      value,
      changeRange;
  if (sName === sheet1 && range.getColumn() === 2) {
    value = e.value, changeRange = getChangeRange_(s, range);
    switch(true) {
      case !value:
      case findRow_(ss, value, sheet2):
        changeRange_(changeRange, 'none');
        break;
      default:
        changeRange_(changeRange, 'red');
    }
  }
}

function getChangeRange_(s, range) {
  return s.getRange(range.getRow(), 1, 1, s.getLastColumn() || range.getColumn());
}

function changeRange_(range, color) {
  range.setBackground(color);
}

function findRow_(ss, findValue, sheet2) {
  var arr = getList_(ss, sheet2), len = arr.length;
  while (len--) if (arr[len][0] === findValue) return true;
  return false;
}

function getList_(ss, sheet2) {
  return ss.getSheetByName(sheet2).getRange('A:A').getValues();
}

答案 1 :(得分:0)

您可以在电子表格中使用额外的“帮助”列(如果您需要为最终用户维护“干净的工作表”,则可以隐藏该列,而不是通过比较值来循环),而是通过公式创建有效的/ ID的无效代号。

=IF(ISERROR(VLOOKUP(B1,Sheet2!A:A,1,FALSE)),"invalid","valid")

上面的公式查找单元格B1(您的id)中的值,然后尝试在工作表2的A列中找到该值,如果失败则返回'invalid',如果成功则返回'valid' 。您可以使用onEdit为任何新行插入公式(或检查它是否已经插入)。

使用此方法,您可以创建有效/无效值的数组(一次调用),并使用数组中的索引为每一行设置相关的背景颜色。

var validArray = sheet.getRange(yourFormulaRange);

for(var i = 0; var i < validArray; i++){
   if(validArray[i] = "invalid"){
     sheet.getRange(i, sheet.getLastColumn(), 1).setBackground("red");
   }else{
     sheet.getRange(i, sheet.getLastColumn(), 1).setBackground("white");
}

这种方法应该快得多,虽然我建议在一段时间后将公式转换为值(归档?)。