我制作了一个脚本,它google sheet
向我写入了特定范围的单元格的修改日期,现在我想让它检测我正在修改的单元格并检测它是否在特定范围内。
这是我的脚本:
function onEdit(HoraModificacion){
var DateCol = "K9";
var curDate = Utilities.formatDate(new Date(), "GMT+01:00", "hh:mm");
var sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName('Test2');
var range = sheet.getRange('C11:K109');
var rowIndex = range.getRowIndex();
var colIndex = range.getColumnIndex();
// May need to set up multiple ranges like this and check all ranges if
// checked fields are not in adjacent cells
var watchRange = {
top : 11, // start row
bottom : 109, // end row
left : 2, // start col
right : 12, // end col
};
// Exit if we're out of range
if (rowIndex < watchRange.top || rowIndex > watchRange.bottom) return;
if (colIndex < watchRange.left || colIndex > watchRange.right) return;
var currentValue = range.getValue();
currentValue = currentValue.replace(/^\s+|\s+$/g,""); //"trim" kludge
if (currentValue.length != 0){
// Set a column to show last edit date
SpreadsheetApp.getActiveSheet().getRange(DateCol).setValue(curDate);
};
}
问题是我不知道如何让它检测到我正在修改的单元格,并从中检测到它之前选择的范围,我曾想过做类似下面的事情,但它没有成功为了我。这样做的目的是拥有一系列受控范围,以知道它们何时被修改,每个范围都有自己的单元格来写入修改日期。
function onEdit(HoraModificacion){
var sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName('Test2');
//Get the cell you are modifying to make a conditional for multiple range detect
var activeCell = sheet.getActiveCell();
//var activeRange = sheet.getActiveRange();
var range1 = sheet.getRange('C11:K109');
if ( activeCell == range1){
var DateCol = "K9";
var curDate = Utilities.formatDate(new Date(), "GMT+01:00", "hh:mm");
var rowIndex = range.getRowIndex();
var colIndex = range.getColumnIndex();
// May need to set up multiple ranges like this and check all ranges if
// checked fields are not in adjacent cells
var watchRange = {
top : 11, // start row
bottom : 109, // end row
left : 2, // start col
right : 12, // end col
};
// Exit if we're out of range
if (rowIndex < watchRange.top || rowIndex > watchRange.bottom) return;
if (colIndex < watchRange.left || colIndex > watchRange.right) return;
var currentValue = range.getValue();
currentValue = currentValue.replace(/^\s+|\s+$/g,""); //"trim" kludge
if (currentValue.length != 0){
// Set a column to show last edit date
SpreadsheetApp.getActiveSheet().getRange(DateCol).setValue(curDate);
};
}else if{
//Check the other range
return;
};
}
根据鲁本告诉我的内容,我已经修改了我的脚本,现在我有了这个:
function onEdit(e){
var curDate = Utilities.formatDate(new Date(), "GMT+01:00", "hh:mm");
var sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName('Test2');
var colInicio = e.range.getColumn();
var filaInicio = e.range.getRow();
var ref = e.range.getA1Notation(); // Notación tipo A1 o A1:B2
var range = e.getRange();
var colIndex = colInicio.getColIndex();
var rowIndex = filaInicio.getRowIndex();
var watchRange1 = {
top : 11, // start row
bottom : 109, // end row
left : 3, // start col
right : 11, // end col
};
var watchRange2 = {
top : 11, // start row
bottom : 109, // end row
left : 13, // start col
right : 21, // end col
};
if(rowIndex >= watchRange1.top && rowIndex <= watchRange1.bottom &&
colIndex >= watchRange1.left && colIndex <= watchRange1.rigth &&
range.getValue() != 0){
var DateCol1 = "K9";
SpreadsheetApp.getActiveSheet().getRange(DateCol1).setValue(curDate);
}else if (rowIndex >= watchRange2.top && rowIndex <= watchRange2.bottom &&
colIndex >= watchRange2.left && colIndex <= watchRange2.rigth &&
range.getValue() != 0){
var DateCol2 = "U9";
SpreadsheetApp.getActiveSheet().getRange(DateCol2).setValue(curDate);
}else{
//if test
var DateCol1 = "K9";
SpreadsheetApp.getActiveSheet().getRange(DateCol1).setValue("Fallo");
}
}
尝试运行此脚本时出现此错误:无法读取未定义的属性“范围”。(第 4 行,文件“Day1”)
我仍然很坚持脚本
我检测到问题在if之前,但我无法解决。
注意:答案对应于问题的修订版 3。对于问题第5 版中引入的错误
看我的第二个答案。
简短的回答
要检测正在编辑的范围,请使用
扩展答案
首先要记住的是,您一次可以编辑多个单元格。
HoraModificacion
我发现调用函数参数onEdit
或为简单触发器函数保留的任何其他名称,甚至是由可安装触发器调用的函数是非常不寻常的。通常的做法是使用event
ore
。onEdit 函数的参数将被分配一个事件对象,其属性包括已编辑的范围。此属性的名称是
range
。您可以在https://developers.google.com/apps-script/guides/triggers/events#edit查看其余属性值得一提的是,“编辑”触发器的事件对象,除了文档中提到的属性外,还分别包含
columnStart
并rowStart
指示了编辑范围的第一个单元格的列和行从问题的修订版 5
该错误是由于您直接执行脚本,即没有传递事件对象,在本例中
e
为undefined
. How can I test a trigger function in Google Apps Script解释了如何测试简单的触发器。我可以用肉眼看到的另一个潜在错误发生在该行中
如果
e
它是事件对象,它就不是电子表格类型的对象,也不是工作表类型的对象,而不是您可以使用的这一行但是,我认为保存两个字符没有多大意义,但这已经是风格问题了。
要检测单元格,您可以使用官方帮助中提到的onEdit(e)调用事件本身
在此示例中,检查编辑的单元格是否对应或在第 2 到 6 列内
如果您将“getRow()”方法添加到第二个,如果您可以验证它是否在您需要评估的行范围内。
我希望它对你有用