如何在google工作表中使用数组公式时使用getLastRow。我可以忽略一列吗?

时间:2016-03-26 14:46:08

标签: javascript google-apps-script google-sheets

我在google工作表中使用以下公式。它工作得很好,除了我发现getLastRow不起作用,因为我在M-P列中使用数组公式。

我该如何解决这个问题?是否可以让getLastRow忽略这些列?

Link to test sheet.

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()),)");
  }
}

2 个答案:

答案 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()),)");
   }
}