我在google工作表中使用以下公式。它工作得很好,除了我发现getLastRow不起作用,因为我在M-P列中使用数组公式。
我该如何解决这个问题?是否可以让getLastRow忽略这些列?
function onEdit(event) {
// assumes source data in sheet named Needed
// target sheet of move to named Acquired
// test column with yes/no is col 4 or D
var ss = SpreadsheetApp.getActiveSpreadsheet();
var s = event.source.getActiveSheet();
var r = event.source.getActiveRange();
if(s.getName() == "Open" && r.getColumn() == 9 && r.getValue() == "Yes") {
var row = r.getRow();
var numColumns = s.getLastColumn()-2;
var targetSheet = ss.getSheetByName("Closed");
var target = targetSheet.getRange(targetSheet.getLastRow()+1, 1);
s.getRange(row, 1, 1, numColumns).moveTo(target);
s.deleteRow(row);
s.insertRowAfter(29);
var cell = s.getRange("H30");
cell.setFormula("=IF(LEN(C30),MINUS(G30,TODAY()),)");
}
}
答案 0 :(得分:0)
从Link to test sheet开始,Closed!M1中的公式为
={"Audit - Resp. Days Left";ARRAYFORMULA(IF(LEN(F2:F),MINUS(F2:F,I2:I),))}
上面的公式返回一个与Closed Sheet高度相同的数组,这使得getLastRow返回与maxRows相同的值。
为了保持公式和脚本不变,另一种方法是删除Closed表中的空白行。
另一种方法是将M1中的Closed Sheet公式更改为P1,以仅返回所需的行。一种方法是使用FILTER函数代替ARRAYFORMULA和IF函数 ,即对于M1
={"Audit - Resp. Days Left";FILTER(MINUS(E2:E,H2:H),LEN(E2:E))}
要使其正常工作,请务必清除空白行的内容。
答案 1 :(得分:0)
或者,您可以创建一个帮助函数,该函数检查作为参数传入的列中的最后一行。
function getLastRowInColumn(sheetObj, range) {
return sheetObj.getRange(range)
.getValues().filter (String).length
}
您可以通过脚本调用此功能(请参阅第39行' var lr')
function onEdit(event) {
var s = event.source.getActiveSheet();
if(s.getName() == "Open" && event.range.columnStart == 9 && event.value == "Yes") {
var targetSheet = event.source.getSheetByName("Closed");
var lr = getLastRowInColumn(targetSheet, 'C:C')
var target = targetSheet.getRange(lr+1, 1);
s.getRange(event.range.rowStart, 1, 1, s.getLastColumn()-2).moveTo(target);
s.deleteRow(event.range.rowStart);
s.insertRowAfter(29);
var cell = s.getRange("H30");
cell.setFormula("=IF(LEN(C30),MINUS(G30,TODAY()),)");
}
}