日志输出行偏移1行,Sheet公式写入位置错误及传参问题求助
问题修复:按背景色定位单元格并设置公式
核心问题分析
- 索引偏移:
for (row in sourceData)循环中的row是0起始的字符串类型索引,而Google Sheets的行号是1起始的,直接使用会导致定位行号比目标行小1。 - 单元格范围语法错误:
getRange([row + [0]],3,lastSourceRow,1)的写法不符合API规范,且不需要选取大范围,只需定位单个目标单元格即可。 - 公式引用行号错误:公式中
A' + (row)同样用了0起始索引,导致引用的单元格行号错误。
修正后的代码
function testv1(){ var sourceSheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("overzicht"); var lastSourceRow = sourceSheet.getLastRow(); // 直接获取C列的背景色数据,范围从第1行到最后一行的C列(列3) var sourceRange = sourceSheet.getRange(1, 3, lastSourceRow); var sourceData = sourceRange.getBackgrounds(); // 遍历C列的每一行,row是0-based索引 for (let row = 0; row < sourceData.length; row++) { // 检查当前行C列的背景色(sourceData[row][0]因为只取了C列,列索引固定为0) if (sourceData[row][0] === '#efefef') { // 转换为1-based行号 const targetRow = row + 1; Logger.log(`目标单元格:C${targetRow}`); // 定位到C列的目标行单元格 var formulaCell = sourceSheet.getRange(targetRow, 3); // 公式中引用A列的对应行时使用targetRow formulaCell.setFormula(`=IFERROR(SUM(filter(Transacties!$C:C;TEXT(Transacties!$A:A;"yyyyMMMM") = $D$3 & $C$3;regexmatch(Transacties!$F:F; A${targetRow})));"Geen gegevens test test 5x")`); } } }
关键修正点说明
- 直接获取C列(列3)的背景色数据,简化后续索引判断,
sourceData[row][0]直接对应C列当前行的背景色。 - 使用
for (let row = 0; row < sourceData.length; row++)替代for...in,避免字符串索引问题,同时更直观控制循环。 - 将0-based索引转换为1-based行号
targetRow = row + 1,确保定位和公式引用的行号正确。 - 单个单元格定位使用
getRange(targetRow, 3),精准定位到C列的目标行,避免不必要的大范围选取。
内容的提问来源于stack exchange,提问作者wjp79
相关产品推荐
相关产品推荐

