スプレッドシートに加えられた変更が特定の範囲のデータ内で行われているかどうかを検出し、行われている場合は、現在の更新時間を設定する必要があります。
問題は、ヘッダーとテキストを編集するスプレッドシートがあり、特定のセルの更新時間をスプレッドシートで更新したくないのですが、セルの範囲のデータを編集すると、更新時間を変更したいのですが。
これが私が時間を更新しなければならないものです。
function onEdit(e)
{
var ss = SpreadsheetApp.getActiveSpreadsheet().getActiveSheet();
ss.getRange("G10").setValue(new Date());
}
特定のセル(「B4:J6」の範囲)を編集する場合にのみ、G10の日付を設定したい
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"
}
_
「トリガー」範囲に名前を付けることで、スクリプト内で範囲名を設定した後、スクリプトをいじる必要がなくなります。標準のGoogleスプレッドシートのインターフェース内で名前付き範囲の範囲を編集するだけで、範囲のサイズを拡大または縮小してもスクリプトは機能します。
次の手順に従って、範囲内のセルのいずれかを編集する場合に、スクリプトのトリガーとして機能することに関心のあるセルの範囲に名前を付けます。 https://support.google.com/docs/answer/ 63175
範囲に「triggerRange」という名前を付けました。
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
}
}
編集イベントが範囲内で発生したかどうかを簡単に確認できます。
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)で簡単なメソッドをまだ見つけていません。
非常に少ないコード行が必要な場合は、次を使用できます。
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
}
ただし、範囲の変更には、他の方法よりも少し時間がかかる場合があります。
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に感謝します。コードでこれを行うためのより簡単な方法があるとは信じられません。