Office Script批量SHA256加密Excel两列仅一行生效报错求助
Office Script批量SHA256加密Excel列报错修复方案
问题根源
- 类型转换错误:直接将
Cell对象强制转为string会传递无效数据给加密函数,正确方式是通过getValue()获取单元格实际文本值,且需处理空值避免加密逻辑报错。 - 高频单元格操作触发限制:循环中逐行读写单元格会触发Office Script的性能限制,导致意外报错,应采用批量读写的方式优化。
- 索引逻辑隐患:
getRowIndex()返回基于0的索引,原循环的边界判断可能导致索引越界,同时逐行操作效率极低。
修正后的代码
async function main(workbook: ExcelScript.Workbook) { const selectedSheet = workbook.getWorksheet("Sheet1"); const usedRange = selectedSheet.getUsedRange(); // 批量读取所有区域数据到数组 const data = usedRange.getValues(); // 遍历处理每一行的第2、3列(索引1、2,数组从0开始计数) for (let i = 0; i < data.length; i++) { // 处理空值,避免加密函数接收无效参数 const mobileValue = data[i][1]?.toString() || ""; const mailValue = data[i][2]?.toString() || ""; // 并行计算两个哈希值,提升处理效率 const [mobileHash, mailHash] = await Promise.all([ shahash(mobileValue), shahash(mailValue) ]); // 将哈希值写回数组对应位置 data[i][1] = mobileHash; data[i][2] = mailHash; } // 批量写回所有处理后的数据到原区域 usedRange.setValues(data); } async function shahash(message: string) { // 空字符串直接返回空,跳过无效计算 if (!message) return ""; const msgBuffer = new TextEncoder().encode(message); const hashBuffer = await crypto.subtle.digest('SHA-256', msgBuffer); const hashArray = Array.from(new Uint8Array(hashBuffer)); return hashArray.map(b => b.toString(16).padStart(2, '0')).join(''); }
核心优化点
- 批量读写:一次性读取所有数据到内存数组,处理完成后一次性写回,大幅减少对Excel对象的操作次数,规避性能限制。
- 类型安全与空值处理:正确获取单元格值并转换为字符串,空单元格直接返回空字符串,避免加密逻辑报错。
- 并行计算:使用
Promise.all同时计算两个单元格的哈希值,提升批量处理效率。
内容的提问来源于stack exchange,提问作者Kah Sheung CHAN
相关产品推荐
相关产品推荐

