You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Office Script批量SHA256加密Excel两列仅一行生效报错求助

Office Script批量SHA256加密Excel列报错修复方案

问题根源

  1. 类型转换错误:直接将Cell对象强制转为string会传递无效数据给加密函数,正确方式是通过getValue()获取单元格实际文本值,且需处理空值避免加密逻辑报错。
  2. 高频单元格操作触发限制:循环中逐行读写单元格会触发Office Script的性能限制,导致意外报错,应采用批量读写的方式优化。
  3. 索引逻辑隐患: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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.30 23:00:11