如何在Google Apps Script中仅更新数组内的空白单元格
修正后的DOLOOKUP_1函数(避免覆盖已有数据)
你的代码核心问题是错误的空值判断逻辑和整列覆盖的操作方式,导致无法实现"只填充空白单元格"的需求。以下是修正后的代码,同时优化了性能和逻辑严谨性:
function DOLOOKUP_1() { const ss = SpreadsheetApp.getActive(); const wsSalesData = ss.getSheetByName('Sales Data'); const wsRates = ss.getSheetByName('Rates'); // 获取Rates表的有效数据范围(从第2行第2列开始,取4列) const ratesLastRow = wsRates.getLastRow(); const ratesData = wsRates.getRange(2, 2, ratesLastRow - 1, 4).getValues(); // 把Rates数据转成对象映射,提升查找效率 const ratesMap = new Map(ratesData.map(row => [row[0], row[2]])); // 获取Sales Data表的有效数据范围(避免处理大量空行) const salesLastRow = wsSalesData.getLastRow(); if (salesLastRow < 2) return; // 没有数据直接退出 // 获取C列(搜索值)和H列(目标填充列)的现有数据 const searchValues = wsSalesData.getRange(2, 3, salesLastRow - 1, 1).getValues(); const existingHValues = wsSalesData.getRange(2, 8, salesLastRow - 1, 1).getValues(); // 遍历每一行,只填充H列为空的行 const updatedValues = searchValues.map((searchRow, index) => { // 如果H列已有数据,直接保留原内容 if (existingHValues[index][0] !== null && existingHValues[index][0] !== '') { return [existingHValues[index][0]]; } // 查找匹配的费率,没有则返回null const matchValue = ratesMap.get(searchRow[0]); return matchValue !== undefined ? [matchValue] : [null]; }); // 批量写入更新后的数据(仅覆盖需要修改的行) wsSalesData.getRange(2, 8, updatedValues.length, 1).setValues(updatedValues); }
关键改动说明:
- 修复空值判断:不再用错误的整列等于null判断,逐行检查H列现有内容,仅填充空白行。
- 优化数据范围:只获取到工作表最后一行的有效数据,避免处理大量空行,提升运行速度。
- 使用Map优化查找:把Rates数据转成Map对象,比
find方法的查找效率更高(数据量大时更明显)。 - 保留已有数据:遍历过程中直接复用H列的现有非空值,确保不会覆盖已填内容。
- 修正拼写错误:原代码中的
seachRow改为正确的searchRow。
内容的提问来源于stack exchange,提问作者Pam
相关产品推荐
相关产品推荐

