博客:www.jiaopengzi.com

焦棚子的文章目录

请点击下载附件

一、背景

钉钉办公给很多企业带来了很多方便,比如审批流线上化,通用化。线上化填写后,数据自动获取又是一个硬伤了,虽然数据可以下载,但我们要自动刷新数据怎么办呢?

结合Power BI做一个自动刷新,和Power BI打通,美滋滋。

推荐阅读:Power Query之获取钉钉日志自动刷新Power BI报告

二、数据结构

为了方便演示,新建一个审批流模板。

标题:收款审批

字段:客户姓名、收款方式、收款金额(元)、备注

测试审批流数据

审批后结果

三、上M

1、自定义函数Fxdingding_process

看到这一串不要慌,直接复制到自己的pq中保存为Fxdingding_process即可。

let
fx=(AppKey as text ,AppSecret as text,Month as date,ProcessCode as text ) as table =>
let
token= Json.Document( Text.FromBinary(Web.Contents("https://oapi.dingtalk.com/gettoken?appkey="&AppKey&"&appsecret="&AppSecret)))[access_token],
UnixTimestampStart=Text.From(((Number.From(Month)-70*365-19)*86400-8*3600)*1000),
UnixTimestampEnd=Text.From(((Number.From(Date.EndOfMonth(Month))-70*365-19)*86400-8*3600)*1000+86399999), fxrl=(n as number,process_code as text)=>
let
fx=Json.Document(
Web.Contents("https://oapi.dingtalk.com/topapi/processinstance/listids?"
, [Query=[access_token=token]
,Content=Text.ToBinary("{'start_time':"&UnixTimestampStart&",'end_time':"&UnixTimestampEnd&",'process_code':'"&process_code&"','cursor':"&Text.From(n)&",'size':20}")
]
)
)[result][list]
in
fx, fxrt = (process_instance_id as text)=>
let
Rl=Json.Document(
Web.Contents("https://oapi.dingtalk.com/topapi/processinstance/get?"
, [Query=[access_token=token]
,Content=Text.ToBinary("{'process_instance_id':'"&process_instance_id&"'}")
]
)
),
records_spl=
if
List.Count(Rl[process_instance][operation_records]) >1
then
Rl[process_instance]
[
[business_id],
[create_time],
[originator_dept_name],
[result],
[originator_userid]
]&
Record.FromList(
List.Transform(Rl[process_instance][form_component_values],
(R)=> R[value]),
List.Transform(Rl[process_instance][form_component_values],
(R)=> R[name]) )
&Rl[process_instance][operation_records]{1}[[remark],[date]] else
Rl[process_instance]
[
[business_id],
[create_time],
[originator_dept_name],
[result],
[originator_userid]
]&
Record.FromList(
List.Transform(Rl[process_instance][form_component_values],
(R)=> R[value]),
List.Transform(Rl[process_instance][form_component_values],
(R)=> R[name]) )
&[remark=null,date=null]
in
records_spl, N= List.Count(List.Generate(()=>1,each List.Count( fxrl(_, ProcessCode))>0 ,each _+1)),
process_instance_id_list = List.Combine(List.Transform({1..N},each fxrl(_,ProcessCode))),
result= Table.FromRecords( List.Transform(process_instance_id_list,each fxrt(_)) ) in
result, metadata=[
Documentation.Name="钉钉审批数据获取函数:Fxdingding_process",
Documentation.LongDescription="AppKey:登录钉钉开放平台获得(需要组织管理员权限);AppSecret:登录钉钉开放平台获得(需要组织管理员权限);Month:表示要获取数据的月份的1号填写为:#date(2019,1,1);ProcessCode:表示审批模板的唯一编码,在审批模板编辑页的url中查看。"
] in
Value.ReplaceType(fx,Value.Type(fx) meta metadata)

2、自定义函数Fxdingding_process的说明

function(AppKey as text ,AppSecret as text,Month as date,ProcessCode as text) as table

AppKey:登录钉钉开放平台获得(需要组织管理员权限);

AppSecret:登录钉钉开放平台获得(需要组织管理员权限);

Month:表示要获取数据的月份的1号填写为:#date(2019,1,1),为什么要设置这个参数,因为钉钉api获取数据是由日期限制的,好像是180天,所以数据就按照每月获取的;

ProcessCode:表示审批模板的唯一编码,在审批模板编辑页的url中查看。

3、调用函数得到结果

4、以上,对于pq了解多一些人操作起来没有问题,接下来再把函数和字段名称管理一起封装,让更多对pq不是很了解的人直接拿来就用(详细见附件)

步骤1:配置《01名称管理》Excel文件表名、ID、表ID、原始名称、统一名称;

步骤2:配置好Power BI文件4个参数;

步骤3:直接一个简单的函数Fxtable得到结果,是不是非常简单。

四、总结

1、直接调用自定函数fxdingding输入四个参数,即可得到结果;

2、注意参数的格式,详见上图《结果》

3、AppKey、AppSecret 获取需要管理员权限并登录钉钉开放平台获得;

钉钉开放平台​

4、具体步骤见开发文档;

钉钉开发文档​

5、服务器公网出口IP名单要提前设置好,不然数据会跑不出来。

6、ProcessCode参数获取

by焦棚子

焦棚子的文章目录

