0

2 つのスプレッドシートを含む Google ワークブックがあります。最初のスプレッドシートでは、列 B にさまざまな ID が追加されます。2 番目のワークシートの列 A に含まれる有効な ID のリストに、列 B の ID が含まれていることを確認したいと思います。

最初のワークシートの B 列の ID が無効な場合は、行全体を赤くします。

これは私の現在の作業コードですが、動作が遅いです.2番目のスプレッドシート(​​〜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

0

スクリプトを使用して値を比較するのではなく、スプレッドシートに追加の「ヘルパー」列を使用できます (エンド ユーザーのために「クリーン シート」を維持する必要がある場合は非表示にすることができます)。式によって有効/無効な記号を作成します。あなたのIDのために。

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

上記の式は、セル B1 (あなたの ID) の値を探し、シート 2 の列 A でその値を見つけようとします。失敗すると「無効」が返され、成功すると「有効」が返されます。onEdit を使用して、新しい行に数式を挿入できます (または、数式が既に挿入されているかどうかを確認します)。

このメソッドを使用すると、有効/無効な値の配列を作成し (1 回の呼び出し)、配列内のインデックスを使用してすべての行に関連する背景色を設定できます。

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 に答える