多维表格作为数据库使用
WPS 多维表格功能强大,如果配合 AirScript 脚本,特别是 AirScript 脚本提供了 webhook 功能,可以允许外部程序调用,这样多维表格甚至可以作为一个小型的数据库使用。
如何查询数据
WPS 多维表格与普通的在线表格 API 不同,查询数据通过Application.Record.GetRecords()
进行查询,需要传入一个数组,具体的后面说,必填的一个参数是SheetId
,但是这个值又不能直观的得到,所以这个有点坑爹,可以在写程序的时候直接写死,如下面的代码
let records = Application.Record.GetRecords({
SheetId: 1
});
这样就只能查询id
为 1 的表格的记录,但是有时候,我希望通过 webhook 传值的方式,来获取不同表格的数据又怎么办呢,当然可以直接传入id
值,但是这样难免不方便,如何再加上需要用户选择表,那更麻烦了,能不能直接传入表的名称,不获取表的记录呢。
通过表名获取表的 id
可以自己写一个函数,通过表名来获取表的id
function getSheetByName(sheetName) {
const sheets = Application.Sheet.GetSheets(); // 获取所有数据表
for (let i = 0; i < sheets.length; i++) {
if (sheets[i].name === sheetName) { // 找到指定名称的数据表
return sheets[i]; // 返回数据表对象
}
}
return null;
}
这样就可以通过表名来获取表的id
了
let sheetname ="数据表";
let sheetobjec =getSheetByName(sheetname);
let sheetobjecName = sheetobjec.name;
let sheetobjecId = sheetobjec.id;
踩坑计
既然通过getSheetByName()
函数获取了一个sheet
对象,那能不能继续操作这个对象呢,比如下面这段代码
let sheetobj = getSheetByName("用户表");
let res = sheetobj.Views(1).RecordRange.Condition(filters, "AND")
答案是程序会报错,后来修改getSheetByName()
函数,问题解决,修改如下
function getSheetByName(sheetName) {
const sheets = Application.Sheet.GetSheets(); // 获取所有数据表
for (let i = 1; i <= sheets.length; i++) {
const ssheet = Application.Sheets(i);
if (ssheet.Name === sheetName) { // 找到指定名称的数据表
return ssheet; // 返回数据表对象
}
}
return null;
}
这样返回的是一个完整的sheet
对象,此时再要获取表格的id
或name
值,需要注意首字母要大写
let sheetobjecName = sheetobjec.Name; //Name 首字母大写
let sheetobjecId = sheetobjec.Id; //Id 首字母大写
原因分析
猜测是因为现在 WPS 的 API 正在由 1.0 向 2.0 升级,可以看到普通在线表格已经是 Beta 版本,多维表格的 2.0 版本还没有正式上线,但是应该有部分 API 是可以用的,所以导致会有很多问题,而且方案文档里也写的很不完善。
真正的原因还不清楚,暂时能用就行吧,希望后续升级后,开发文档也进一步完善,大家也少踩一点坑。