WPS AirScript脚本合集(二三):自动触发!联系人字段内容文件存档
在很久很久以前,(孩子们来听小林讲睡前故事啦(´▽`)
小林搓了篇关于多维表格内容结合脚本自动存档成图片、PDF、表格文件的文章指路链接:
WPS AirScript脚本合集(十七):瞬时归档!多维表格结合脚本自动存档成图片、PDF、表格文件
当时为了方便说明核心内容
——字段内容自动文件存档所以只演示了文本和图片字段
不过万变不离其宗
其他字段只要能成功读取到值都可以写入模板Excel文件,紧接着导出为图片、PDF和表格文件滴
那这次我们先来看下联系人字段的值要怎么搞到手
(Next!Show Timeψ(`∇´)ψ


一、多维表格数据表及字段结构

这次来个简单点,就文本、联系人、图片和附件3个字段~1、数据表名:联系人+文件存档2、视图名:表格视图3、字段设置:◉ 字段名称:文本– 字段类型:文本 – 限制字数:否- 禁止录入重复值:否 – 默认值:无◉ 字段名称:联系人– 字段类型:联系人 – 使用设置:勾选 允许选择多个联系人,不勾选 允许向新插入的联系人发送通知 – 默认值:无◉ 字段名称:图片和附件 – 字段类型:图片和附件 -显示样式:以缩略图样式显示 – 图片上传方式:无需勾选 仅可通过移动端拍摄上传◉ 字段名称:图片存档 – 字段类型:图片和附件 -显示样式:以列表样式显示 – 图片上传方式:无需勾选 仅可通过移动端拍摄上传◉ 字段名称:PDF存档 – 字段类型:图片和附件 -显示样式:以列表样式显示 – 图片上传方式:无需勾选 仅可通过移动端拍摄上传◉ 字段名称:表格存档 – 字段类型:图片和附件 -显示样式:以列表样式显示 – 图片上传方式:无需勾选 仅可通过移动端拍摄上传


二、AirScript脚本说明

// 配置区const SheetName = Context.argv.SheetName || "联系人+文件存档"; //数据表名const ViewName = Context.argv.ViewName || '表格视图'; //视图名称const CustomFileUrl = Context.argv.CustomFileUrl || '填写文件模板文件链接'; //自定义文件模板链接const DocumentSavePath = Context.argv.DocumentSavePath || '填写文件模板保存指定路径'; //文件模板保存指定路径// 1. 获取当前记录IDconst RecordId = Context.argv.RecordId || Application.Selection.GetSelectionRecordIds()[0][0];console.log("当前记录ID:", RecordId);// 2. 获取字段的值const value1 = Application.Sheets(SheetName).Views(ViewName).RecordRange(RecordId, "@文本").Value;console.log("当前记录【文本】字段的值:", value1);const value2 = Application.Sheets(SheetName).Views(ViewName).RecordRange(RecordId, "@联系人").Value;console.log("当前记录【联系人】字段的值:", value2);let nicknames = []; // 存储所有nickname的数组let nicknameString = "";// 检查value对象和_core数组是否存在if (value2 && value2._core && Array.isArray(value2._core)) {// 使用for循环遍历_core数组for (let i = 0; i < value2._core.length; i++) {const contact = value2._core[i];// 检查contact对象和nickname字段if (contact && contact.nickname) {nicknames.push(contact.nickname);} else {console.warn(`第${i+1}个联系人的nickname字段为空或不存在`);}}// 输出结果console.log("提取的昵称列表:", nicknames);nicknameString = nicknames.join(",");console.log("昵称字符串:", nicknameString);} else {console.error("联系人数据格式异常,无法提取nickname");}const value3 = Application.Sheets(SheetName).Views(ViewName).RecordRange(RecordId, "@图片和附件").Value.Value[0].ThumbnailsUrl;console.log("当前记录【图片和附件】字段的URL:", value3);// 根据图片URL获取图片数据,使用HTTP.get方法下载图片const resp_value3 = HTTP.get(value3, {timeout: 10000// 设置10秒超时});console.log("resp_value3响应状态:", resp_value3.status);// 检查请求是否成功if (resp_value3.status === 200) {console.log("value3图片下载成功");}// 关键步骤:将图片数据转换为Base64编码const base64Data_value3 = `data:image/jpeg;base64,${resp_value3.binary().toString('base64')}`;console.log("图片数据Base64编码:", base64Data_value3);// 3. 获取当前日期和时间,格式为 "yyyyMMddhhmmss"var time = getNowDateTime();console.log("当前时间为(格式yyyyMMddhhmmss):", time);function getNowDateTime(){var date = new Date();var year = date.getFullYear();var month = (date.getMonth() + 1).toString().padStart(2, '0'); // 月份补零var day = date.getDate().toString().padStart(2, '0'); // 日期补零var hours = date.getHours().toString().padStart(2, '0'); // 小时补零var minutes = date.getMinutes().toString().padStart(2, '0'); // 分钟补零var seconds = date.getSeconds().toString().padStart(2, '0'); // 秒补零return year + month + day + hours + minutes + seconds;}// 4. 另存自定义打印文件模板const fileUrl = KSDrive.createFile(KSDrive.FileType.ET, {source: CustomFileUrl,dirUrl: DocumentSavePath,name: `${SheetName}-${nicknameString}-${time}`});console.log("另存文件模板的文件链接", fileUrl);// 5. 修改文件内容并导出为图片或PDFlet file = KSDrive.openFile(fileUrl);file.Application.ActiveSheet.Range('C4').Value = value1;file.Application.ActiveSheet.Range('E4').Value = ` ${nicknameString}`;file.Application.ActiveSheet.Range('C5').InsertImage(base64Data_value3);const json_pdf = file.Application.ActiveWorkbook.ExportAsFixedFormat(0);console.log("导出为PDF的文件下载链接", json_pdf.url);const json_pic = file.Application.ActiveWorkbook.ExportAsFixedFormat(2);console.log("导出为图片的文件下载链接", json_pic.url);file.close();// 6. 存档到指定多维表格字段中Application.Sheets(SheetName).RecordRange(RecordId, "@PDF存档").Value = DBCellValue([{fileData: json_pdf.url,fileName: `${SheetName}-${value1}-${time}.PDF`}]);Application.Sheets(SheetName).RecordRange(RecordId, "@图片存档").Value = DBCellValue([{fileData: json_pic.url,fileName: `${SheetName}-${value1}-${time}.PNG`}]);Application.Sheets(SheetName).RecordRange(RecordId, "@表格存档").Value = DBCellValue([{fileData: fileUrl,fileName: `${SheetName}-${value1}-${time}.XLSX`}]);

三、脚本逻辑解说

整体脚本逻辑为分为7步走:
-
获取当前记录ID
-
获取字段的值
-
根据图片URL获取图片数据,使用HTTP.get方法下载图片
-
获取当前日期和时间,格式为 “yyyyMMddhhmmss”
-
另存自定义打印文件模板
-
修改文件内容并导出为图片或PDF
-
存档到指定多维表格字段中
这次就重点讲解下第2步获取字段的值中联系人字段的原理,其余步骤可翻阅先前文章了解详情哟~
参考WPS开放平台开发指南https://open.wps.cn/documents/app-integration-dev/guide/dbsheet/Api/ContactField_getValue在脚本编辑器运行这行代码
Application.Sheets(SheetName).Views(ViewName).RecordRange(RecordId, “@联系人”).Value;
可以看到输出信息有userId、nickname、avatarUrl、companyId等信息

但我们想要的只是联系人的昵称,多人的话就输出类似张三李四这样的格式,并不需要这么长的一大串信息,这时候我们该怎么做呢?用自然语言描述,就是如果有多个联系人,那就一个联系人一个联系人地来,重复操作提取联系人的昵称,最后组成一个文本
一个联系人一个联系人地来,重复操作,其实等同于for循环提取联系人的昵称,就是要获取nickname的值,而nickname在value的_core下面最后组成一个文本,就是使用间隔符将每个nickname拼接成一个字符串
写成代码就是下面这段
const value2 = Application.Sheets(SheetName).Views(ViewName).RecordRange(RecordId, "@联系人").Value;console.log("当前记录【联系人】字段的值:", value2);let nicknames = []; // 存储所有nickname的数组let nicknameString = "";// 检查value对象和_core数组是否存在if (value2 && value2._core && Array.isArray(value2._core)) {// 使用for循环遍历_core数组for (let i = 0; i < value2._core.length; i++) {const contact = value2._core[i];// 检查contact对象和nickname字段if (contact && contact.nickname) {nicknames.push(contact.nickname);} else {console.warn(`第${i+1}个联系人的nickname字段为空或不存在`);}}// 输出结果console.log("提取的昵称列表:", nicknames);nicknameString = nicknames.join(",");console.log("昵称字符串:", nicknameString);} else {console.error("联系人数据格式异常,无法提取nickname");}

四、脚本编辑器整体输出情况

如果想要直接运行脚本,需要先选择某一行记录哦因为脚本内容不是批量处理所有记录的,所以不指定行记录,脚本是不知道要处理的是哪一行,结果自然而然就是报错啦


选择某一行记录运行脚本后,脚本编辑器输出结果如下:



五、自动化流程设置

两步走,触发条件+执行脚本就搞定啦



六、动图演示

1、选择某行记录然后运行脚本

2、修改记录触发自动化流程


七、注意事项

1、图片和附件字段仅支持本地文件上传,如果是从云文档上传的图片,图片识别结果返回“响应状态: 302”,大概率是因为访问这张图片需要WPS账号申请访问权限,可以登录另一个账号去尝试访问这张图片URL试试看哟o(∩_∩)o

2、图片和附件字段仅支持获取第一张图片,如果字段有多张图片,默认只获取第一张图片哦因为脚本代码就是这么设计滴(任性一回下次再改o(∩_∩)oconst value3 = Application.Sheets(SheetName).Views(ViewName).RecordRange(RecordId, “@图片和附件”).Value.Value[0].ThumbnailsUrl;

八、奇怪现象

在调试脚本的过程中发现了一个奇怪现象
虽然不知道啥原因但先记着
没准千年之后会有人告诉俺答案捏ψ(`∇´)ψ
如果很不巧,联系人中有昵称以特殊字符开头那将联系人字段内容拼接成字符串后保存在nicknameString变量
脚本中将该变量写入Excel表格 E4单元格时的代码前方需多加个字符,如空格,脚本才能顺利执行
file.Application.ActiveSheet.Range(‘E4’).Value = ` ${nicknameString}`;
副作用就是表格中有多余空格
单元格上方绿色倒三角有点显眼(强迫症表示忍不了一点(#゚Д゚)
浅浅测试了下如果联系人昵称以特殊字符开头,如“ -.-“,不加空格的话会报错,加了就平安无事啦如果联系人昵称以文本开头,那不加空格也可以,主打一个无所畏惧↖(^ω^)↗



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









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