博客:www.jiaopengzi.com

焦棚子的文章目录
请点击下载附件

一、背景

最近在玩钉钉日志,企业填写简单数据后方便汇总到一起比较实用的工具,但数据填写以后还是需要下载日志报表,比较麻烦。

在做BI的时候,可不可以用pq(power query)获取这些数据同步更新呢?查阅钉钉开发文档,日志是可以通过api接口获取。

那么写个pq(power query)自定义函数获取即可。

二、数据结构

为了方便演示,新建一个日志填写模板。

标题:测试日志

字段:日期,测试项目,测试值

设计日志模板

填写测试数据

填写好的日志

三、上M

1、自定义函数Fxdingding

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

let
fx=(AppKey as text ,AppSecret as text,Month as date,RecodeName as text,NameList as list ) as table=>
let
token=Json.Document( Text.FromBinary(Web.Contents("https://oapi.dingtalk.com/gettoken?appkey="&AppKey&"&appsecret="&AppSecret)))[access_token],
//时间戳转北京时间===================================================
BeijingTime=(x as number) =>
let
t=DateTime.FromFileTime((11644473600000+x)*10000)
in
t,
//日期转换为时间戳===================================================
UnixTimestampStart=(m as date)=>
let
源 = ((Number.From(m)-70*365-19)86400-83600)*1000,
tf=Text.From(源)
in
tf,
//提供日期的月末最后一天转换为时间戳===================================
UnixTimestampEnd=(m as date)=>
let
t=Date.EndOfMonth(m),
st = ((Number.From(t)-70*365-19)86400-83600)*1000+86399999,
tf=Text.From(st)
in
tf,
//根据cursor获取每页recode===========================================
fxrl=(n as number,name as text)=>
let
fx=Json.Document(
Web.Contents(“https://oapi.dingtalk.com/topapi/report/list?”
,   [Query=[access_token=token]
,Content=Text.ToBinary("{‘start_time’:"&UnixTimestampStart(Month)&",‘end_time’:"&UnixTimestampEnd(Month)&",‘template_name’:’"&name&"’,‘cursor’:"&Text.From(n)&",‘size’:20}")
]
)
)[result]
in
fx,
//每页的recode转换成表===============================================
fxrt = (listr as list)=>
let
fx=Table.Combine(List.Transform(listr,®=> Table.FromRecords({Record.TransformFields( R,{“contents”, each  Record.FromList(Table.FromRecords()[value],Table.FromRecords()[key])})})))
in
fx,
//获取corsorlist====================================================
//其中100是个参数,表2000条数据,多数需求能满足,大约这个数用条数除以20得到向上取整数字替换100
corsorlist={0} & List.Distinct( List.Transform({1…100},(L)=>List.Accumulate({1…L},0,(x,y)=>
if y=1 then
Json.Document(Web.Contents(“https://oapi.dingtalk.com/topapi/report/list?”
,[Query=[access_token=token]
,Content=Text.ToBinary("{‘start_time’:"&UnixTimestampStart(Month)&",‘end_time’:"&UnixTimestampEnd(Month)&",‘template_name’:’"&RecodeName&"’,‘cursor’:"&Text.From(0)&",‘size’:20}")])
)[result][next_cursor]
else
Json.Document(Web.Contents(“https://oapi.dingtalk.com/topapi/report/list?”
, [Query=[access_token=token]
,Content=Text.ToBinary("{‘start_time’:"&UnixTimestampStart(Month)&",‘end_time’:"&UnixTimestampEnd(Month)&",‘template_name’:’"&RecodeName&"’,‘cursor’:"&Text.From(x)&",‘size’:20}")])
)[result][next_cursor]))
),
//获取每页数据的record组成datalist====================================
datalist = List.Transform(corsorlist,each fxrl(_,RecodeName)[data_list]),
//datalist转换成表===================================================
tables = Table.Buffer(Table.Combine(List.Transform(datalist,each fxrt(_)))),
//判断是否为空表,容错机制=============================================
TF=Table.IsEmpty(tables),//tables=#table({},{})
//用namelist展开recode得到表==========================================
展开 = if TF then #table(NameList,{}) else Table.ExpandRecordColumn(tables, “contents”, NameList),
//删除其他列得到目标列=================================================
删除 = Table.SelectColumns(展开,NameList)
in
删除,
metadata=[
Documentation.Name=“钉钉日志数据获取函数:Fxdingding”,
Documentation.LongDescription=“AppKey:登录钉钉开放平台获得(需要组织管理员权限);AppSecret:登录钉钉开放平台获得(需要组织管理员权限);Month:表示要获取数据的月份的1号填写为:#date(2019,1,1);RecordName:要获取的日志标题名称;NameList:日志的标题名称,使用list形式。”
]in
Value.ReplaceType(fx,Value.Type(fx) meta metadata)

2、自定义函数的说明

function(AppKey as text ,AppSecret as text,Month as date,RecodeName as text,NameList as list ) as table

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

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

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

