Office Scripts脚本调试请求:解决显式Any及类型推断错误
Office Scripts脚本调试方案
针对你遇到的两个TypeScript类型报错,以及脚本的性能优化,给出以下修复建议:
报错1:第13行显式Any不允许
Office Scripts禁止使用any类型,getValues()返回的是包含字符串、数字、布尔值的二维数组,将columnEValues的类型声明修改为:
let columnEValues: (string | number | boolean)[][];
报错2:第28行变量类型无法推断
遍历columnEValues时,需要给循环参数row指定明确类型,或者给code显式声明类型,修复后的遍历逻辑如下:
columnEValues.forEach((row: (string | number | boolean)[]) => { let code: string | number | boolean | undefined = row[0]; // 后续计数逻辑保持不变 });
额外性能优化建议
- 避免直接获取整列
E:E,改用getUsedRange()获取实际有数据的E列范围,减少空行遍历:let usedRange = sheet.getUsedRange(); if (!usedRange) { console.error("工作表中无有效数据区域。"); return; } let columnE = usedRange.getColumn(4); // E列是第5列,索引从0开始,所以取4 - 合并两次遍历
columnEValues的逻辑,一次完成计数和行号记录,提升执行效率:let codeInfo: { [key: string]: { count: number; rows: number[] } } = {}; columnEValues.forEach((row, index) => { let code = row[0]; if (code) { const codeStr = code.toString(); if (!codeInfo[codeStr]) { codeInfo[codeStr] = { count: 0, rows: [] }; } codeInfo[codeStr].count++; codeInfo[codeStr].rows.push(index + 1); // 转换为Excel的1-based行号 } });
修复后的完整脚本
async function main(workbook: ExcelScript.Workbook) { // 获取工作表"Feuil1" let sheet = workbook.getWorksheet("Feuil1"); if (!sheet) { console.error("未找到工作表'Feuil1'。"); return; } // 获取实际使用的数据区域,避免遍历整列空行 let usedRange = sheet.getUsedRange(); if (!usedRange) { console.error("工作表中无有效数据区域。"); return; } let columnE = usedRange.getColumn(4); // E列对应索引4(0开始计数) // 获取E列数据,指定正确类型 let columnEValues: (string | number | boolean)[][]; try { columnEValues = await columnE.getValues(); } catch (error) { console.error("获取E列数据失败:", error); return; } // 统计代码出现次数及对应行号 let codeInfo: { [key: string]: { count: number; rows: number[] } } = {}; columnEValues.forEach((row: (string | number | boolean)[], index) => { let code: string | number | boolean | undefined = row[0]; if (code) { const codeStr = code.toString(); if (!codeInfo[codeStr]) { codeInfo[codeStr] = { count: 0, rows: [] }; } codeInfo[codeStr].count++; codeInfo[codeStr].rows.push(index + 1); // 转换为Excel的1-based行号 } }); // 为出现5次及以上的代码所在行的B-F列标黄 Object.values(codeInfo).forEach(info => { if (info.count >= 5) { info.rows.forEach(rowIndex => { const rangeToColor = sheet.getRange(`B${rowIndex}:F${rowIndex}`); rangeToColor.getFormat().getFill().setColor("yellow"); }); } }); }
内容的提问来源于stack exchange,提问作者Mous
相关产品推荐
相关产品推荐

