18

スプレッドシートに加えられた変更が特定の範囲のデータ内で行われているかどうかを検出し、そうであれば、現在の更新時間を設定する必要があります。

問題は、ヘッダーとテキストを編集するスプレッドシートがあり、スプレッドシートで特定のセルの更新時間を更新したくないのですが、セル範囲のデータを編集するときに更新が必要です。時間が変更されました。

ここで、時間を更新する必要があります。

function onEdit(e) 
{
  var ss = SpreadsheetApp.getActiveSpreadsheet().getActiveSheet();

  ss.getRange("G10").setValue(new Date());
} ​

特定のセル (範囲 "B4:J6") を編集する場合にのみ、G10 の日付を設定したい

4

6 に答える 6

31

関数のパラメーターとして提供されるEventがあり、onEdit()編集内容に関する必要な情報が含まれています。一体何だろうと思っていたら(e)、これです。

編集のたびに関数onEdit()が呼び出されるため、 を終了するかどうかを判断する際の処理はできるだけ少なくする必要があります。渡されたイベントを使用することで、必要な Service 呼び出しが減るため、より効率的になります。Rasmus の回答が A1 表記を列番号と行番号に変換する方法は、柔軟にする必要がある場合に適していますが、編集範囲が固定されている場合は、単純に比較に定数値を使用して、必要な処理時間を短縮できます。

function onEdit(e) 
{
  var editRange = { // B4:J6
    top : 4,
    bottom : 6,
    left : 2,
    right : 10
  };

  // Exit if we're out of range
  var thisRow = e.range.getRow();
  if (thisRow < editRange.top || thisRow > editRange.bottom) return;

  var thisCol = e.range.getColumn();
  if (thisCol < editRange.left || thisCol > editRange.right) return;

  // We're in range; timestamp the edit
  var ss = e.range.getSheet();
  ss.getRange(thisRow,7)   // "G" is column 7
    .setValue(new Date()); // Set time of edit in "G"
} ​
于 2013-07-16T18:31:07.183 に答える
3

Rasmus による以前の回答に対する考えられる問題の簡単な修正:

行上:

var rangeRowEnd = rangeRowStart + range.getHeight();
var rangeColEnd = rangeColStart + range.getWidth();

加算しています(実際には、最初の行と列を減算していません。これにより、1行と1列全体で予想される範囲よりも大きな範囲になります。同じ行で1を減算するだけです:

var rangeRowEnd = rangeRowStart + range.getHeight()-1;
var rangeColEnd = rangeColStart + range.getWidth()-1;

Rasmus Fuglsnag によるコードと修正は次のようになります。

function onEdit(e)
{
  var sheet = SpreadsheetApp.getActiveSheet();
  var editRange = sheet.getActiveRange();
  var editRow = editRange.getRow();
  var editCol = editRange.getColumn();
  var range = sheet.getRange("B4:J6");
  var rangeRowStart = range.getRow();
  var rangeRowEnd = rangeRowStart + range.getHeight()-1;
  var rangeColStart = range.getColumn();
  var rangeColEnd = rangeColStart + range.getWidth()-1;
  if (editRow >= rangeRowStart && editRow <= rangeRowEnd 
      && editCol >= rangeColStart && editCol <= rangeColEnd)
  {
    // Do your magic here
  }
}

これを行う最も簡単な方法を提供してくれたRasmus Fuglsnagに感謝します。コードでこれを行うためのより簡単な方法があるとは信じられません。

于 2015-07-22T16:26:57.633 に答える