**RecordName:**要获取的日志标题名称;

**NameList:**日志的标题名称,使用list形式。

自定义函数Fxdingding

3、调用函数得到结果

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

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

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

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

四、总结

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

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

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

钉钉开放平台​

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

钉钉开发文档​

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

6、由于每页20条数据限制,我们设置了获取2000条数据为上限,若数据超过这个限制,请参看自定义函数中说明,自行修改。

by焦棚子

焦棚子的文章目录

131_Power Query之获取钉钉日志自动刷新Power BI报告相关推荐

  1. 141_Power Query之获取钉钉审批流自动刷新Power BI报告

    博客:www.jiaopengzi.com 焦棚子的文章目录 请点击下载附件 一.背景 钉钉办公给很多企业带来了很多方便,比如审批流线上化,通用化.线上化填写后,数据自动获取又是一个硬伤了,虽然数据可 ...

  2. connect time out 获取token失败_Power Query之获取钉钉日志自动刷新Power BI报告

    焦棚子的文章目录 请点击下载附件 一.背景 最近在玩钉钉日志,企业填写简单数据后方便汇总到一起比较实用的工具,但数据填写以后还是需要下载日志报表,比较麻烦. 在做BI的时候,可不可以用pq(power ...

  3. python之钉钉机器人自动发消息——傻瓜式教程

    文章目录 python之钉钉机器人自动发消息--傻瓜式教程 前言 钉钉创建机器人 主要流程如下: 细节流程如下 python连接dingtalk 发送MarkDown格式消息 源码展示 效果展示 代码 ...

  4. 每个Power BI开发人员的Power Query提示

    If someone asks you to define the Power Query, what should you say? If you've ever worked with Power ...

  5. 1秒获取Power BI Pro帐号

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

  6. 钉钉E应用自动登录获取用户信息总结

    钉钉自动登录需要两个东西: 一个是access_token(访问令牌),一个是code(免登录授权码). (企业应用和个人应用的免登授权码均可通过该JSAPI获取.) dd.getAuthCode({ ...

  7. python获取钉钉日志数据_python3实现zabbix告警推送钉钉的示例

    自己写了一个简单的python脚本,用来推送zabbix告警到钉钉机器人,推送格式为markdown,有需要的可以自己修改markdown的格式及推送的值(zabbix宏) 环境如下,理论上zabbi ...

  8. 打通钉钉+WebHook:日志服务告警升级

    摘要: 用一个最最常用的案例(Nginx日志分析)来说明当前使用场景,告警要解决的3个问题:是否有错误:是否有性能问题:是否有流量急跌或暴涨 阿里云日志服务是针对实时数据一站式服务,用户只需要将精力集 ...

  9. 钉钉api 获取 accesstoken_钉钉开放平台第三方 Python SDK,快速实现钉钉API开发

    dingtalk-sdk 是一个钉钉开放平台的第三方 Python SDK, 实现了 企业内部开发 和 应用服务商(ISV)的 API. 企业内部开发 建议在使用前先阅读 钉钉开放平台文档 消息实体 ...

最新文章

  1. AI一分钟 | “钢铁侠”马斯克冒冷汗直面跳票尴尬;Apollo2.0确定下个月初出征美国,李彦宏发力全球梦
  2. If using all scalar values, you must pass an index
  3. cisco与h3c的console、vty配置比较
  4. cgi web 调用多次启动_CGI、FastCGI和PHPFPM有什么关系呢?
  5. 软件工程python就业方向-软件工程实践总结
  6. SVD在推荐系统中的应用详解以及算法推导
  7. go run go build go install 命令解释
  8. gnuradio 使用eclipse 编辑器记录
  9. 如何把 Word 中的表格快速插入 LaTeX?
  10. c语言实现--不带头结点的单链表操作
  11. 【干货】实用案例|产品设计中的恰到好处
  12. MyEclipse配置Tomcat没有Tomcat选项没有小猫图
  13. 进击吧! Blazor !第四期 组件开发
  14. Panasonic Programming Contest (AtCoder Beginner Contest 195) 题解
  15. tar.gz及tar.bz2两种常见格式的打包压缩及解压方法
  16. Flutter BuildOwner之inactive Elements浅析
  17. 190.颠倒二进制位
  18. 网售鞋王Zappos的戏剧性成功:做到极致
  19. UA MATH524 复变函数 用保形映射解Laplace方程的边值问题
  20. cmf5 excel 导入

热门文章

  1. 草稿 断开式绑定combobox 1128
  2. sublime编辑器下载与安装过程 2020
  3. 18-mysql-数据类型
  4. python-内存中的那些事儿-变量-函数-类
  5. jquery-只对新用户弹一次窗
  6. 理解*arg 、**kwargs
  7. ipvs,ipvsadm的安装及使用
  8. C++头文件,预处理详解
  9. ANT打包时记录本地版本SVN信息
  10. 面试官系统精讲Java源码及大厂真题 - 39 经验总结:不同场景,如何使用线程池