吾爱咖啡 发表于 2024-6-29 00:14

求教会写WPS的JS宏的大佬。

https://imgsrc.baidu.com/forum/pic/item/9d82d158ccbf6c81b74e34d7fa3eb13533fa4097.png
我使用某软件采集某网站商品,但出了些BUG。
正常应该像图1一样,但导出来的是图2这样的,没办法,只能改成图3这样的。
本想让ChatGPT帮我写个宏,沟通中发现,公司的WPS是个人版,不支持VBA宏,只有JS宏。
反正沟通了几个小时,写出了如下步骤和代码,还是不能用。有没有大佬能帮忙修改一下?为方便实验,我把表格也放下面了。
前置:
我把需处理的xlsm文件和xlsx文件单独放在一个文件夹。
理想需求是像批处理文件一样,双击xlsm文件,就可以自动处理xlsx文件。
如果不行,打开xlsm文件,然后选择宏、运行宏也可以。
手动操作的话,就是先后筛选出“产品1”和“M”,然后依次修改为color 1、color 2、color 3,然后依此重复。然后我按照这个想法和ChatGPT沟通的。
步骤:

[*]

[*]读取数据:
[*]检查当前文件夹下是否存在且仅存在一个xlsx文件。如果不存在xlsx文件,或者存在多个xlsx文件,则报错。
[*]打开该xlsx文件,读取C列(产品标题)、J列(颜色)和K列(尺寸)的数据。

[*]数据处理:
[*]遍历每一行数据,检查J列(颜色)是否为“as the picture”。
[*]对于J列为“as the picture”的行,提取相同产品标题和尺寸值的行。

[*]分配颜色:
[*]为每个相同产品标题和尺寸值的组分配不同的颜色标签(如color1、color2、color3等),确保每个颜色标签唯一。
[*]将这些颜色标签替换原来的“as the picture”。

[*]更新数据:
[*]将处理后的数据写回到xlsx文件中,直接覆盖原始数据。


代码:
function processXlsxFile() {
    try {
      // 获取当前文件夹下的所有xlsx文件
      var folder = WPS.Application.ActiveWorkbook.Path;
      var files = WPS.Application.FileSearch.Search(folder, "*.xlsx");
      
      // 检查是否存在且仅存在一个xlsx文件
      if (files.length !== 1) {
            throw new Error("必须存在且仅存在一个xlsx文件");
      }
      
      // 打开xlsx文件
      var filePath = files;
      var workbook = WPS.Application.Workbooks.Open(filePath);
      var sheet = workbook.Sheets;
      
      // 读取数据
      var lastRow = sheet.Cells(sheet.Rows.Count, "C").End(WPS.xlUp).Row;
      var data = [];
      for (var i = 1; i <= lastRow; i++) {
            var title = sheet.Cells(i, "C").Value;
            var color = sheet.Cells(i, "J").Value;
            var size = sheet.Cells(i, "K").Value;
            data.push({ title: title, color: color, size: size, row: i });
      }
      
      // 数据处理
      var colorIndex = 1;
      var colorMap = {};
      for (var i = 0; i < data.length; i++) {
            if (data.color === "as the picture") {
                var key = data.title + "|" + data.size;
                if (!colorMap) {
                  colorMap = "color" + colorIndex++;
                }
                data.color = colorMap;
            }
      }
      
      // 更新数据
      for (var i = 0; i < data.length; i++) {
            sheet.Cells(data.row, "J").Value = data.color;
      }
      
      // 不保存和关闭表格
      // workbook.Close(false);
    } catch (e) {
      WPS.Application.StatusBar = "错误: " + e.message;
    }
}
表格:

产品标题颜色尺寸值
产品1as the pictureM
产品1as the pictureL
产品1as the pictureXL
产品1as the pictureM
产品1as the pictureL
产品1as the pictureXL
产品1as the pictureM
产品1as the pictureL
产品1as the pictureXL
产品2黑36
产品2黑38
产品2黑40
产品2黑42
产品3as the picture大
产品3as the picture小
产品3as the picture大
产品3as the picture小

eenny820 发表于 2024-6-29 00:25

