3

onEdit()関数内のセルの内容に基づいてセルの背景色を変更するにはどうすればよいですか?

これについてテストした多くのバージョンのコードがありました。ほとんど正しく動作するものもあれば、まったく動作しないものもあります。しかし、これを必要な方法で機能させるにはまだ必要です。

書き方が洗練されていないことをお許しください。しかし実際には、多くのセルの変更、多くの条件、および何に応じて変更されるさまざまな数のセルがあるため、コードをできるだけ単純にする必要があります。ワークシート上で変更されます。

よし、これで…

function onEdit(event)
{
 var ss = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("Sheet2");   
 var changedCell= event.source.getActiveRange().getA1Notation();

 if (changedCell == 'B3') {
 var c = ss.getRange("B3").getValue();
  if (c < 2); {
  ss.getRange("B3").setBackgroundColor('#ff0000');  
  ss.getRange("B12").setBackgroundColor('#ff0000'); 
  }
  if (c > 1); {
  ss.getRange("B3").setBackgroundColor('#000000');  
  ss.getRange("B12").setBackgroundColor('#000000'); 
  }
 }
}
4

2 に答える 2

4

Srik からのアドバイスに加えて、関数の効率を考慮する必要がありますonEdit()。一般的な考え方は、できるだけ早く、できるだけ安価に救済する必要があるかどうかを判断し、ベスト プラクティスに従って残りのコードを最適化することです(主にサービス呼び出しを最小限に抑えます)。

onEdit()「Sheet2」でのみ実行したいようですが、あなたが書いた方法では、任意のシートの変更をトリガーしますが、「Sheet2」の色をいじります。("Sheet2" の条件は色付けを決定するために使用されるものであるため、目に見える問題ではありませんが、スクリプトの実行時間を不必要に消費することになります。) このevent情報を使用して、どのシートが更新されたかを把握し、 「Sheet2」でない場合は終了し、onEdit()ドロップのコスト。

声明については Srik に同意しifます... あなたが何を望んでいたのかわかりません。単独での提案では解決しないと思いますがelse if、それは次のように扱わc > 1れるためc > 2です...それが必要な場合は、書いてみませんか? に色を付けず1 < c < 2、 に赤、c < 1に黒を使用したい場合がありc > 2ますか? その部分のロジックを整理する必要があります。

情報onEdit()を最大限に活用して、最適化されたものがどのように見えるかを次に示します。event

function onEdit(event)
{
  var ss = event.range.getSheet();
  if (ss.getName() !== "Sheet2") return; // Get out quickly
  var changedCell = event.source.getActiveRange();
  var changedCellA1 = changedCell.getA1Notation();
  if (changedCellA1 !== 'B3') return;

  var c = event.value;  // We know we edited cell B3, just get the value
  var background = 'white'; // Assume 1 <= c <= 2
  if (c > 2) {
    background = 'red';
  }
  else if (c < 1) {
    background = 'black'; 
  }
  changedCell.setBackground(background);
  ss.getRange("B12").setBackground(background);
}
于 2013-07-10T02:55:21.093 に答える