web-dev-qa-db-ja.com

Google SpreadsheetSCRIPT編集されたセルが特定の範囲内にあるかどうかを確認します

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

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

これが私が時間を更新しなければならないものです。

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

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

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

9
General Chad

onEdit()関数のパラメーターとして Event が提供されており、編集内容に関する必要な情報が含まれています。その_(e)_が何であるか疑問に思っているなら、これがそれです。

onEdit()関数はすべての編集のために呼び出されるため、exit。渡されたイベントを使用することで、必要なサービスコールが少なくなるため、効率が向上します。 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"
} ​
_
20
Mogsdad

最も簡単な方法は、トリガー範囲に名前を付けることです

「トリガー」範囲に名前を付けることで、スクリプト内で範囲名を設定した後、スクリプトをいじる必要がなくなります。標準のGoogleスプレッドシートのインターフェース内で名前付き範囲の範囲を編集するだけで、範囲のサイズを拡大または縮小してもスクリプトは機能します。

ステップ1:範囲に名前を付ける

次の手順に従って、範囲内のセルのいずれかを編集する場合に、スクリプトのトリガーとして機能することに関心のあるセルの範囲に名前を付けます。 https://support.google.com/docs/answer/ 63175

範囲に「triggerRange」という名前を付けました。

手順2:範囲名を次のスクリプトに編集します。

function onEdit(e) {
      var myRange = SpreadsheetApp.getActiveSheet().getRange('triggerRange'); //<<< Change Your Named Ranged Name Here inside the getRange() function.
      //SpreadsheetApp.getUi().alert("myRange in A1 Notation is: " + myRange.getA1Notation()); //If you're having problems, uncomment this to make sure your named range is properly defined

      //Let's get the row & column indexes of the active cell
      var row = e.range.getRow();
      var col = e.range.getColumn();
      //SpreadsheetApp.getUi().alert('The Active Cell Row is ' + row + ' and the Column is ' + col); //uncomment this out to do testing

      //Check that your active cell is within your named range
      if (col >= myRange.getColumn() && col <= myRange.getLastColumn() && row >= myRange.getRow() && row <= myRange.getLastRow()) { //As defined by your Named Range
        SpreadsheetApp.getUi().alert('You Edited a Cell INSIDE the Range!');//Repalace Your Custom Code Here
      } else {
        SpreadsheetApp.getUi().alert('You Edited a Cell OUTSIDE the Range!');//Comment this out or insert code if you want to do something if the edited cells AREN'T inside your named range
        return;
      }
    }

PS:この基本的なスクリプトの基本的なフレームワークを提供してくれた他のポスターに感謝します。簡単にテストできるように、私は明らかにスクリプトにかなり多くのコメントを付けました。スクリプト内で作成したアラートを削除して見栄えを良くします...または、代わりにこれをコピーして貼り付けます。

function onEdit(e) {
  var myRange = SpreadsheetApp.getActiveSheet().getRange('triggerRange'); //<<< Change Your Named Ranged Name Here

  //Let's get the row & column indexes of the active cell
  var row = e.range.getRow();
  var col = e.range.getColumn();

  //Check that your active cell is within your named range
  if (col >= myRange.getColumn() && col <= myRange.getLastColumn() && row >= myRange.getRow() && row <= myRange.getLastRow()) { //As defined by your Named Range
    SpreadsheetApp.getUi().alert('You Edited a Cell INSIDE the Range!');//Repalace Your Custom Code Here
  }
}
7
Doomd

編集イベントが範囲内で発生したかどうかを簡単に確認できます。

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();
  var rangeColStart = range.getColumn();
  var rangeColEnd = rangeColStart + range.getWidth();
  if (editRow >= rangeRowStart && editRow <= rangeRowEnd 
      && editCol >= rangeColStart && editCol <= rangeColEnd)
  {
    // Do your magic here
  }
}

これは非常に冗長であることを認めますが、range ala range.contains(range)で簡単なメソッドをまだ見つけていません。

3
R4zorax

非常に少ないコード行が必要な場合は、次を使用できます。

function onEdit(){
  var cell = SpreadsheetApp.getActive().getActiveCell();
  var row = cell.getRow();
  var col = cell.getColumn();

  //if col > A && col < K ...
  if(col > 1 && col < 11 && row > 3 && row < 7){ //B4:J6
    //do something
  }

ただし、範囲の変更には、他の方法よりも少し時間がかかる場合があります。

2
s1c0j1

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;

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

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に感謝します。コードでこれを行うためのより簡単な方法があるとは信じられません。

2
Fritz Borrego