上一篇文章介绍了如何对多个表格进行纵向合并(各表格栏目相同),本篇文章介绍如何快速进行横向合并(各表格栏目不同)。
数据如下:
成绩表一:
成绩表二:
成绩表三:
要把所有科目的成绩合并到一个表,如下:
要如何做呢?注意到各个表格的姓名栏顺序未必是一致的,不能简单的把各表的数据直接复制到汇总表。
看代码:
var app = GetObject('', 'KET.Application')
var sheets = app.ActiveWorkbook.Sheets
var arr = {}; //arr用于保存合并的数据
var range = sheets(1).UsedRange; //取得第一个表的数据区
var titles = range.Rows(1).Value.toArray(); //将第一个表的所有标题保存到titles数组
for (var row = 2; row <= range.Rows.Count; row++) {
//将第二行起的数据以姓名为key保存到一个对象得到
arr[range.Cells(row, 1).Value] = range.Rows(row).Value.toArray();
}
/*arr = {
name1: [name1, 分数1, 分数2, ...],
name2: [name2, 分数1, 分数2, ...],
}
*/
for (var i = 2; i <= sheets.Count - 1; i++) {
range = sheets(i).UsedRange;
//把其余各表标题栏追加到titles
titles = titles.concat(range.Rows(1).Value.toArray().slice(1));
for (var row = 2; row <= range.Rows.Count; row++) {
//把其余各表的数据追加到arr, 每行的第1格不追加
arr[range.Cells(row, 1).Value] = arr[range.Cells(row, 1).Value].concat(range.Rows(row).Value.toArray().slice(1));
}
}
var sheet = sheets("汇总表");
//设置表头
sheet.Range(sheet.Cells(1, 1), sheet.Cells(1, titles.length)).Value = arrayToSafeArray(titles);
var row = 2;
//根据姓名,逐行增加成绩
arr.keys().forEach(function(key) {
sheet.Range(sheet.Cells(row, 1), sheet.Cells(row, titles.length)).Value = arrayToSafeArray(arr[key]);
row++;
})
把脚本在万能脚本工具中打开执行即可得到