WPS AirScript脚本合集(二三):联系人字段内容文件存档
Lv.2潜力创作者
一、多维表格数据表及字段结构
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. 获取当前记录ID
const 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);
(完整脚本内容请前往微信公众号文章观看,指路链接https://mp.weixin.qq.com/s/Tg1Zgex5Mfox5KbEbRviIw)因文章5000字数限制,脚本代码做部分删减,完整脚本代码见微信公众号文章:https://mp.weixin.qq.com/s/Tg1Zgex5Mfox5KbEbRviIw
三、脚本逻辑解说
整体脚本逻辑为分为7步走:
获取当前记录ID
获取字段的值
根据图片URL获取图片数据,使用HTTP.get方法下载图片
获取当前日期和时间,格式为 "yyyyMMddhhmmss"
另存自定义打印文件模板
修改文件内容并导出为图片或PDF
存档到指定多维表格字段中
这次就重点讲解下第2步获取字段的值中联系人字段的原理,其余步骤可翻阅先前文章了解详情哟~
WPS AirScript脚本合集(十七):瞬时归档!多维表格结合脚本自动存档成图片、PDF、表格文件
参考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、图片和附件字段仅支持本地文件上传,如果是从云文档上传的图片,图片识别结果返回“响应状态: 302”,大概率是因为访问这张图片需要WPS账号申请访问权限,可以登录另一个账号去尝试访问这张图片URL试试看哟o(∩_∩)o
2、图片和附件字段仅支持获取第一张图片,如果字段有多张图片,默认只获取第一张图片哦
因为脚本代码就是这么设计滴(任性一回下次再改o(∩_∩)o
const value3 = Application.Sheets(SheetName).Views(ViewName).RecordRange(RecordId, "@图片和附件").Value.Value[0].ThumbnailsUrl;
八、奇怪现象
在调试脚本的过程中发现了一个奇怪现象
虽然不知道啥原因
但先记着
没准千年之后会有人告诉俺答案捏ψ(`∇´)ψ
如果很不巧,联系人中有昵称以特殊字符开头
那将联系人字段内容拼接成字符串后保存在nicknameString变量
脚本中将该变量写入Excel表格 E4单元格时的代码前方需多加个字符,如空格,脚本才能顺利执行
file.Application.ActiveSheet.Range('E4').Value = ` ${nicknameString}`;
副作用就是表格中有多余空格
单元格上方绿色倒三角有点显眼
(强迫症表示忍不了一点(#゚Д゚)
浅浅测试了下
如果联系人昵称以特殊字符开头,如“ -.-“,不加空格的话会报错,加了就平安无事啦
如果联系人昵称以文本开头,那不加空格也可以,主打一个无所畏惧↖(^ω^)↗