场景:这样生成数据外链更简单、更丝滑

楼主
简道云应用场景探索者

【数据外链】是指可以将表单收集上来的数据中的某一条数据,通过将单条数据链接分享给组织架构以外的人员进行查看,以及修改或补录。

 

去年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)

添加时请备注:简道云

 

分享扩散:

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

返回顶部 返回列表