测完电路后,面对收集到的一大堆波形数据,需要从中找出关键信息并整理到汇总表格里,这种经历你有过吗?我不仅干过,甚至熬到了凌晨三点,简直累到想吐!
大学时没认真听VBA怎么用,一心扑在电路上。如今为了处理数据,只能重新捡起脚本工具。为什么不从VBA开始呢?因为在泥地里跑,怎么也比不上在水泥地上跑得快。所以,我们继续深耕JSA(WPS表格的JavaScript API),探索更高效的解决方案。
我的核心需求
- 在指定列中快速找到匹配的数据
- 源文件是示波器波形的RawData。
- 需要定位波形最高点对应的数值单元格及其时间戳单元格。
- 将找到的数据自动拷贝到指定的
汇总.xlsx 文件中。
开始需求拆解
- 读取指定列的内容。
- 判断并找出该列中的最大值。
- 复制最大值所在的单元格以及其对应的时间单元格。
- 激活
汇总.xlsx 目标文件。
- 添加一些人性化的封装功能,提升脚本的复用性。
函数实现
首先,我们可以基于之前文章中的一些基础操作作为参考(相关链接已保留其原意):
JS-WPS 自动化办公(1) -- 表格基础操作
JS-WPS自动化办公(2) -- 文档处理
获取最大值:最初的思路
最直接的逻辑是遍历单元格并进行比较,以下是初步实现的代码:
function GetMax()
{
//选择要遍历的列
let cellRange="S";
//初始化最大值
let maxValue =0;
//从哪里开始遍历
for(let i=3;i<100;i++)
{
//如果maxValue小于当前的单元格就将当前单元格的值赋值给maxValue
if(maxValue<Range(cellRange+i).Value2)
{
maxValue=Range(cellRange+i).Value2;
}
//如果不是那就保持maxValue
else
{
maxValue=maxValue;
}
}
//打印最大值
console.log("GetMax:"+maxValue);
return maxValue;
}

测试结果1:这个函数完成了需求拆解中的第1和第2步(读取和判断)。
但是!这是一个表格!
既然操作对象是电子表格,我们就应该利用其内置的公式能力。通常,我们会使用 =MAX(S3:S100) 这样的公式。在 JSA 中,我们可以直接将这个逻辑融入脚本,无需手动编写循环。
在JSA里的优化实现
function GetMax()
{
//选择要遍例的列
let cellRange="S";
//初始化最大值
let maxValue =0;
//将Q2的值设置为S3:S100范围内的最大值
Range("Q2").Value(undefined,"=MAX(S3:S100)");
//获取Q2的值
maxValue=Range("Q2").Value2;
//打印最大值
console.log("GetMax:"+maxValue);
return maxValue;
}

看起来,利用 JSA 结合表格自身的公式功能,代码变得简洁高效得多。测试结果2:同样完美完成了需求1和2。
JSA脚本录制辅助开发
接下来需要实现拷贝操作。如果不确定 JSA 中拷贝粘贴的具体 API 用法,可以借助 WPS 的“宏录制”功能。这相当于一种图形化的编程辅助。


将录制生成的 VBA 代码逻辑转化为 JSA 代码,如下所示:
function Macro1()
{
// 选择B4单元格
Range("B4").Select();
// 复制B4单元格的内容
Selection.copy(undefined);
// 粘贴到D4单元格
Range("D4").Select();
ActiveSheet.Paste(undefined,undefined);
}
现在,我们可以将“查找最大值”和“复制粘贴”这两个功能结合起来,形成一个完整的流程。
function GetMax()
{
//初始化变量
let MaxCell="Q2";
let PasteCell="D4";
let maxValue =0;
//将Q2单元格的值设置为B3:B100范围内的最大值(公式方式)
Range(MaxCell).Value(undefined,"=MAX(B3:B100)");
//获取Q2单元格的值(计算结果)
maxValue=Range(MaxCell).Value2;
//打印最大值
console.log("GetMax:"+maxValue);
// 选择存放最大值的单元格(如Q2)
Range(MaxCell).Select();
// 复制该单元格的内容
Selection.Copy(undefined);
//激活汇总文件窗口
Windows.Item("汇总.xlsx").Activate();
//选择汇总文件中指定的目标单元格
Range(PasteCell).Select();
//粘贴为数值(避免粘贴公式)
Selection.PasteSpecial(xlPasteValues, xlPasteSpecialOperationNone, false, false);
//返回最大值
return maxValue;
}

测试结果:数据已成功定位并添加至汇总表格。
人性化功能添加——封装成可配置函数
为了方便在不同文件中重复使用,我们将核心逻辑封装成一个带参数的函数,提高其灵活性和复用性。这涉及到对 DOM 操作思维的更高级应用,即通过参数动态控制操作对象。
function GetMax(MaxCell,PasteFileName,PasteCell,SEL_Range)
{
//初始化最大值
let maxValue =0;
//在指定单元格(MaxCell)中设置计算最大值的公式
Range(MaxCell).Value(undefined,"=MAX("+SEL_Range+')');
//获取计算后的最大值
maxValue=Range(MaxCell).Value2;
//打印最大值
console.log("GetMax:"+maxValue);
// 选择存放最大值的单元格
Range(MaxCell).Select();
// 复制该单元格的内容
Selection.Copy(undefined);
//激活目标汇总文件窗口
Windows.Item(PasteFileName).Activate();
//选择目标单元格
Range(PasteCell).Select();
//粘贴为数值
Selection.PasteSpecial(xlPasteValues, xlPasteSpecialOperationNone, false, false);
return maxValue;
}
//测试函数
function test()
{
let printMax;
//调用函数,参数分别为:临时计算格、目标文件名、目标单元格、数据源范围
printMax=GetMax('Q1','汇总.xlsx','A1','B2:B100');
Console.log('Max Value:'+printMax);
}

通过以上步骤,我们实现了一个从特定数据列中自动提取最大值并归档到汇总表的 JSA 脚本。这种方法尤其适合处理像示波器导出的这类规律性强的批量数据,能极大提升数据整理的效率。希望本篇来自云栈社区的分享能帮助你在使用 WPS 进行自动化办公时更加得心应手。
(下图摄于苍南县望里镇)
