-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathOfficeItemHandlerForRamda.js
48 lines (46 loc) · 1.99 KB
/
OfficeItemHandlerForRamda.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
// WPS Office Collection Handler for Ramda (v0.0.1)
// (github:https://github.com/LastsForever/wps_office_collection_handler_for_ramda)
//
// 通过对 WPS Office集合对象(需带有Item方法)使用代理,使之可被Ramda库的R.map与R.filter直接操作。
// 使用方法:
// (1) 新建一个WPS JS宏代码模块,复制Ramda源码(dist/ramda.js文件)至其中;
// (2) 新建另一代码模块,将本文件代码复制其中(需与步骤1模块隶属同一wps文件);
// (3) WPS JS宏编辑器中,工具 => 选项 => 编译 => 分别取消“禁用全局作用域表达式”和“禁用全局作用域标识符重复定义”;
// (4) 为WPS Office集合对象新建代理(见ramda_test函数);
// 注:
// Ramda版本: v0.28.0
// 链接: https://github.com/ramda/ramda
//
const OfficeItemHandler = {
get: function(target, prop, receiver) {
// Console.log(`prop: ${prop.toString()}`);
if (target === null ||
target === undefined ||
typeof target.Count !== 'number' ||
typeof target.Item !== 'function')
throw new TypeError('必须是一个带有Item方法的Office集合对象');
else if (prop === 'length')
return target.Count;
else if (prop === 'map')
return function(fn) {
let arr = [];
for (let item of target)
arr.push(fn(item));
return arr;
}
else if (prop.constructor.name === 'String' && /^\d+$/.test(prop))
return target.Item(Number(prop) + 1);
else
return Reflect.get(target, prop, receiver);
}
}
// 测试:对Range对象调用ramda的map和filter功能,找出加粗的单元格并输出其地址。
function ramda_test() {
let office_collection_object = ActiveSheet.UsedRange;
let proxy_range_object = new Proxy(office_collection_object, OfficeItemHandler);
R.pipe(
R.filter(cell => cell.Font.Bold === true),
R.map(cell => cell.Address()),
arr => Console.log(arr.join(";")),
)(proxy_range_object);
}