You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.17 22:35:26