如何将计算CRC16 CCITT FALSE的VBA代码迁移为Google Apps Script版本
Google Sheet CRC16 CCITT 计算实现方案
操作步骤
- 打开目标Google Sheet,点击顶部菜单栏「扩展程序」->「Apps Script」进入脚本编辑器
- 清空编辑器默认生成的代码,粘贴下方的自定义函数代码
- 按下Ctrl+S保存项目,任意设置项目名称(例如CRC计算工具),按照提示完成脚本运行授权
- 返回表格界面,在需要输出结果的单元格输入
=CRC_CCITT_FFFF(待计算单元格)即可调用,例如B1单元格输入=CRC_CCITT_FFFF(A1)
完整实现代码
// CRC16 CCITT 配置常量 const CRC_POLY_CCITT = 0x1021; const CRC_START_CCITT_FFFF = 0xFFFF; // 全局缓存查表数组,避免重复计算 let crcTabCCITT = null; // 预生成CRC查表数组 function generateCRCTable() { crcTabCCITT = new Array(256); for (let i = 0; i < 256; i++) { let crc = 0; let c = i * 256; for (let j = 0; j < 8; j++) { if ((crc ^ c) & 32768) { crc = (crc * 2) ^ CRC_POLY_CCITT; } else { crc = crc * 2; } c = c * 2; } crcTabCCITT[i] = crc & 0xFFFF; } } // 表格可调用自定义函数 function CRC_CCITT_FFFF(strParam) { // 首次运行生成查表数组 if (!crcTabCCITT) generateCRCTable(); let crc = CRC_START_CCITT_FFFF; // 逻辑与原VBA对齐,取每个字符低8位字节计算 for (let i = 0; i < strParam.length; i++) { const currentByte = strParam.charCodeAt(i) & 255; crc = (crc * 256) ^ crcTabCCITT[((crc >>> 8) ^ currentByte) & 255]; crc = crc & 0xFFFF; } // 转换为4位大写十六进制结果,补前导零 return crc.toString(16).toUpperCase().padStart(4, '0'); }
效果验证
测试输入:
00020101021129370016A000000677010111021312345678901215802TH5406500.5553037646304
预期输出:3D85
本实现已通过该测试用例验证,输出与预期完全一致。
注意事项
- 若需要处理包含非ASCII字符的字符串,可根据编码需求调整字节转换逻辑,当前逻辑与原VBA完全对齐
- 函数支持直接传入字符串参数,也可引用单元格,使用方式与普通表格函数完全一致
内容的提问来源于stack exchange,提问作者Azis Sofyan Prasetyo
相关产品推荐
相关产品推荐

