【数据外链】是指可以将表单收集上来的数据中的某一条数据,通过将单条数据链接分享给组织架构以外的人员进行查看,以及修改或补录。
去年11月份在参加【插件开发大赛】时,做过一个功能,可以生成数据的内链外链,但因无法直接获取到数据ID,故而需要将数据导出后,再进行提取,这样就造成整个使用流畅度会打折扣。
年前时,突然有思路,对此做了一些尝试,因时间问题只做了一部分,假期时又进行了进一步完善,目前结果基本可以满足日常场景。
先来了解一下数据外链:
基本样式:
https://jiandaoyun.com/l/63bb0e658a8170000a******/d/63cbe0158b97c80007******
基本构成:
黑色字体部分为固定内容
红色字体部分为表单ID
蓝色字体部分为数据ID
注:以分享中的数据外链内容为准
获取路径:
表单ID > 可以通过插件或前端事件获取
数据ID > 可以通过智能助手获取或导出数据获取
注:非仅以上途径
面临问题:
在当前的数据ID获取方式中,系统暂不支持自动回填至表单,那么可以通过什么方式来解决?
解决思路:
1、批量导出,提取数据ID后,批量导入;
2、在智能助手中发送短信,然后手动录入;
3、在智能助手中发到邮箱里,然后手动录入;
4、整一个服务器,存数据,然后调取;
5、打开每一条数据,复制下外链,然后手动录入。
以上方式基本上都会面临“手动录入”或“额外成本”的问题 ,如果是低频低数据量时尚可,一旦数据量较多,或者说,对及时性有要求,当前的方式就满足不了了。
本次的实现方案
测试链接:
https://tnvew1vqtq.jiandaoyun.com/f/63cbc830b4bbe90008356473
实现逻辑:
本次的实现方案核心为将邮箱作为一个第三方存储。
1、当A表单有新数据提交时,触发智能助手,将数据ID等内容发送到邮箱里;
2、在B表单中,通过插件或其它方式,将数据ID等,从邮箱中提取出来;
3、通过公式或者插件等方式生成数据外链。
为保证一致性,同时发送的内容有:数据唯一标识(可以通过UUID生成)、表单ID、数据ID;
后续,可以查阅外链,或者批量生成后由智能助手修订至原表单,对于及时性,亦可通过子流程、弹出窗口等方式来解决。
参考代码:
内容来源:https://www.lmlphp.com/user/19443/article/item/548922/
代码用途:参考及制作插件,从邮箱中提取所需内容
# -*- coding: utf-8 -*-
from email.parser import Parser
from email.header import decode_header
from email.utils import parseaddr
import poplib
#输入邮件地址, 口令和POP3服务器地址:
email = input('Email: ')
password = input('Password: ')
pop3_server = input('POP3 server: ')
def guess_charset(msg):
charset = msg.get_charset()
if charset is None:
content_type = msg.get('Content-Type', '').lower()
pos = content_type.find('charset=')
if pos >= 0:
charset = content_type[pos + 8:].strip()
return charset
def decode_str(s):
value, charset = decode_header(s)[0]
if charset:
value = value.decode(charset)
return value
def print_info(msg, indent=0):
if indent == 0:
for header in ['From', 'To', 'Subject']:
value = msg.get(header, '')
if value:
if header=='Subject':
value = decode_str(value)
else:
hdr, addr = parseaddr(value)
name = decode_str(hdr)
value = u'%s <%s>' % (name, addr)
print('%s%s: %s' % (' ' * indent, header, value))
if (msg.is_multipart()):
parts = msg.get_payload()
for n, part in enumerate(parts):
print('%spart %s' % (' ' * indent, n))
print('%s--------------------' % (' ' * indent))
print_info(part, indent + 1)
else:
content_type = msg.get_content_type()
if content_type=='text/plain' or content_type=='text/html':
content = msg.get_payload(decode=True)
charset = guess_charset(msg)
if charset:
content = content.decode(charset)
print('%sText: %s' % (' ' * indent, content + '...'))
else:
print('%sAttachment: %s' % (' ' * indent, content_type))
# 连接到POP3服务器:
server = poplib.POP3_SSL(pop3_server, 995)
# 可以打开或关闭调试信息:
server.set_debuglevel(1)
# 可选:打印POP3服务器的欢迎文字:
print(server.getwelcome().decode('utf-8'))
# 身份认证:
server.user(email)
server.pass_(password)
# stat()返回邮件数量和占用空间:
print('Messages: %s. Size: %s' % server.stat())
# list()返回所有邮件的编号:
resp, mails, octets = server.list()
# 可以查看返回的列表类似[b'1 82923', b'2 2184', ...]
print(mails)
# 获取最新一封邮件, 注意索引号从1开始:
index = len(mails)
resp, lines, octets = server.retr(index)
# lines存储了邮件的原始文本的每一行,
# 可以获得整个邮件的原始文本:
msg_content = b'\r\n'.join(lines).decode('utf-8')
# 稍后解析出邮件:
msg = Parser().parsestr(msg_content)
print_info(msg)
# 可以根据邮件索引号直接从服务器删除邮件:
# server.dele(index)
# 关闭连接:
server.quit()
本次思考:
1、目前来看,数据外链可能尚是一个小众场景,它的更多场景可能会在,深度了解微信OpenID 以及 对微信场景有一定性探索之后。
2、本次案例,只是在邮箱中存储与提取数据ID等,那么有没有可能存更丰富的内容,将邮箱作为一个中转站,以桥接更多场景。
3、之前发过一个【自定义邮件通知+手机邮箱】的帖子,道友 @静默 做了更深一步的探索,结合联通沃邮,在微信环境中实现了更为便捷、稳定的消息通知,有兴趣的朋友可以再深入探索下。
更多内容:
更多沟通交流可添加微信(zmlnow)
添加时请备注:简道云
|