多维表格如何与外部API通信(上)

雨er
雨er Lv.1 新人创作者

Lv.1新人创作者

多维表格的能力边界有限,但是AirScript又弥补了这一点。通过AirScript,可以让多维表格和外部API进行通信,从而获取各种优秀的在线服务。

  1. AirScript(AS)是什么?这是WPS在JavaScript(JS)的基础上,针对智能表/多维表进行特殊调教的编程语言。

编写AirScript代码时,语法和JS基本相同,但是多维表格本质上是浏览器环境,所以有很多限制。比如说不能使用异步处理Async/Await,不能安装任何第三方依赖。

同时,AS还有一套和多维表格交互的逻辑,包括基本的读写,以及按条件筛选。针对每个不同的字段,还会有代码变体。

  1. API是什么?API的全程比较复杂,需要知道的是,API是一个协议,通过这个协议,不同软件之间可以进行交流。

多维表格在自动化流程中就有一个“发送HTTP请求”的动作,HTTP是API协议中的一部分,而且确实鼎鼎大名,你能在日常几乎所有网址中看到有HTTP或者HTTPS的前缀,这就是它的厉害之处。

(小知识:如果你在Windows文件管理器里面输入一个网址也是可以的)

但是自动化流程里的HTTP请求不够灵活,比如没有轮询机制,最终还是得AS才能有满血体验。

实战

  1. 制作二维码

多维表到现在都没有所谓的二维码字段,导致很多交互场景都无法满足。诚然,智能表格里有二维码字段,甚至还可以做成实时更新的活码,但是牵扯到多维表和智能表之间的通信,而且还要多开一个表,总之就是不够优雅。使用外部API就可以很好的解决,做到“二维码生成自由”。

首先,我在扣子编程中创建好了一个工作流。最终生成的二维码是这样的:

其中,前缀是“河南省卫健委”,所在地是“东楼”,楼层是“F1”,具体位置是“测试地点1”,二维码内容是设备编码,大家可以扫一扫。

大家也可以选择其他的二维码生成网站,比如草料二维码,这个网站支持API通讯,所以也是OK的。基本原理都差不多。

在扣子中,会显示以下信息:

先贴出代码:

const API_KEY = "Bearer eyJhbGciOiJSUzI1NiIsImtpZCI6IjJlYzY4MDQ4LTUwN2MtNDgzOS1hZmQxLTM1YmJhODcyMmRkZCJ9.eyJpc3MiOiJodHRwczovL2FwaS5jb3plLmNuIiwiYXVkIjpbImh3VnVrQ0xERnlLZXpjYTZpdXZpMDBsRGdVTVZYTjMwIl0sImV4cCI6ODIxMDI2Njg3Njc5OSwiaWF0IjoxNzc0MzE2NjcxLCJzdWIiOiJzcGlmZmU6Ly9hcGkuY296ZS5jbi93b3JrbG9hZF9pZGVudGl0eS9pZDo3NjIwMjY3MTI3NzQzNzA5MjIwIiwic3JjIjoiaW5ib3VuZF9hdXRoX2FjY2Vzc190b2tlbl9pZDo3NjIwNjMyMDc3MTYzMDM2NzE0In0.blT8XBL9Ylr7wye-OAjJ54-CAO5xtvKrCKfIezqYjmGiSKrVmoWgqRzlxXST6veLYtFTqta2GoZGG6VGwdUquzclzam2HFzoFichUhfFvjCF22lBJCDIypofEnu2rh-QsyB1zJN8zkQSBkLJ12ne4E3IrjSjHPh-5hFNYY7MT33eLHYk8VQrfAtWsYMZdfXmyOIEagWBL6EQ-q3Cu8pKy6CWKS6I3ym8GrlFOqiPqtmC3tFhI4kggGW-Sj2ZNGWQliQBaYq-LC9B3QSbggrptLA8ZyHHJ7ogcUSz_6eXUhkyr4afY-_xfMHV9GPltTgdizfGWEtHdiOlG-lF3HsYWg"//API_token,注意一定要保留前缀Bearer
const url = "https://fr7pb4x58y.coze.site/run"//API请求地址
const prefix = "河南省卫健委"//前缀
const textid = Context.argv.id[0]//选定的记录,用于和按钮联动,请勿更改
const device_code = Application.Sheets('示例表').RecordRange(textid,"@设备编码").Value//实际使用时,"示例表"需要换成当前表名,字段名也要更改为设备编码所在的字段名,注意不要删除@和""
const location_info = Application.Sheets('示例表').RecordRange(textid,"@所在地").Value+"-"+Application.Sheets('设备表').RecordRange(textid,"@楼层").Value+"-"+Application.Sheets('设备表').RecordRange(textid,"@具体位置").Value

