列含复选框等隐藏内容时如何用Google Apps Script获取工作表最后一行
解决方案
首先将提供的getLastRowSpecial辅助函数添加到你的脚本中,和onEdit函数放在同一层级。该函数通过判断表格第一列是否为空来识别有效数据的最后一行,不会被后续列的复选框(未勾选时值为FALSE,不属于空值)干扰,解决原生getLastRow()判断不准的问题。
之后将你原有代码中所有调用targetSh.getLastRow()的位置,替换为通过自定义函数计算得到的有效最后一行即可。
整合后的完整代码
// 自定义获取有效数据最后一行的辅助函数 function getLastRowSpecial(range){ var rowNum = 0; var blank = false; for(var row = 0; row < range.length; row++){ if(range[row][0] === "" && !blank){ rowNum = row; blank = true; } else if (range[row][0] !== ""){ blank = false; }; }; return rowNum; }; function onEdit(event) { var ss = SpreadsheetApp.getActiveSpreadsheet(); var currentSh = event.source.getActiveSheet(); var currentCell = event.source.getActiveRange(); if (currentSh.getName() == 'invoice_approval' && currentCell.getColumn() == 5 && currentCell.getValue()== 'Approved') { var row = currentCell.getRow(); var numColumns = currentSh.getLastColumn(); var targetSh = ss.getSheetByName('open_invoices'); // 替换原有getLastRow()调用 var targetRangeValues = targetSh.getRange(1, 1, targetSh.getMaxRows(), 1).getValues(); var validLastRow = getLastRowSpecial(targetRangeValues); var target = targetSh.getRange(validLastRow + 1, 1); currentSh.getRange(row,1,1,numColumns).moveTo(target); currentSh.deleteRow(row); } // 当单元格值从“Approved”变更时,将行从open_invoices移回invoice_approval else if (currentSh.getName() == 'open_invoices' && currentCell.getColumn() == 5 && currentCell.getValue()!= 'Approved' ) { var row = currentCell.getRow(); var targetSh = ss.getSheetByName('invoice_approval'); // 替换原有getLastRow()调用 var targetRangeValues = targetSh.getRange(1, 1, targetSh.getMaxRows(), 1).getValues(); var validLastRow = getLastRowSpecial(targetRangeValues); var target = targetSh.getRange(validLastRow + 1, 1); currentSh.getRange(row,1,1,5).moveTo(target); currentSh.deleteRow(row); } }
注意事项
上述代码默认以表格第一列是否为空作为有效数据的判断标准,如果你的业务场景中需要以其他列作为判断依据,只需修改getLastRowSpecial函数中的range[row][0],索引0对应第一列,若要使用第二列则改为1,第三列改为2,以此类推即可。
内容的提问来源于stack exchange,提问作者Eaimy Khaing
相关产品推荐
相关产品推荐

