Google Apps Script中如何用单个变量统计Dell与HP设备数量?
问题
正在学习JavaScript和Google Apps Script,练习时遇到问题:想用同一个变量统计表格中Dell和HP设备的数量(表格内有100台Dell、400台HP),不想新增第二个计数器变量。当前代码用同一个counter变量导致两类设备数量输出均为500;之前尝试在if语句内打印会重复输出多次,求合适的实现方法。
原代码如下:
var ss= SpreadsheetApp.getActiveSpreadsheet(); var es = ss.getSheetByName("School1"); var ms = ss.getSheetByName("School2"); var hs = ss.getSheetByName("School3"); var esValues = es.getDataRange().getValues(); var counter = 0; //var esValues = es.getRange('A:C').getValues(); Logger.log(esValues.length); for(var i = 0; i < esValues.length; i++){ var data= esValues[i]; var first = data[1]; var last = data[0]; var middle = data[2]; var studentid = data[3]; var device = data[4]; if(device.includes("Dell")){ counter++; //Logger.log(`Dell count is ${counter}`); //When add here it prints same line 100+ times } else if(device.includes("HP")){ counter++; } } Logger.log(`Dell count is ${counter}`)//Printing same count 500 Logger.log(`Hp count is ${counter}`)//Printing same count 500 }
解决方案
单一数字变量无法同时存储两个独立的统计值,推荐用对象类型的变量实现“一个变量存两类统计”的需求——对象可以包含多个属性,分别对应Dell和HP的计数,既不用新增多个独立变量,又能清晰区分两类统计结果。
修改后的代码
var ss = SpreadsheetApp.getActiveSpreadsheet(); var es = ss.getSheetByName("School1"); var esValues = es.getDataRange().getValues(); // 用一个对象作为计数器,内置两个属性分别统计Dell和HP,初始值为0 var counter = { Dell: 0, HP: 0 }; Logger.log(esValues.length); for(var i = 0; i < esValues.length; i++){ var data = esValues[i]; var device = data[4]; // 仅保留需要的变量,删除未使用的冗余变量 if(device.includes("Dell")){ counter.Dell++; } else if(device.includes("HP")){ counter.HP++; } } // 循环结束后统一打印最终统计结果,避免重复输出 Logger.log(`Dell count is ${counter.Dell}`); Logger.log(`HP count is ${counter.HP}`);
关键说明
- 对象计数器的优势:用
counter.Dell和counter.HP分别累加对应设备数量,既满足“一个变量”的要求,又保证统计逻辑清晰、可读性强。 - 精简冗余代码:删除原代码中未使用的
ms、hs、first等变量,减少代码复杂度。 - 费凑第一种,快速定制–贯穿.out那 contributionsKeep attempt我太懂你这种憋屈感,不对,直接说避免重复输出:不在循环内打印,而是等统计完成后一次性输出结果,解决重复打印的问题。
极端方案(不推荐)
如果执意想用非对象的单一变量(可读性差、易出错),可以用数字编码的方式,比如让counter的高位存Dell数量,低位存HP数量:
var ss = SpreadsheetApp.getActiveSpreadsheet(); var es = ss.getSheetByName("School1"); var esValues = es.getDataRange().getValues(); var counter = 0; Logger.log(esValues.length); for(var i = 0; i < esValues.length; i++){ var device = esValues[i][4]; if(device.includes("Dell")){ counter += 1000; // 用高位存储Dell数量(假设HP数量不超过999) } else if(device.includes("HP")){ counter += 1; } } // 拆分数字得到两类设备数量 var dellCount = Math.floor(counter / 1000); var hpCount = counter % 1000; Logger.log(`Dell count is ${dellCount}`); Logger.log(`HP count is ${hpCount}`);
这种方法仅适用于数量范围可预知的场景,远不如对象方式实用,不建议使用。
内容的提问来源于stack exchange,提问作者Mr. Anderson
相关产品推荐
相关产品推荐

