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
相关产品推荐
相关产品推荐

