找回密码
立即注册
搜索
热搜: Java Python Linux Go
发回帖 发新帖

394

积分

0

好友

48

主题
发表于 17 小时前 | 查看: 1| 回复: 0

测完电路后,面对收集到的一大堆波形数据,需要从中找出关键信息并整理到汇总表格里,这种经历你有过吗?我不仅干过,甚至熬到了凌晨三点,简直累到想吐!

大学时没认真听VBA怎么用,一心扑在电路上。如今为了处理数据,只能重新捡起脚本工具。为什么不从VBA开始呢?因为在泥地里跑,怎么也比不上在水泥地上跑得快。所以,我们继续深耕JSA(WPS表格的JavaScript API),探索更高效的解决方案。

我的核心需求

  1. 在指定列中快速找到匹配的数据
    • 源文件是示波器波形的RawData。
    • 需要定位波形最高点对应的数值单元格及其时间戳单元格。
  2. 将找到的数据自动拷贝到指定的 汇总.xlsx 文件中。

开始需求拆解

  1. 读取指定列的内容。
  2. 判断并找出该列中的最大值。
  3. 复制最大值所在的单元格以及其对应的时间单元格。
  4. 激活 汇总.xlsx 目标文件。
  5. 添加一些人性化的封装功能,提升脚本的复用性。

函数实现

首先,我们可以基于之前文章中的一些基础操作作为参考(相关链接已保留其原意):

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;
}

JavaScript遍历查找最大值代码示例

测试结果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;
}

使用Excel公式的JSA代码示例

看起来,利用 JSA 结合表格自身的公式功能,代码变得简洁高效得多。测试结果2:同样完美完成了需求1和2。

JSA脚本录制辅助开发

接下来需要实现拷贝操作。如果不确定 JSA 中拷贝粘贴的具体 API 用法,可以借助 WPS 的“宏录制”功能。这相当于一种图形化的编程辅助。

WPS表格数据界面

WPS宏录制生成的VBA代码

将录制生成的 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;
}

JSA脚本执行并粘贴数据到汇总表

测试结果:数据已成功定位并添加至汇总表格。

人性化功能添加——封装成可配置函数

为了方便在不同文件中重复使用,我们将核心逻辑封装成一个带参数的函数,提高其灵活性和复用性。这涉及到对 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 进行自动化办公时更加得心应手。

(下图摄于苍南县望里镇)
苍南县望里镇风景照




上一篇:OpenAI官宣ChatGPT引入广告,免费与Go用户首当其冲
下一篇:Apache Calcite RelBuilder实战:构建关系代数表达式与查询优化详解
您需要登录后才可以回帖 登录 | 立即注册

手机版|小黑屋|网站地图|云栈社区 ( 苏ICP备2022046150号-2 )

GMT+8, 2026-1-18 19:46 , Processed in 0.223230 second(s), 41 queries , Gzip On.

Powered by Discuz! X3.5

© 2025-2026 云栈社区.

快速回复 返回顶部 返回列表