乐于分享
好东西不私藏

WPS Air Script脚本合集(二六-②):toStr 打天下!基础单值字段取值讲解

WPS Air Script脚本合集(二六-②):toStr 打天下!基础单值字段取值讲解

Hi,Everyone

家人们,主包后续安排是这样滴

(悄咪咪剧透下(^^*)

WPS AirScript脚本合集(二六):一次搞定!实现多个字段自动写入表格存档成图片、PDF、Excel文件——这里不是跟大家展示了多维表格的数据表结构、具体的Air Script脚本和自动化流程设置嘛(´▽`),写这篇教程的本意是想跟大家传达不同类型的字段在多维表格自动写入表格存档的处理方式——但知其然,更重要的是知其所以然,通过一个案例吃透底层设计思路才能学会举一反三,大伙们说对不对(^−^)−☆

WPS Air Script脚本合集(二六-①):一文讲透!多维表格多种字段的取值逻辑——所以这篇从底层跟大家唠嗑了多维表格行记录的取值逻辑——不过这只是个大框架,传达的主要思路就是根据不同的字段类型使用格式化函数统一处理成字符串,这样写入到其他地方如Excel单元格就不会各式各样——同比于数据分析工作的第一步是获取数据,第二步过滤掉杂乱数据得到干净数据才能进行第三步的分析数据

那接下来就得细细掰扯有哪些字段类型,这些都该怎么处理了对不对O(∩_∩)O——bingo,因为这个案例数据表前前后后共用了32个字段,部分字段类型是重复的,有些字段类型的处理方式是一致的,所以打算按字段类型的处理方式进行分篇讲解——那么请看小林子的远大计划,Show time!

WPS Air Script脚本合集(二六-②):基础单值字段取值,涉及12个字段类型:文本、数字、复选框、进度、等级、百分比、货币、公式、编号、身份证、电话、电子邮箱

WPS Air Script脚本合集(二六-③):选项类字段取值,涉及3个字段类型:单选项、多选项、级联选项

WPS Air Script脚本合集(二六-④):时间类字段取值,涉及4个字段类型:日期、时间、创建时间、最后修改时间

WPS Air Script脚本合集(二六-⑤):用户与联系人类字段取值,涉及3个字段类型:联系人、创建人、最后修改人

WPS Air Script脚本合集(二六-⑥):文件与链接类字段取值,涉及2个字段类型:图片和附件、超链接

WPS Air Script脚本合集(二六-⑦):地址与定位类字段取值,涉及2个字段类型:地址和定位

WPS Air Script脚本合集(二六-⑧):关联字段取值,涉及1个字段类型:双向关联

现在我们来看下最庞大也最基础的一族:基础单值字段如何处理Go,G0,GO!

一、涉及字段类型

字段名称对应的字段类型及所用函数关系如下:

它们的共同点在于:fields[字段名] 返回的就是一个「单值」——字符串、数字或布尔值,不存在嵌套结构。

二、验证方法

如何验证呢?

上篇提到,可以在主执行代码内使用console.log将值打印到运行日志中看看

但由于一行记录有多个字段,鉴于WPS脚本编辑器运行日志输出内容的设计逻辑我们只能看到前面的一部分内容

那我们简化下数据表,新建一个名为”观察字段格式“的数据表,尽量保留只需要观察的字段类型即可

同时裁剪下脚本代码,新建一个名为”取值“的脚本,只需要提供表名+记录ID使用getRecordById函数获取对应记录,通过console.log将记录值输出到运行日志中观察,代码如下:

var TABLE_NAME  = "观察字段格式";     var RECORD_ID  = Application.Selection.GetSelectionRecordIds()[0][0]; 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,      PageSize1000,      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.idtableName: targetSheet.namerecord: record };      }    }    offset = response.offset;  } while (offset);thrownew Error("在表【" + tableName + "】中未找到记录ID为【" + recordId + "】的记录");}var result = getRecordById(TABLE_NAMERECORD_ID);console.log("result的值:",result);var f = result.record.fields;console.log("f的值:",f);

各个字段类型的输出情况如下:

1

文本

2

数字

3

进度

4

等级

5

百分比

6

货币

7

公式

8

编号

9

身份证

10

电话

11

邮箱

12

复选框

三、取值思路

让我们来观察下运行日志中f的值结构有什么特点:文本:f的值:{“观察字段”:“我是文本”}数字:f的值:{“观察字段”:99999}进度:f的值:{“观察字段”:0.51}等级:f的值:{“观察字段”:3}百分比:f的值:{“观察字段”:0.9988}货币:f的值:{“观察字段”:1000.99}公式:f的值:{“观察字段”:48451.72032407407)}编号:f的值:{“观察字段”:1}身份证:f的值:{“观察字段”:“40103198807226004“}电话:f的值:{“观察字段”:“15215039080“}邮箱:f的值:{“观察字段”:"zrvqic@cs.school.edu.cn"}复选框:f的值:{“观察字段”:true}、f的值:{“观察字段”:false}

观察下来我们不难发现:所有字段都统一封装在同一结构中:{"观察字段": 内容}

差异仅在于观察字段对应的值类型:

1、布尔值:复选框 true /false

2、数字类型:数字、进度、等级、百分比、货币、公式计算结果、编号

3、字符串类型:文本、身份证、电话、邮箱

所以我们可以编写一个 toStr 函数将布尔值、数字类型、字符串类型统一转为字符串

具体代码如下

function toStr(value){if (value === null || value === undefinedreturn"";if (typeof value === "string")   return value;if (typeof value === "number" || typeof value === "boolean"return String(value);if (typeof value === "object") {try { return value.toString(); } catch (e) { return""; }  }return"";}

这是一个通用值转字符串工具函数,接收任意类型变量 value,按照自定义规则转换成字符串:

  • null/undefined 直接返回空字符串;

  • 字符串原值返回,数字、布尔值用 String() 转换;

  • 对象调用自身 toString(),执行报错则返回空串;

调用该函数处理结果如下

后续应用toStr函数取值代码在这里~~

var f = result.record.fields;var val_课程名称  = toStr(f["课程名称"]);var val_课程时长  = toStr(f["课程时长(h)"]);var val_复选框    = toStr(f["复选框"]);var val_进度      = toStr(f["进度"]);var val_百分比    = toStr(f["百分比"]);var val_身份证    = toStr(f["身份证"]);// ... 其余同理,全是 toStr

四、踩坑经验

这些字段类型中有2个我们需要特别注意一下:它们就是:身份证和电话!!!

为什么呢?(小小的脑袋挂着一个大大的问号ヽ(´o`;因为在写入 Excel 单元格时,纯数字字符串会被自动识别成数字:

  • 身份证 18 位 → 变成科学计数法 5.00106E+17,还丢精度

  • 电话 13800138000 → 没问题,但带前导 0 的座机 023-6380xxxx 会丢 0

所以我们的处理方法是:写入前加一个空格前缀,强制按文本处理——这正是上一篇里那行 " " + String(val_身份证) 的由来:

sheet.Range("E10").Value = " " + String(val_身份证);   // 注意这个空格console.log("  E10 身份证 => OK");

总结

综上吧啦吧啦,基础单值字段 的取值处理思路可以概括为:

  1. 字段值为字符串 / 数字 / 布尔类型,可直接 toStr转为字符串

  2. 身份证、电话写入Excel单元格时可加空格前缀防科学计数法

那基础单值字段的内容我们就先了解到这咯,完结撒花~后续其他字段取值思路让我们敬请期待,欧耶 (๑•̀ㅂ•́)و✧

往期推荐 ·盲选时刻

点兵点将,点到谁就是谁!

关注博主不迷路,开启缘分第一步~

带你见证一个普通小厂搬砖人的牛马人生!

请在微信客户端打开