首页 > 其他分享 >借助 ONLYOFFICE 宏进行去重

借助 ONLYOFFICE 宏进行去重

时间:2022-10-27 19:01:21浏览次数:65  
标签:重复 单元格 mapValues value Api 借助 var ONLYOFFICE 进行

在本文中,我们将介绍一个简短的宏。您可使用它来从电子表格中去掉重复项。就功能性而言,其与 Excel 中已得到广泛使用的 “去重” 宏类似。不过,由于这是一个基于 JavaScript 的宏,所以其背后的原理将会由些许不同。

借助 ONLYOFFICE 宏进行去重_javascript


关于 ONLYOFFICE 宏

如果您是一名资深 Microsoft Excel 用户,那么相信您已对于 VBA 宏非常熟悉了。这些宏是帮助您自动执行日常任务的小型脚本。无论是重构数据,还是在单元格区域中插入多个值。ONLYOFFICE 宏的基础是 JavaScript 语法与文档生成器 API 方法。基于 JavaSript 的宏易于使用,具有跨平台特性且十分安全。这就使得其与 VBA 相比有着显著的优势。

ONLYOFFICE 文档免费在线宏课程

近期,我们将开始发布有关 ONLYOFFICE 解决方案的免费视频课程。首个视频课程将关注 ONLYOFFICE 文档中的宏,现已在 YouTube 上提供。

​本课程分为 4 节,每节时长大约在 5-10 分钟。您将了解宏的工作原理,以及一些实际的例子。为了方便起见,我们还在视频描述中添加了时间戳 – 只需点击一下即可转到您感兴趣的主题。

阅读​​这篇文章​​,了解更多。

参考宏

作为参考,这里我们会使用 “高亮重复项” 宏。ONLYOFFICE 宏会以不同的颜色对所选区域中的重复项进行高亮。示例代码可在我们 API 文档页面中的​​宏样本​​部分找到。下面就让我们来仔细了解一下吧。

我们在最开始为不重复值所在的单元格设置白色填充。对于重复值所在的单元格,我们将为之创建一个包含不重复颜色的数组。这一功能可通过 CreateColorFromRGB API 方法进行实现:

(function () 
{
// 具有不重复值的单元格背景颜色
var whiteFill = Api.CreateColorFromRGB(255, 255, 255);
// 颜色范围的当前索引
var uniqueColorIndex = 0;
// 用于高亮重复值的颜色范围
var uniqueColors = [Api.CreateColorFromRGB(255, 255, 0),
Api.CreateColorFromRGB(204, 204, 255),
Api.CreateColorFromRGB(0, 255, 0),
Api.CreateColorFromRGB(0, 128, 128),
Api.CreateColorFromRGB(192, 192, 192),
Api.CreateColorFromRGB(255, 204, 0)];

之后,我们来添加一个函数,并使用它来从数组中选择颜色:

// 用于获取重复项颜色的函数
function getColor() {
// 如果您已选择过所有颜色,那么就从头再来
if (uniqueColorIndex === uniqueColors.length) {
uniqueColorIndex = 0;
}
return uniqueColors[uniqueColorIndex++];}

然后我们将选择活动工作表并执行 ForEach 方法。其将遍历所选范围并为包含重复值的单元格分配额外值:

// 获取活动工作表
var activeSheet = Api.ActiveSheet;
// 获取活动工作表选择范围
var selection = activeSheet.Selection;
// 具有重复数字的单元格值 Map
var mapValues = {};
// 所有单元格范围
var arrRanges = [];
// 遍历选择范围
selection.ForEach(function (range){
// 从单元格中获取值
var value = range.GetValue();
if (!mapValues.hasOwnProperty(value)) {
mapValues[value] = 0;
}
mapValues[value] += 1;
arrRanges.push(range);
});

现在我们再来遍历一遍所有单元格。如果单元格中有我们在前面分配的额外值,那么就执行 getColor 函数。其将为重复值单元格挑选一个填充颜色。然后我们使用 SetFillColor 方法来应用颜色。剩余非重复项的单元格将被填充白色背景色:

var value;
var mapColors = {};
// 如果该值重复超过 1 次,我们就将检查范围中的所有单元格并设置高亮
for (var i = 0; i < arrRanges.length; ++i) {
value = arrRanges[i].GetValue();
if (mapValues[value] > 1) {
if (!mapColors.hasOwnProperty(value)) {
mapColors[value] = getColor();
}
arrRanges[i].SetFillColor(mapColors[value]);
} else {
arrRanges[i].SetFillColor(whiteFill);
}
}
});

新建宏

“去重” 宏不会对重复值进行高亮。其会将重复项从选择范围中移除。这种情况下,我们只需要对重复值进行检测的部分代码即可:

function (){
// 获取活动工作表
var activeSheet = Api.ActiveSheet;
// 获取活动工作表选择范围
var selection = activeSheet.Selection;
// 单元格值 Map
var mapValues = {};
// 所有单元格范围
selection.ForEach(function (range){
// 从单元格中获取值
var value = range.GetValue();
// 如果单元格没有重复值
if (!mapValues.hasOwnProperty(value)) {
// 我们将该值设为 0
mapValues[value] = 0;
}
});
})();

现在我们需要一个清除重复单元中内容的方法。这里我建议使用 Clear 方法。其会将电子表格当前范围内的内容清空。这就使其成为了完美的候选方法。如果单元格具有重复值,我们就将此方法包含在代码运行的 else 语句中:

function (){
// 获取活动工作表
var activeSheet = Api.ActiveSheet;
// 获取活动工作表选择范围
var selection = activeSheet.Selection;
// 单元格值 Map
var mapValues = {};
// 所有单元格范围
selection.ForEach(function (range){
// 从单元格中获取值
var value = range.GetValue();
// 如果单元格没有重复值
if (!mapValues.hasOwnProperty(value)) {
// 我们将该值设为 0
mapValues[value] = 0;
}
// 如果单元格中有重复值
else {
// 清除单元格内容
range.Clear();
}
});
})();

借助 ONLYOFFICE 宏进行去重_教程_02

这里的宏只是借助我们的 API 方法可以实现的众多功能之一。我们强烈建议您上手试试,创建自己的宏。欢迎随时提问,也欢迎与我们分享您的想法和宏。我们已做好与您探讨和合作的准备。祝您的探索之旅一帆风顺!

标签:重复,单元格,mapValues,value,Api,借助,var,ONLYOFFICE,进行
From: https://blog.51cto.com/u_15679924/5801682

相关文章