我需要检测是否正在一定范围的数据内进行到电子表格的更改,如果是,设置当前更新时间。
问题是,我有编辑上的标题和文字,我不希望在一个特定的细胞更新时间到电子表格进行更新,但是当我在一个单元格范围内编辑的数据,我想更新电子表格时间改变。
这是我必须更新的时间。
function onEdit(e)
{
var ss = SpreadsheetApp.getActiveSpreadsheet().getActiveSheet();
ss.getRange("G10").setValue(new Date());
}
我只希望在G10,如果我编辑某些细胞(在范围“B4:J6”)设置日期
有一个事件作为参数传递给你提供onEdit()
函数,它包含了编辑的内容所需的信息。 如果你想知道这是什么(e)
是一回事,这是它。
由于一个onEdit()
函数被调用每一个编辑,你应该确定你是否应该退出投资尽可能少的处理成为可能。 通过使用在传递的事件,您将需要更少的服务电话,这样效率会更高。 该拉斯穆斯答案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"
}
最简单的方法是命名您的触发范围
通过命名你的“触发器”的范围,那么你不必乱用脚本一旦你设置的脚本中的区域名称。 通过简单的编辑标准的谷歌表界面中的命名范围的范围内,脚本仍将即使你扩大或减少范围的大小工作。
第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
}
}
你可以简单地检查是否该范围内发生的修改事件。
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
}
}
我承认这是很详细,但我还没有发现范围ALA range.contains一个简单的方法(范围)
只是快速修复可能出现的问题由拉斯穆斯以前的答案:
在线路:
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;
通过拉斯穆斯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
}
}
由于拉斯穆斯Fuglsnag提供这样做最简单的方法。 我不相信有一个更好更简单的方式通过代码来做到这一点。
如果你想要的代码非常少的线,你可以使用:
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
}
然而,改变的范围可以采取比其他方法长一点。