Google Sheets App Script中forEach内setValue如何获取行号正常运行
问题背景
需要通过Google Apps Script为表格中满足条件的行设置指定值,原脚本如下:
function add(){ var mainsname ='MIIST'; var ss = SpreadsheetApp.getActiveSpreadsheet(); var mainss = ss.getSheetByName(mainsname); var adcnumber = ss.getRangeByName('AD').getColumn(); var sacnumber = ss.getRangeByName('SA').getColumn(); var dicnumber = ss.getRangeByName('DI').getColumn(); var range = mainss.getDataRange(); var data = range.getValues().slice(1); data.forEach((row)=>{ if(row[sacnumber-1] !== "" && row[dicnumber-1] =="" ){mainss.getRange(row,dicnumber+1).setValue("test");} } ) }
故障原因
forEach遍历二维数组时,第一个入参row是当前行的所有单元格值组成的一维数组,不是表格行号,导致getRange()传入的行参数类型错误,无法定位到目标单元格。
存在问题的代码行:
mainss.getRange(row,dicnumber+1).setValue("test");
修复方法
forEach支持传入第二个参数,代表当前遍历项在数组中从0开始的索引- 由于原代码用
slice(1)跳过了第一行表头,数组第0项对应表格第2行,因此真实表格行号为索引值 + 2
修复后可正常运行的代码:
function add(){ var mainsname ='MIIST'; var ss = SpreadsheetApp.getActiveSpreadsheet(); var mainss = ss.getSheetByName(mainsname); var adcnumber = ss.getRangeByName('AD').getColumn(); var sacnumber = ss.getRangeByName('SA').getColumn(); var dicnumber = ss.getRangeByName('DI').getColumn(); var range = mainss.getDataRange(); var data = range.getValues().slice(1); // 增加index参数获取遍历索引 data.forEach((row, index)=>{ // 换算真实表格行号 const currentRow = index + 2; if(row[sacnumber-1] !== "" && row[dicnumber-1] ==""){ mainss.getRange(currentRow, dicnumber+1).setValue("test"); } }) }
性能优化提示
逐行调用getRange+setValue会频繁和表格服务交互,数据量大时执行效率极低,建议直接在内存中修改读取到的二维数组,最后一次性批量写回表格,优化后代码如下:
function add(){ var mainsname ='MIIST'; var ss = SpreadsheetApp.getActiveSpreadsheet(); var mainss = ss.getSheetByName(mainsname); var sacnumber = ss.getRangeByName('SA').getColumn(); var dicnumber = ss.getRangeByName('DI').getColumn(); var range = mainss.getDataRange(); var data = range.getValues(); // 从第2行开始遍历,数组索引1对应表格第2行 for(let i = 1; i < data.length; i++){ const row = data[i]; if(row[sacnumber-1] !== "" && row[dicnumber-1] === ""){ // 直接修改内存中对应位置的值 row[dicnumber] = "test"; } } // 一次性批量写入所有修改 range.setValues(data); }
内容的提问来源于stack exchange,提问作者Kal El
相关产品推荐
相关产品推荐

