我有一个包含两个电子表格的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;
}
}
}
答案 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");
}
这种方法应该快得多,虽然我建议在一段时间后将公式转换为值(归档?)。