如何用Google Apps Script基于双列条件复制列到同工作表指定列
扩展Google Apps Script脚本功能
原脚本由Tanaike协助修改,当前功能为:当对应行E6:E的值不等于“Out”时,将D6:D中的值复制到H6:H中。原脚本代码如下:
function copyAllPresent() { const ss = SpreadsheetApp.getActive(); const sheet = ss.getSheetByName("Base"); // 获取D列和E列的值 const valuesToCopy = sheet.getRange(6, 4, sheet.getLastRow(), 2).getValues(); // 创建新数组,判断E列不为"Out"时复制D列值 const values = valuesToCopy.map(([d, e]) => [e != "Out" ? d : null]); // 将数组写入H列 sheet.getRange(6, 8, values.length).setValues(values); }
现需扩展脚本功能:当对应行C6:C的值为空时,忽略该行D列值不复制。最终逻辑为:仅当对应行C6:C不为空且E6:E的值不等于“Out”时,才将D6:D的值复制到H6:H中。
尝试调整脚本时遇到问题:map方法似乎无法同时判断两列条件;修改Tanaike提供的其他脚本也仅判断了E6:E是否为“Out”的条件,未满足需求。
修改后的脚本
function copyAllPresent() { const ss = SpreadsheetApp.getActive(); const sheet = ss.getSheetByName("Base"); // 读取C、D、E三列从第6行开始的数据,排除前5行空行 const valuesToCopy = sheet.getRange(6, 3, sheet.getLastRow() - 5, 3).getValues(); // 同时判断C列非空且E列不等于"Out",满足则取D列值,否则设为null const values = valuesToCopy.map(([c, d, e]) => [c !== "" && e !== "Out" ? d : null]); // 将结果写入H列第6行开始的区域 sheet.getRange(6, 8, values.length).setValues(values); }
修改说明
- 调整
getRange参数:从第3列(C列)开始读取3列数据(C、D、E),并修正行数计算为sheet.getLastRow() - 5,避免读取前5行的无效空行。 - 在
map方法中解构出C、D、E三列的值,通过逻辑与&&同时校验两个条件:C列不为空、E列不等于"Out",满足条件则返回D列值,否则返回null(对应H列单元格为空)。
预期效果示例
| 项目类型 | 姓名 | 状态 | 复制结果 | |||
|---|---|---|---|---|---|---|
| Basketball | Michael Jordan | Michael Jordan | ||||
| Baseball | Babe Ruth | Babe Ruth | ||||
| Football | Joe Montana | Out | ||||
| Wayne Gretzky | ||||||
| Cycling | Lance Armstrong | Lance Armstrong | ||||
| Tennis | Roger Federer | Out | ||||
| Football | Lionel Messi | Lionel Messi |
内容的提问来源于stack exchange,提问作者Codedabbler
相关产品推荐
相关产品推荐

