Google Sheets结果处理:substringAfter提取的"117"调用toIntOrNull()返回null?
问题分析与解决方法
核心问题排查
你遇到的问题大概率是以下两个原因之一:
- 误用
substringAfter而非substringAfterLastsubstringAfter("I")会返回第一个匹配"I"之后的所有内容,如果你的updatedRange里前面的单元格标识包含"I"(比如"tData!I10:A117:I117"),提取结果就会是"10:A117:I117",这种混合字符自然转不成整数。 - 提取的字符串包含不可见空白字符
比如返回的updatedRange末尾有空格、换行符,或者提取后字符串前后有空白,toIntOrNull()遇到非数字字符就会返回null。
解决步骤
方法1:改用substringAfterLast提取行号
直接取最后一个"I"之后的内容,确保只拿到行号部分:
val updatedRange = "tData!A117:I117" val rowStr = updatedRange.substringAfterLast("I") // 准确拿到"117" val rowNum = rowStr.toIntOrNull()
方法2:先清除空白再转换
如果是空白字符导致的问题,先调用trim()去掉前后不可见字符:
val rowStr = updatedRange.substringAfter("I").trim() val rowNum = rowStr.toIntOrNull()
方法3:用正则提取数字(最可靠)
不管updatedRange格式怎么变,直接匹配最后一组数字:
val updatedRange = "tData!A117:I117" val rowNum = Regex("\\d+$").find(updatedRange)?.groupValues?.get(1)?.toIntOrNull()
验证技巧
可以先打印提取后的字符串的详细信息,排查是否有异常字符:
val rowStr = updatedRange.substringAfter("I") println("字符串内容: '$rowStr'") // 用单引号包裹,能直观看到前后是否有空白 println("字符串长度: ${rowStr.length}") rowStr.forEach { println("字符: '$it' 编码: ${it.code}") } // 数字的ASCII编码是48-57,若出现其他编码就是异常字符
内容的提问来源于stack exchange,提问作者Wilstyx
相关产品推荐
相关产品推荐

