为什么Google Apps Script归档全量行而非匹配指定条件的行?
问题原因
- 索引偏差:Google Apps Script的
getValues()方法返回的二维数组为0起始索引,你当前设置的columnNumberOfValuesToTestFor = 9实际对应表格的第10列,如果你的「Completed By」列是第9列,该参数值应为8,否则会取错列值,导致匹配规则失效。 - 匹配逻辑错误:原有
valuesToTestFor.indexOf(status) !== -1的判断存在漏洞,空字符串在任意字符串中的indexOf返回值恒为0,因此即使目标列单元格为空也会触发匹配,导致所有行都被归档。
修改方案
如果你仅需要匹配「Completed By」列为非空白的行,不需要多值匹配逻辑,可以直接调整匹配规则即可,修改后的完整代码如下:
function archive() { var arrayOfRowsToArchive,columnNumberOfValuesToTestFor,data,i,lastColumn,L,numberOfRowsToArchive,numRows, range,rowsToDelete,ss,sheet,sheetName,sheetToMoveTheRowTo,startRow,status,targetSheet,thisRowsData; //USER INPUT: startRow = 2; //数据起始行号,排除表头行 columnNumberOfValuesToTestFor = 8; //对应表格的第9列,如果你目标列序号不同,值为「列序号-1」即可 sheetName = "Form Responses 1"; //待归档数据所在的工作表名称 sheetToMoveTheRowTo = "Sheet7"; //归档目标工作表名称 //END OF USER INPUT ss = SpreadsheetApp.getActiveSpreadsheet(); sheet = ss.getSheetByName(sheetName); numRows = sheet.getLastRow(); lastColumn = sheet.getLastColumn(); arrayOfRowsToArchive = []; rowsToDelete = []; data = sheet.getRange(startRow, 1, numRows - startRow, lastColumn).getValues(); L = data.length; for (i=0; i<L; i++) { status = data[i][columnNumberOfValuesToTestFor]; // 仅当目标列非空(排除全空格内容)时触发归档 if (status && status.toString().trim() !== '') { thisRowsData = data[i]; arrayOfRowsToArchive.push(thisRowsData); rowsToDelete.push(i+startRow); } } if (arrayOfRowsToArchive) { numberOfRowsToArchive = arrayOfRowsToArchive.length; if (!numberOfRowsToArchive) { return; } } else { Logger.log('arrayOfRowsToArchive 存在异常'); } targetSheet = ss.getSheetByName(sheetToMoveTheRowTo); targetSheet.getRange(targetSheet.getLastRow()+1, 1, numberOfRowsToArchive, arrayOfRowsToArchive[0].length) .setValues(arrayOfRowsToArchive); // 从下往上删除行避免索引混乱 for (i=rowsToDelete.length;i>0;i--) { sheet.deleteRow(rowsToDelete[i-1]); } }
内容的提问来源于stack exchange,提问作者Keith Mims
相关产品推荐
相关产品推荐

