Google Apps Script中For循环匹配值后设置单元格值的方法
问题核心原因&修复方案
你当前代码的错误来自两个索引映射的问题,直接修改匹配逻辑里的setValue行即可实现需求:
- 行号偏移修正:你从Devices表的
G3:G拉取assetId数组,数组下标i=0对应表格的第3行,因此目标行号为i + 3 - 列号修正:F列对应表格的第6列,不是你当前写的第3列(第3列是C列)
修复后的代码片段
把原来的d.getRange(i,3).setValue('null')替换为:
d.getRange(i + 3, 6).setValue('null')
性能优化方案(可选,适合数据量大的场景)
避免循环中反复调用表格接口拖慢运行速度,修改逻辑如下:
function replaceIds() { const ss = SpreadsheetApp.getActiveSpreadsheet() const r = ss.getSheetByName("Form Responses 1") const d = ss.getSheetByName("Devices") const oldId = r.getRange("J2:J").getValues().flat() const newId = r.getRange("K2:K").getValues().flat() const studentName = r.getRange("C2:C").getValues().flat() const assetId = d.getRange("G3:G").getValues().flat() const annotatedUser = d.getRange("E3:E").getValues().flat() // 提前读取F列所有值到数组 const fCol = d.getRange("F3:F" + (assetId.length + 2)).getValues() for (let i = 0; i < assetId.length; i++) { for (let p = 0; p < oldId.length; p++) { if (assetId[i] != "" && oldId[p] != "" && assetId[i] == oldId[p]) { Logger.log('Old Match: ' + assetId[i]) // 直接修改数组 fCol[i][0] = 'null' } } //new asset ID loop for (let r = 0; r < newId.length; r++) { if (assetId[i] != "" && newId[r] != "" && assetId[i] == newId[r]) { Logger.log('New Match: ' + assetId[i]) } } } // 批量写回F列 d.getRange("F3:F" + (assetId.length + 2)).setValues(fCol) }
内容的提问来源于stack exchange,提问作者Riceman
相关产品推荐
相关产品推荐

