Google Script实现工作表列含特定文本时触发执行自定义函数
原有代码缺陷
- 未定义循环变量
i,遍历取值逻辑无法执行 - 判断条件匹配值写为
250g,和需求要求的250P不一致 - 原
EXTRACT函数直接传入整列A区域到自定义公式,未做行级过滤,无法实现按A列值触发提取的逻辑 - 未做目标表旧数据清理,容易出现历史数据残留
核心需求实现代码
替换原有零散函数即可,逻辑为遍历DATA表所有有效行,仅当A列值匹配250P时提取对应B列数据写入Result表,代码内已预留拆分、去空格等后续处理的位置:
function extractMatchedData() { const ss = SpreadsheetApp.getActiveSpreadsheet(); const dataSheet = ss.getSheetByName('DATA'); const resultSheet = ss.getSheetByName('Result'); const allData = dataSheet.getDataRange().getValues(); const matchedResult = []; // 若第一行是表头,将i初始值改为1即可跳过表头 for (let i = 0; i < allData.length; i++) { const colAVal = String(allData[i][0]).trim(); // 若需要不区分大小写匹配,将判断条件改为 colAVal.toLowerCase() === '250p' if (colAVal === '250P') { let colBVal = String(allData[i][1]).trim(); // 后续拆分、去空格等处理逻辑可直接写在这里 matchedResult.push([colBVal]); } } resultSheet.clearContents(); if (matchedResult.length) { resultSheet.getRange(1, 1, matchedResult.length, 1).setValues(matchedResult); } }
如果需要保留原有
EXTRACTDATA自定义公式的处理逻辑,只需将上述代码中匹配到的行对应的B列区域传入公式即可,无需传入整列数据。
可选分表需求实现代码
提前在表格内创建名为Result_250、Result_500的两个工作表,运行以下代码即可将两类标注的数据分别存入对应工作表:
function extractByCategory() { const ss = SpreadsheetApp.getActiveSpreadsheet(); const dataSheet = ss.getSheetByName('DATA'); const sheet250 = ss.getSheetByName('Result_250'); const sheet500 = ss.getSheetByName('Result_500'); const allData = dataSheet.getDataRange().getValues(); const list250 = []; const list500 = []; for (let i = 0; i < allData.length; i++) { const colAVal = String(allData[i][0]).trim(); const colBVal = String(allData[i][1]).trim(); // 可根据实际A列的500标识修改匹配值,例如标识为500P则改为'500P' if (colAVal === '250P') { list250.push([colBVal]); } else if (colAVal === '500P') { list500.push([colBVal]); } } sheet250.clearContents(); sheet500.clearContents(); if (list250.length) sheet250.getRange(1,1,list250.length,1).setValues(list250); if (list500.length) sheet500.getRange(1,1,list500.length,1).setValues(list500); }
内容的提问来源于stack exchange,提问作者Genny
相关产品推荐
相关产品推荐

