3.4 多个源片区
解决了多目标的问题后,我们很容易联想到有多个源的问题。计算可能需要使用 Excel 的多个源片区,但 clipboard() 函数只能保持最新复制的那一片,这又该怎么办?
可以把剪贴板内容直接复制到格子里面去。
下面用 “查询符合指定条件的订单”为例进行说明。
Excel 中有两个 Sheet,订单明细和员工名单,其中订单明细如下:
A | B | C | D | E | |
---|---|---|---|---|---|
1 | OrderID | Client | SellerId | Amount | OrderDate |
2 | 1 | WVF Vip | 1 | 440 | 2014-11-03 |
3 | 2 | UFS Com | 1 | 1863 | 2015-01-01 |
4 | 3 | SWFR | 2 | 1813 | 2014-11-01 |
5 | 4 | JFS Pep | 2 | 671 | 2015-01-01 |
6 | 5 | DSG | 1 | 3730 | 2015-01-01 |
7 | 6 | JFE | 1 | 1445 | 2015-01-01 |
8 | 7 | OLF | 3 | 625 | 2015-01-01 |
9 | 8 | PAER | 3 | 2490 | 2015-01-01 |
员工名单如下:
A | B | C | D | E | F | G | |
---|---|---|---|---|---|---|---|
1 | EId | State | Dept | Name | Gender | Salary | Birthday |
2 | 2 | New York | Marketing | Ashley | F | 11001 | 1980-07-19 |
3 | 3 | New Mexico | Sales | Rachel | F | 9000 | 1970-12-17 |
4 | 4 | Texas | HR | Emily | F | 7000 | 1985-03-07 |
5 | 5 | Texas | R&D | Ashley | F | 16000 | 1975-05-13 |
6 | 6 | California | Sales | Matthew | M | 11000 | 1984-07-07 |
7 | 7 | Illinois | Sales | Alexis | F | 9000 | 1972-08-16 |
8 | 8 | California | Marketing | Megan | F | 11000 | 1979-04-19 |
9 | 1 | Texas | HR | Victoria | F | 3000 | 1983-12-07 |
计算目标:查询出最近 days 天内或订单属于部门列表 depts 的数据,需要的列有订单编号、日期、金额、销售员名字、部门名称。其中 days 是外部参数,每次执行时都可以输入不同的值,比如输入 30 表示查询 30 天内的订单;depts 也是外部参数,比如 [“Markeding”,“Finance”]。这个计算目标涉及动态查询和多键值查询,Excel 本身不好实现,借助 SPL 就很容易。
首先,在 Excel 中选定片区“订单明细”,连带列名一起复制粘贴到 SPL 网格的 A1 单元格;同样地,将片区“员工名单”复制到 SPL 网格的 A2 单元格。如下图:
注意,一定要进入 A1 格的编辑状态才能进行粘贴,不然会把剪贴板的内容填进一大片格子,结果可能变成这样:
这就不对了,占有区域太大,会影响代码布局。
如果操作正确,A1/A2 格外观上只呈现很小一部分数据,点击后才会呈现完整数据,这是网格式代码的独特之处,适合在不影响阅读和代码布局的情况下复制大片数据。
复制完两个源片区后,继续编写脚本,期间可多次运行脚本,可手工操作剪贴板。最后代码如下:
A | B | |
---|---|---|
1 | OrderID Client… | =A1.import@t() |
2 | EId State… | =A2.import@t() |
3 | =B1.switch(SellerId,B2:EId) | |
4 | =A3.select(OrderDate>=after(date(now()),days*-1)||depts.pos(SellerId.Dept)) | |
5 | =A4.new(OrderID,OrderDate,Amount,SellerId.Name:Name,SellerId.Dept:Dept) |
完成计算后,可用“copy data”按钮将 A5 中的计算结果拷贝回 Excel。有一点需要注意,保存代码时应当把 A1/A2 格的数据清除掉,否则这些大片数据也会被一起保存起来了。