我是 Google 应用脚本新手。目前,我正在尝试创建一个插入行检测器,并根据其上方的行的值更新该新行中的值。在线阅读文档和其他内容,我创建了以下代码。但问题是它不起作用。
如何创建通用行检测器或如何解决此问题?
代码:
function onChange(e){
var sheet = SpreadsheetApp.getActiveSheet();
sheet.getRange('A1').setBackground('green');
//e.range.setNote('Last modified: ' + new Date().toLocaleTimeString() + ' getActiveUser().getEmail(): ' + Session.getEffectiveUser() );
if (e.changeType == "INSERT_ROW") {
sheet.getRange('A1').setBackground('red');
// a row or many rows were inserted
if (e.source.getActiveSheet().getName() == "UIDAICheck") {
// Let's set the formula for calculating the End Date / Time of inserted lines
sheet.getRange('A1').setBackground('blue');
var iRow = e.source.getActiveSheet().getActiveRange().getRow();
var iRows = e.source.getActiveSheet().getActiveRange().getNumRows();
var aRange = SpreadsheetApp.getActiveSpreadsheet().getActiveRange();
aRange.setValue('555')
}
}
}
如果存在与代码无关的更改,例如安装可安装的触发器或其他内容,请分享我如何能够将这些点连接起来以及能够自动填充行插入上的单元格值?不可否认,我对这整个领域都是新手..
PS:我认为这段代码的任何部分都不起作用。这是我的执行记录:
[17-09-23 13:25:46:950 IST] SpreadsheetApp.getActiveRange() [0 seconds]
[17-09-23 13:25:46:950 IST] Range.getRow() [0 seconds]
[17-09-23 13:25:46:950 IST] Range.getLastRow() [0 seconds]
[17-09-23 13:25:46:950 IST] Range.getColumn() [0 seconds]
[17-09-23 13:25:46:950 IST] Range.getLastColumn() [0 seconds]
[17-09-23 13:25:47:049 IST] Session.getActiveUser() [0.098 seconds]
[17-09-23 13:25:47:050 IST] User.getEmail() [0 seconds]
[17-09-23 13:25:47:050 IST] SpreadsheetApp.getActiveSpreadsheet() [0 seconds]
[17-09-23 13:25:47:058 IST] Starting execution
[17-09-23 13:25:47:103 IST] Execution failed: Script function not found: onEdit [0 seconds total runtime]
当使用菜单 插入 > 行 > 在上方插入 和 插入 > 行 > 在下方插入 插入新行时,当前单元格属于新插入的行。考虑到这一点,使用 Google Sheets 电子表格的更改可安装触发器获取插入行的行号的一种方法是利用更改事件对象的源属性来获取活动电子表格,然后使用
getCurrentCell()
然后 getRow()
。下面是一个简单的处理函数。
function getRow(e) {
if(e.changeType === 'INSERT_ROW'){
const rowNumber = e.source.getCurrentCell().getRow();
SpreadsheetApp.getActiveSpreadsheet().toast('Current Cell: ' + rowNumber )
}
}
您可以使用行号作为
SpreadsheetApp.Sheet.getRange()
方法的变体之一的参数。另外,您可以使用偏移量来代替 SpreadsheetApp.Range.getRow()
,即读取插入行上方的行的值。
我还没有测试过,但请尝试一下。
function MyChange(e){
var sheet = SpreadsheetApp.getActiveSheet();
if(sheet.getRange('A1').getBackground()!='#ff0000')
{
sheet.getRange('A1').setBackground('#00ff00');
}
if (e.changeType == "INSERT_ROW")
{
sheet.getRange('A1').setBackground('#ff0000');
if (sheet.getName()=="UIDAICheck")
{
sheet.getRange('A1').setBackground('#0000ff');
sheet.getActiveRange().setValue('555');
}
}
}
安装 onChange 触发器: