0

我有一个带有两个电子表格的 Google Workbook。在第一个电子表格中,人们将向 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;
             }

        }
}
4

2 回答 2

1

When you say that your code operates slowly. How long approximately?

The following code, perhaps something can help.

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();
}
于 2013-10-22T15:49:55.720 回答
0

您可以在电子表格中使用额外的“帮助”列(如果您需要为最终用户维护“清洁表”,则可以隐藏),而不是循环使用脚本比较值,该列通过公式创建有效/无效的指示符为您的身份证。

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

上面的公式在单元格 B1 中查找值(您的 id),然后尝试在工作表 2 的 A 列中找到该值,如果失败将返回“无效”,如果成功则返回“有效”。您可以使用 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");
}

这种方法应该更快,尽管我建议在一段时间后将公式转换为值(存档?)。

于 2014-01-10T04:18:25.047 回答