WPS编程 | 多维表格通过名称获取表格踩坑记


多维表格作为数据库使用

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对象,此时再要获取表格的idname值,需要注意首字母要大写

let sheetobjecName = sheetobjec.Name; //Name 首字母大写
let sheetobjecId = sheetobjec.Id; //Id 首字母大写

原因分析

猜测是因为现在 WPS 的 API 正在由 1.0 向 2.0 升级,可以看到普通在线表格已经是 Beta 版本,多维表格的 2.0 版本还没有正式上线,但是应该有部分 API 是可以用的,所以导致会有很多问题,而且方案文档里也写的很不完善。

真正的原因还不清楚,暂时能用就行吧,希望后续升级后,开发文档也进一步完善,大家也少踩一点坑。


文章作者: imoke
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 imoke !
  目录