基于Google Script的SUMPRODUCT后续需求:修改状态返回格式
后续问题:扩展Google Sheets脚本的完成状态展示逻辑
这是我此前在Stack Overflow提问的后续问题,原回答者要求我新建问题而非修改原有问题,因此特此提问。
样本文档包含5个标签页:
- Dataset Before:处理前的数据集样式
- Dataset Result (Old):现有脚本处理后的数据集样式
- Dataset Result (New Requirement):满足新需求后的目标数据集样式
- Completion Data:用于判定完成状态的数据表
- Settings:存储各课程对应课程代码映射关系的表
当前使用的脚本如下:
// This is from your provided Spreadsheet. const obj = [ { name: "Dataset Before", range: "A2:A" }, { name: "Completion Data", range: "A2:C" }, { name: "Settings", range: "E5:I" } ]; // 1. Retrieve values and ranges from 3 sheets. const ss = SpreadsheetApp.getActiveSpreadsheet(); const [sheet1, sheet2, sheet3] = obj.map(({ name, range }, i) => { obj[i].sheet = ss.getSheetByName(name); obj[i].range = obj[i].sheet.getRange(range + obj[i].sheet.getLastRow()); obj[i].values = obj[i].range.getValues(); if (i == 1) { // For "Completion Data" sheet. // Create an object for searching values. obj[i].values = obj[i].values.reduce((o, [a, b, c]) => { if (c == "Completed") { o[b] = o[b] ? { ...o[b], [a]: c } : { [a]: c }; } return o; }, {}); } else if (i == 2) { // For "Settings" sheet. // Transpose the retrieved values. obj[i].len = obj[i].values[0].length; obj[i].values = obj[i].values[0].map((_, col) => obj[i].values.map((row) => row[col])); } return obj[i]; }); // Create an array for putting into the destination range by follwoing your logic. const values = sheet1.values.map(([a]) => { if (sheet2.values[a]) { return sheet3.values.map(e => e.some(f => sheet2.values[a][f]) ? "Completed" : "Incomplete"); } return Array(sheet3.len).fill("Incomplete"); }); // Put the values to the destination range. sheet1.sheet.getRange(2, 2, values.length, values[0].length).setValues(values); }
现有脚本可实现需求,执行时间约40秒,远快于我之前的方案。它会在“Completion Data”标签页中查找人员ID,若状态为“Completed”则返回“Completed”,其他状态返回“Incomplete”。
新需求:
我需要脚本返回拼接完成日期的完成状态,例如Completed (04/24/2024);若状态为“Enrolled”则返回Incomplete (Enrolled),其他未完成情况返回Incomplete。
遗憾的是我无法完全理解现有脚本的逻辑,自行编写的嵌套循环方案每列执行时间超过15分钟,无法完成运行。我尝试修改return sheet3.values.map(e => e.some(f => sheet2.values[a][f]) ? "Completed" : "Incomplete");这部分代码但始终报错,希望能得到帮助。
若有信息缺失或表述不清,请告知我以便修改补充。谢谢。
内容的提问来源于stack exchange,提问作者DanCue
相关产品推荐
相关产品推荐

