如何使findAll函数支持处理4位及以上位数的货币金额查找?
如何使findAll函数支持处理4位及以上位数的货币金额查找?
这个问题其实是Google Sheets里数值存储与显示分离导致的,我来给你拆解下原因和解决办法:
问题根源
Google Sheets里设置了货币格式的单元格,实际存储的是纯数值(比如1234.56),但显示给用户的是格式化后的字符串(比如$1,234.56)。你的原函数里:
- 当用单元格引用(比如
=findInAllSheets(A1))传值时,函数拿到的是单元格存储的原始数值,但createTextFinder查找的是单元格显示的格式化文本,两者不匹配,所以找不到结果。 - 当你用引号传字符串(比如
=findInAllSheets("1,234.56"))时,传的是和显示文本一致的内容,自然能匹配到。
解决方案:让函数自动适配数值转格式化文本
我们可以修改函数,自动判断输入类型,把数值转换成和单元格显示一致的格式化字符串,再进行查找。这里给你两个实用的版本:
版本1:适配通用货币格式
如果你的货币格式是固定的(比如$#,##0.00),可以直接用这个版本,不管输入是单元格引用还是纯数值,都能自动转换:
function findInAllSheets(text) { const ss = SpreadsheetApp.getActiveSpreadsheet(); let searchText = text; // 如果输入是数值,转换为带千分位的货币格式字符串 if (typeof text === 'number') { // 格式可根据你的实际需求调整,比如去掉$符号就改成"%.2f"再加千分位 searchText = Utilities.formatString("$%.2f", text).replace(/\B(?=(\d{3})+(?!\d))/g, ","); } const textFinder = ss.createTextFinder(searchText); const allOccurrences = textFinder.findAll(); const locationList = allOccurrences.map(item => { return {sheet: item.getSheet().getName(), cell: item.getA1Notation()}; }); console.log(locationList.map(object => object.cell)); return [[locationList.map(object => object.cell).join()]]; }
版本2:动态适配单元格格式(更灵活)
如果你的表格里有多种货币格式,或者不确定格式,这个版本可以直接读取输入单元格的格式,动态转换数值:
function findInAllSheets(input) { const ss = SpreadsheetApp.getActiveSpreadsheet(); let searchText = input; // 处理单元格引用的情况:读取单元格的数值和格式,转换为显示文本 if (input instanceof Range) { const cellValue = input.getValue(); const cellFormat = input.getNumberFormat(); searchText = Utilities.formatString(cellFormat, cellValue); } // 处理直接传数值的情况:用默认货币格式转换 else if (typeof input === 'number') { searchText = Utilities.formatString("$#,##0.00", input); } const textFinder = ss.createTextFinder(searchText); const allOccurrences = textFinder.findAll(); const locationList = allOccurrences.map(item => { return {sheet: item.getSheet().getName(), cell: item.getA1Notation()}; }); console.log(locationList.map(object => object.cell)); return [[locationList.map(object => object.cell).join()]]; }
使用说明
- 版本1适合格式固定的场景,直接用单元格引用(比如
=findInAllSheets(A1))就能正常查找; - 版本2更灵活,甚至可以直接传入单元格对象(比如在脚本里调用
findInAllSheets(ss.getRange("A1"))),完全适配单元格的格式。
备注:内容来源于stack exchange,提问作者Robert Softley Gale
相关产品推荐
相关产品推荐

