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

Google Apps Script脚本未按行区分币种获取单元格值问题求助

问题解决:Google Apps Script 逐行根据币种提取对应数据

原脚本问题分析

原脚本的核心问题是遍历每行币种时,每次都对整列执行setValues,导致最后一次循环的币种设置会覆盖之前所有行的结果,最终所有行统一使用最后一行的币种规则,无法实现逐行判断。

修改后的代码

function updatePrice() {
  const ss = SpreadsheetApp.getActiveSpreadsheet();
  const jobSheet = ss.getSheetByName('JOBS');
  const productSheet = SpreadsheetApp.openById("1pt7YnN9fmoD4PE0o9oVPezK8Qz6ZmabyJbWXfdzFeMU").getSheetByName('PRODUCTS');
  
  // 构建产品价格映射表,同时存储英镑(STERLING)和欧元(EURO)价格
  const priceMap = productSheet.getRange("A2:D" + productSheet.getLastRow()).getValues().reduce((map, row) => {
    map[row[0]] = {
      sterling: row[2],
      euro: row[3]
    };
    return map;
  }, {});
  
  // 获取JOBS表中币种(O列)和产品编码(P列)数据
  const jobData = jobSheet.getRange("O2:P" + jobSheet.getLastRow()).getValues();
  
  // 逐行生成目标列的结果数组
  const resultArray = jobData.map(row => {
    const currency = row[0];
    const productCode = row[1];
    
    // 仅处理产品编码以A开头的行
    if (!productCode.match(/^A/i)) return [null];
    
    const productInfo = priceMap[productCode];
    // 产品编码不存在时返回空值
    if (!productInfo) return [null];
    
    // 根据当前行币种返回对应价格
    return currency === "EURO" ? [productInfo.euro] : currency === "STERLING" ? [productInfo.sterling] : [null];
  });
  
  // 一次性将结果写入目标列(对应原脚本的offset(0,10)位置,即P列后第10列)
  jobSheet.getRange(2, 16 + 10, resultArray.length, 1).setValues(resultArray);
}

关键修改说明

  • 合并价格映射:将欧元和英镑价格整合到同一个映射对象中,避免重复读取PRODUCTS表数据,提升效率。
  • 逐行生成结果:通过map方法遍历每行数据,直接根据当前行的币种和产品编码提取对应价格,生成最终结果数组,从根源避免整列覆盖问题。
  • 单次写入数据:仅调用一次setValues完成结果写入,符合Google Apps Script的性能优化原则,同时确保每行数据对应正确。
  • 逻辑精简:将产品编码校验、价格匹配逻辑整合到同一流程中,代码结构更清晰,便于维护。

内容的提问来源于stack exchange,提问作者Les

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.04 07:40:23