WPS Air Script脚本合集(二六-①):一文讲透!多维表格多种字段的取值逻辑

Say Hi
!!!
好久不见呐家人们
距离上次发文居然过去一个多月了
(诶?!时间过得这么快咩Σ(・□・;)
果然人的记忆力还是有限
太久没更新回顾上篇文章内容倍感陌生(当牛做马久了精神力略显麻木
这样下去不行啊小林子( ̄O ̄;)
好了废话不多说
这篇就来梳理下上篇文章脚本编写的一些思路(请忽略文章字里行间可能透着一股淡淡的班味(人机味),好久没写文了用词生疏(6G冲浪选手小林在线鞠躬,鞠躬,鞠躬… …

一、搞懂
「取值逻辑」

上篇文章已经向大家展示了整个多维表格的数据表结构、具体的Air Script脚本和自动化流程设置,大致讲解了脚本的整体设计逻辑指路文章链接:WPS AirScript脚本合集(二六):一次搞定!实现多个字段自动写入表格存档成图片、PDF、Excel文件
整体代码设计思路是从多维表一行记录 → Excel 模板 → 写入并导出的端到端自动化脚本,运行时由自动化流程触发的按钮驱动。
也就是说第一步是根据表名+记录ID从多维表找到对应的行记录再底层一点,找到对应的字段再再底层一点,
获取到对应字段在该行记录的值
Air Script脚本中用 getRecordById 这个函数根据表名和记录ID获取行记录的所有字段内容具体代码是下面这段
/*** 根据表名和记录ID,获取该记录的所有字段内容*/function getRecordById(tableName, recordId){var sheets = Application.Sheet.GetSheets();var targetSheet = null;for (var i = 0; i < sheets.length; i++) {if (sheets[i].name === tableName) {targetSheet = sheets[i];break;}}if (!targetSheet) {thrownew Error("找不到表名为【" + tableName + "】的数据表");}var offset = null;do {var response = Application.Record.GetRecords({SheetId: targetSheet.id,PageSize: 1000,Offset: offset});if (!response || !response.records) {thrownew Error("获取记录失败");}for (var j = 0; j < response.records.length; j++) {var record = response.records[j];if (String(record.id) === String(recordId)) {return { tableId: targetSheet.id, tableName: targetSheet.name, record: record };}}offset = response.offset;} while (offset);thrownew Error("在表【" + tableName + "】中未找到记录ID为【" + recordId + "】的记录");}
那么使用这个函数获得的值长啥样呢?可以在主执行代码内使用console.log将值打印到运行日志中看看
如下图所示,

在var result = getRecordById(TABLE_NAME, RECORD_ID);后面接一行console.log(“result的值”,result);,运行日志输出结果为 result的值 {“tableId”:4,”tableName”:”数据表”,”record”:{“fields”:{“PDF存档”:[{“fileName”:”泛函分析-课程介绍.PDF”,”size”:154946,”sour
(鉴于WPS脚本编辑器运行日志输出内容的设计逻辑,我们只能看到前面的一部分内容
ε-(´∀`; )
下一行代码var f = result.record.fields;那f取的值是result 的值中record的值中的fields部分(其实这种表达不是很专业,但简单易懂,主打一个能理解就行(^_^)v所以console.log(“f的值”,f);运行日志输出结果为 f的值 {“PDF存档”:[{“fileName”:”泛函分析-课程介绍.PDF”,”size”:154946,”source”:”upload_ks3″,”type”:”pdf”,”uploadId”:”3RY445ZIAAA
如果不是拘于运行日志输出内容的限制的话,f的值应该长下面类似样貌:
{fields: {"课程名称": "高等数学", // 字符串"课程时长(h)": 1.5, // 数字"适用年级": ["大一", "大二"], // 数组"地址": { districts: [...], detail: "..." }, // 对象"创建人": { nickName: "-.-" }, // 嵌套对象...}}
怎么验证具体字段的值呢?
小林教大家一个小诀窍,
继续使用console.log大法
既然f取的值是result 的值中record的值中的fields部分,那么f[字段名称]取的值是result 的值中record的值中的fields的值中的对应字段值
比如f[“编号”]取的是编号字段的值,console.log(“编号的值:”,f[“编号”]);输出的内容是1
比如f[“适用年级”]取的是适用年级字段的值,console.log(“适用年级的值:”,f[“适用年级”]);输出的内容是[“大三”,”研一”,”大二”]
比如f[“PDF存档”]取的是PDF存档字段的值,console.log(“PDF存档的值:”,f[“PDF存档”]);输出的内容是PDF存档的值: [{“fileName”:”泛函分析-课程介绍.PDF”,”size”:155006,”source”:”upload_ks3″,”type”:”pdf”,”uploadId”:”F6XHBOJIACQG
一句话规律就是:f[“X”] 永远取的是 result.record.fields 里名为 X 的那个字段的原始值,值是什么类型,就原样返回什么类型。

观察上面编号、适用年级、PDF存档字段返回的值,不难发现,字段类型不同,f[字段名称] 返回的数据结构就不同。
那么这里就有一个痛点:因为返回的数据结构就不同,如果直接将f[字段名称] 返回的值写入单元格,文本类没问题,但遇到数组 / 对象 / 嵌套结构就会变成 “[object Object]” 或其他奇奇怪怪的格式,丑且没法用。
比如将f[“适用年级”]输出的值[“大三”,”研一”,”大二”]写入单元格,其实写成大三、研一、大二更加顺眼如果将f[“PDF存档”]输出的值: [{“fileName”:”泛函分析-课程介绍.PDF”,”size”:155006,”source”:”upload_ks3″,”type”:”pdf”,”uploadId”:”F6XHBOJIACQG 直接写入单元格,我想这不是大家能接受的普遍用法
所以针对不同数据结构的核心思路是:
封装一组「格式化函数」,把每一种字段类型都处理成干净的字符串,再统一写入单元格。
脚本中共用了 toStr / fmtArray / fmtUrl …等好几个函数处理,具体函数的处理逻辑后续再细细唠嗑吧(内容太多码不动字了(´▽`)

二、字段对应函数表


一表汇总字段类型和函数,
一目了然有木有^_−☆



先总个结

其实字段取值本质上就是根据不同的字段类型使用格式化函数统一处理成字符串,这样写入到其他地方如Excel单元格就不会各式各样
既然这篇内容标题是WPS Air Script脚本合集(二六-①),那么肯定有(二六-②)、(二六-③)、(二六-④)等等啦
没错,后面窝们将逐篇讲解不同字段类型对应取值函数的设计思路(结束得有点生硬,
内容主打一个短小精悍o(^▽^)o(先等窝哦家人们,
那先拜拜啦(ToT)/~~~(祝各位每天开开心心,
顺顺利利,万事顺意^_−☆!

往期推荐 ·盲选时刻
点兵点将,点到谁就是谁!









关注博主不迷路,开启缘分第一步~
带你见证一个普通小厂搬砖人的牛马人生!
请在微信客户端打开
夜雨聆风