const headers = {
  'Authorization': API_KEY,
  'Content-Type': 'application/json'
};
  const response = HTTP.fetch(url, {
    method: 'POST',
    headers: headers,
    body: JSON.stringify({
      "prefix":prefix,
      "device_code":device_code,
      "location_info":location_info
//参数区,需要根据实际参数进行调整    
})
  });
const data = response.json()
 const imgurl = data.qr_code_url;
    Application.Sheets("示例表").RecordRange(textid, "@巡查二维码").Value = Application.DBCellValue([{
      fileData: imgurl,
      fileName: location_info+".png",
    }])

我会慢慢解释这些代码的含义,如果嫌我啰嗦的话,可以直接将自己需要输入的参数和需要写入的参数都扔给大模型,让它对代码进行改造。有需要注意的地方我会下划线标记。

首先,在JS中,需要定义变量,定义方法基本有const,let两种,const构建的变量不能改变,let构建的可以改变(比如数字的加减)。写法就是const A = 。。。 建议是在等于号左右两边加空格。

比如说,

const A = 1
const B = A
console.log(B)

最后就会在控制台打印出来B的值,即为1

前六行都是将需要收集的参数都摆在最上面, 方便使用。就像做菜一样,提前把食材准备好,而不是准备开始炒菜的时候才开始准备。

前两行是用于HTTP请求的。几乎所有HTTP请求都需要:URL,请求地址;method,请求方法;API token,凭证。可以把URL和API token想象成账号密码。请求方法能用到的基本有两种,POST,GET。POST就是发出去,GET就是拿过来。

第三到六行是获取参数的,有了这些参数,就可以根据每个记录的不同写出“活码”了。其中,前缀prefix是固定值,所以直接用双引号赋值即可(双引号赋值代表这个变量是文本类型。如果直接写不带引号的数字就是数字类型,此外还有数组[]和对象{}类型。更复杂的代码可以自定义类型,不过咱们用不到)

其中,Context.argv.id[0]是获取上下文信息的。这一部分需要和自动化流程进行联动。

其中,在第二步的“脚本入参”中,id就是Context.argv.id[0]中的id。每一条记录被创建的时候,都会分配一个不会被看见的记录ID,自动化流程所做的事情就是获取这个ID,并发送给AS

然后是获取对应字段的数值:

const device_code = Application.Sheets('示例表').RecordRange(textid,"@设备编码").Value

其中,示例表需要换成你所在的表名,设备编码是需要换成设备编码所在的字段名。(如果字段名或者数据表名被更改,那这里也要更改)

八到二十三行,都是HTTP的固定写法。

二十四到二十七行,是写入到多维表格的写法。这些写法都能在WPS开放平台中找到。

在下一篇文章中,会使用Webhook实现外部API访问多维表格,做到真正的双向通信

河南省
浏览 263
收藏
6
分享
6 +1
1
+1
全部评论 1
 
Hypnotist
Hypnotist Lv.3 优质创作者WPS寻令官WPS产品体验官

Lv.3优质创作者

还是Python好用,air script感觉很复杂的样子
· 四川省
1
回复