141_Power Query之获取钉钉审批流自动刷新Power BI报告的更多相关文章

  1. 131_Power Query之获取钉钉日志自动刷新Power BI报告

    博客:www.jiaopengzi.com 焦棚子的文章目录 请点击下载附件 一.背景 最近在玩钉钉日志,企业填写简单数据后方便汇总到一起比较实用的工具,但数据填写以后还是需要下载日志报表,比较麻烦. ...

  2. 150_1秒获取Power BI Pro帐号

    博客:www.jiaopengzi.com 请点击[阅读原文]获取帐号 一.背景 当你来到这篇文章的时候,我想你已经在网上搜索了一圈了.网上有一大把教你如何注册Power BI帐号的方法,我们这里就不 ...

  3. 149_1秒获取Power BI Pro帐号

    一.背景 当你来到这篇文章的时候,我想你已经在网上搜索了一圈了.网上有一大把教你如何注册Power BI帐号的方法,我们这里就不在赘述了.因为各种因素的限制确实比较麻烦.我们直接提供Power BI ...

  4. 钉钉开发获取APPKEY, APPSECRET, CorpId和SSOSecret

    首先用自己的钉钉账号注册一个企业: https://oa.dingtalk.com/index.htm 一.获取应用APPKEY及APPSECRET方法: 1.登录钉钉开放平台创建应用: https: ...

  5. npm钉钉脚手架,支持考勤信息获取

    钉钉官方并未提供nodejs包,第一次调用接口的时候非常费事,而且尝试去寻找相关的钉钉考勤数据模块的时候只找到了一些消息啊,只能办公啊,免登啊之类的模块,有关考勤数据的似乎没有 关于dd的npm包中一 ...

  6. 钉钉相关功能介入开发系列一:获取access_token

    获取access_token的基本代码,与微信不同的是钉钉的token正常情况下有效期为7200秒,有效期内重复获取返回相同结果,并自动续期,比微信方便多了 //基本信息 string appkey ...

  7. WinForm调用钉钉获取考勤结果

    关注点: 1.钉钉AccessToken的获取和防止过期 2.使用TPL并行编程调用钉钉接口 需求详解 公司前台有个大屏,领导想显示全部员工的考勤结果统计情况和车间的实时监控视频,还有车间的看板.简单 ...

  8. 钉钉开发入门,微应用识别用户身份,获取用户免登授权码code,获取用户userid,获取用户详细信息

    最近有个需求,在钉钉内,点击微应用,获取用户身份,根据获取到的用户身份去企业内部的用户中心做校验,校验通过,相关子系统直接登陆; 就是在获取这个用户身份的时候,网上的资料七零八落的,找的人烦躁的很,所 ...

  9. 钉钉接口:获取accessToken和打卡记录【分享】

    post和get方法工具类:HttpUtils package weaver.dingtalk.utils; import com.alibaba.fastjson.JSONObject; impor ...

随机推荐

  1. canvas系列教程07-canvas动画基础1

    上面我们玩了一个图表,大家学好结构,然后在那个基础上去扩展各种图表,慢慢就可以形成自己的图表库了.也可以多看看一些国外的图表库简单的版本,分析分析,读代码对提高用处很大.我说了canvas两大主流用途 ...

  2. 设计模式之:抽象工厂模式AbstractFactoryPattern的实现

    相比于工厂模式,抽象工厂模式的每个工厂可以创建产品系列,而不是一个产品: 抽象工厂用到的技术:接口.多态.配置文件.反射: 抽象工厂模式的设计原则: 实现客户端创建产品和使用产品的分离,客户端无须了解 ...

  3. Android 遮罩层效果--制作圆形头像

    (用别人的代码进行分析) 不知道在开发中有没有经常使用到这种效果,所谓的遮罩层就是给一张图片不是我们想要的形状,这个时候我们就可以使用遮罩效果把这个图片变成我们想要的形状,一般使用最多就是圆形的效果, ...

  4. vue Element验证input提示

    <el-form-item prop="userName" class="userName_color"> <b>详细地址<i c ...

  5. 多条命令同时执行的包concurrently

    npm i concurrently use "script":{ "client:build": "webpack --config build/w ...

  6. phpshe xml注入

    *php商城系统 xml注入* **页面样式* *Xml原理参考:* https://www.cnblogs.com/20175211lyz/p/11413335.html *漏洞函数simplexm ...

  7. 序列化和反序列化为什么要实现Serializable接口?(史上最全、简单易懂)

    目录结 前言 1.什么是序列化和反序列化 2.什么时候需要进行序列化和反序列化 2.1.服务器和浏览器交互时用到了Serializable接口吗? 2.2.Mybatis将数据持久化到数据库中用到了S ...

  8. 01 | 堆、栈、RAII:C++里该如何管理资源?(极客时间笔记)

    基本概念 堆,英文是 heap,在内存管理的语境下,指的是动态分配内存的区域.这个堆跟数据结构里的堆不是一回事.这里的内存,被分配之后需要手工释放,否则,就会造成内存泄漏. C++ 标准里一个相关概念 ...

  9. 开源框架YiShaAdmin如何使用任务计划

    1.在Startup添加 new JobCenter().Start();(红色字体,下同) // This method gets called by the runtime. Use this m ...

  10. 《手把手教你》系列基础篇(九十三)-java+ selenium自动化测试-框架设计基础-POM设计模式实现-上篇(详解教程)

    1.简介 上一篇介绍了POM的基础理论知识和非POM方式写脚本,这篇介绍利用页面工厂类(page factory)去实现POM,通过查看PageFactory类,我们可以知道它是一个初始化一个页面实例 ...