Google Script中getValues获取的两个变量在IF语句比对返回false如何解决
问题根源
- Google Apps Script 中,
Range.getValues()永远返回二维数组,哪怕读取的是单个单元格、单行/单列数据,结构统一为[[行1列1值, 行1列2值...], [行2列1值, 行2列2值...]] - 你代码里的
values2、rowd2本质上都是数组类型:values2每个元素是单列数据对应的单元素数组,rowd2是单个单元格值包裹成的二维数组 - 数组属于引用类型,当
==两侧都是引用类型时,会直接比较内存地址而非实际存储的内容,因此判断永远返回false;你调试时和字面量字符串比对返回true,是因为一侧为原始值字符串时,数组会自动转为字符串再比较,所以看起来内容匹配 - Logger输出时内容一致,同样是因为打印过程中数组被自动转为字符串,视觉上没有差异
修复方案
只需要将两个比对变量都转为纯字符串再比较即可,推荐修改取值逻辑减少后续类型问题,修改后代码如下:
function Messagebox2() { var spreadsheet = SpreadsheetApp.getActive(); var sheet = spreadsheet.getSheetByName("Comments"); // 提取Comments表B列非空值,转为纯字符串数组 var range = sheet.getRange("Comments!B2:B"); var values = range.getValues(); var values2 = values.map(row => row[0].toString()).filter(val => val.trim() !== ''); // 直接提取Dashboard!A1的字符串值 var range2 = sheet.getRange("Dashboard!A1"); var rowd2 = range2.getValues()[0][0].toString().trim(); var k; for (var i = 0; i < values2.length; i++) { if (values2[i] === rowd2) { k = values2[i]; break; // 匹配到直接跳出循环,无需继续遍历 } } Logger.log(values2[0] + " " + k +" " + rowd2); }
如果不想修改原有取值逻辑,也可以只修改比对行,将两个变量转为字符串后再比较:
if (values2[i].toString().trim() == rowd2.toString().trim()) {
额外加了trim()处理,避免单元格前后存在不可见空格导致的匹配失败问题。
内容的提问来源于stack exchange,提问作者Ryan Pearson
相关产品推荐
相关产品推荐

