Google Apps Script中格式化日期与数组匹配及数据提取问题
问题
在Google Apps Script中,无法让格式化后的日期与日期数组匹配。具体场景为:脚本获取当日日期,判断其是否存在于目标日期数组中(日志显示日期应匹配,但实际未生效);同时不确定如何在匹配成功后,从对应列提取数据。示例中假设当日日期为12/06/2022。
需求
- 检查当日日期是否存在于目标数组中
- 若匹配成功,将对应A列的code color填入匹配日期所在行的C列
已尝试方案
- 在Stack Overflow查找类似问题,但未找到足够相关的解答
- 尝试用
indexOf判断transformDate是否在数组中,未成功 - 不确定
.map()方法是否适用及如何使用
解决方案
原代码核心问题
in操作符误用:transformDate in codeDateArray是检查数组索引而非值,这是匹配失败的关键。- 取值错误:原代码中
codeVal取的是B列日期,而非A列的code color,不符合需求。 - 低效的单元格读写:循环中频繁调用
getRange/setValue会拖慢脚本运行速度。
修改后的代码
function tDate() { const ss = SpreadsheetApp.getActive(); const ssName = ss.getSheetByName("Sheet1"); const date = new Date(); // 格式化当日日期为指定格式 const transformDate = Utilities.formatDate(date, "EST", "MM/dd/yyyy"); // 批量读取A、B列数据(从第2行开始到最后一行) const data = ssName.getRange(2, 1, ssName.getLastRow() - 1, 2).getDisplayValues(); let matchFound = false; // 遍历数据查找匹配日期 for (let i = 0; i < data.length; i++) { const rowDate = data[i][1]; if (rowDate === transformDate) { // 获取对应A列的code color,写入当前行的C列 const codeColor = data[i][0]; ssName.getRange(i + 2, 3).setValue(codeColor); matchFound = true; break; // 找到匹配后立即退出循环 } } // 未找到匹配时标记测试结果 if (!matchFound) { ssName.getRange(2, 4).setValue(-1); } }
代码说明
- 批量读取优化:一次性读取A、B两列数据,减少单元格交互次数,提升脚本效率。
- 正确匹配逻辑:用严格相等
===比较格式化后的日期字符串与工作表中显示的日期值,确保匹配准确。 - 行号定位:遍历索引
i加2对应工作表的实际行号(因为数据从第2行开始)。 - 逻辑简化:找到匹配项后立即退出循环,避免不必要的遍历;统一处理匹配失败的标记。
批量处理版本(支持多行匹配)
如果工作表中存在多个相同日期需要处理,可采用批量读写进一步优化:
function tDateBatch() { const ss = SpreadsheetApp.getActive(); const ssName = ss.getSheetByName("Sheet1"); const date = new Date(); const transformDate = Utilities.formatDate(date, "EST", "MM/dd/yyyy"); const lastRow = ssName.getLastRow(); // 读取A、B、C三列数据 const data = ssName.getRange(2, 1, lastRow - 1, 3).getDisplayValues(); const output = []; let matchFound = false; for (const row of data) { if (row[1] === transformDate) { output.push([row[0]]); // 填入A列的code color matchFound = true; } else { output.push([row[2]]); // 保留原C列值 } } // 批量写入C列所有数据 ssName.getRange(2, 3, output.length, 1).setValues(output); if (!matchFound) { ssName.getRange(2, 4).setValue(-1); } }
内容的提问来源于stack exchange,提问作者User1938985
相关产品推荐
相关产品推荐