function processXlsxFile() {
    try {
      // 获取当前文件夹下的所有xlsx文件
      var folder = WPS.Application.ActiveWorkbook.Path;
      var files = WPS.Application.FileSearch.Search(folder, "*.xlsx");
         
      // 检查是否存在且仅存在一个xlsx文件
      if (files.length !== 1) {
            throw new Error("必须存在且仅存在一个xlsx文件");
      }
         
      // 打开xlsx文件
      var filePath = files;
      var workbook = WPS.Application.Workbooks.Open(filePath);
      var sheet = workbook.Sheets;
         
      // 读取数据
      var lastRow = sheet.Cells(sheet.Rows.Count, 3).End(WPS.XlDirection.xlUp).Row; // 获取最后一行
      var data = [];
      for (var i = 1; i <= lastRow; i++) {
            var title = sheet.Cells(i, 3).Value; // C列
            var color = sheet.Cells(i, 10).Value; // J列
            var size = sheet.Cells(i, 11).Value; // K列
            data.push({ title: title, color: color, size: size, row: i });
      }
         
      // 数据处理
      var colorIndex = 1;
      var colorMap = {};
      for (var i = 0; i < data.length; i++) {
            if (data.color === "as the picture") {
                var key = data.title + "|" + data.size;
                if (!colorMap) {
                  colorMap = "color" + colorIndex++;
                }
                data.color = colorMap;
            }
      }
         
      // 更新数据
      for (var i = 0; i < data.length; i++) {
            sheet.Cells(data.row, 10).Value = data.color; // 更新J列
      }
         
      // 保存并关闭工作簿
      workbook.Save();
      workbook.Close(false);
    } catch (e) {
      WPS.Application.StatusBar = "错误: " + e.message;
    }
}

yinlin 发表于 2024-6-29 10:57

个人觉得楼上这位大哥是正确的{:1_918:}

妮可妮可妮 发表于 2024-6-29 11:22

歪个楼,wps我是装个vba就可以用宏了,你百度wps vba宏下载就有了

吾爱咖啡 发表于 2024-6-29 14:25

eenny820 发表于 2024-6-29 00:25
function processXlsxFile() {
    try {
      // 获取当前文件夹下的所有xlsx文件


https://img.picui.cn/free/2024/06/29/667fa84125396.png
报错,Project-Module1:第50行 第8列:引用错误: WPS is not definedat processXlsxFile (Project:50:9),这要怎么处理呢?

eenny820 发表于 2024-6-30 23:16

吾爱咖啡 发表于 2024-6-29 14:25
报错,Project-Module1:第50行 第8列:引用错误: WPS is not definedat processXlsxFile (Project:50:9) ...

function processXlsxFile() {
    try {
      // 获取当前文件夹下的所有xlsx文件
      var folder = wps.EtApplication().ActiveWorkbook.Path;
      var files = wps.FileSystemObject().GetFolder(folder).Files;
         
      // 检查是否存在且仅存在一个xlsx文件
      var xlsxFiles = [];
      for (var fileEnum = new Enumerator(files); !fileEnum.atEnd(); fileEnum.moveNext()) {
            var file = fileEnum.item();
            if (file.Name.match(/\.xlsx$/i)) {
                xlsxFiles.push(file);
            }
      }
      
      if (xlsxFiles.length !== 1) {
            throw new Error("必须存在且仅存在一个xlsx文件");
      }
         
      // 打开xlsx文件
      var filePath = xlsxFiles.Path;
      var workbook = wps.EtApplication().Workbooks.Open(filePath);
      var sheet = workbook.Sheets(1);
         
      // 读取数据
      var lastRow = sheet.Cells(sheet.Rows.Count, 3).End(-4162).Row; // 获取最后一行,-4162是xlUp的枚举值
      var data = [];
      for (var i = 1; i <= lastRow; i++) {
            var title = sheet.Cells(i, 3).Value; // C列
            var color = sheet.Cells(i, 10).Value; // J列
            var size = sheet.Cells(i, 11).Value; // K列
            data.push({ title: title, color: color, size: size, row: i });
      }
         
      // 数据处理
      var colorIndex = 1;
      var colorMap = {};
      for (var i = 0; i < data.length; i++) {
            if (data.color === "as the picture") {
                var key = data.title + "|" + data.size;
                if (!colorMap) {
                  colorMap = "color" + colorIndex++;
                }
                data.color = colorMap;
            }
      }
         
      // 更新数据
      for (var i = 0; i < data.length; i++) {
            sheet.Cells(data.row, 10).Value = data.color; // 更新J列
      }
         
      // 保存并关闭工作簿
      workbook.Save();
      workbook.Close(false);
    } catch (e) {
      wps.EtApplication().StatusBar = "错误: " + e.message;
    }
}

bu^shan 发表于 2024-7-22 17:40

你这纯粹是采集规则有问题,改一下采集规则就好了,用不着来回折腾{:1_908:}

fengshengshou 发表于 2024-9-6 16:16

学习JS宏中,围观
页: [1]
查看完整版本: 求教会写WPS的JS宏的大佬。