利用Python拒绝重复工作,每周的项目进度还是自动发送的好

2020-02-26 16:51:14 浏览数 (1)

在家远程办公的第二周,各种汇报邮件满天飞

背景

由于远程办公的原因,很多口头汇报或者会议同步的事项都需要邮件或者书面的方式进行汇报了。

往往领导的要求是‘苛刻’的,要求每天要发送XXXX的报表,每周又要发送XXXX的周报,作为一位有理想的码农,我的内心是拒绝的。

所以每天的工作周报,每周的项目进度等等标准化的汇报事项,我都通过自动化脚本的方式进行处理。

想法

通常衡量一件事是否可以用脚本实现,主要看能否标准化和重复使用次数。也就是说,经常要重复要做的标准化的事项可以用自动化的脚本去代替,往往这样的操作可以提高自身的工作效率,这样你就可以有更多的时间去学习「浪」了。

像我目前遇到的,每天需要在群里汇报下今天的工作内容及进度,每周要发下项目的整体进度等等,完全可以使用自动化的脚本去处理。

一旦处理的好,对外的直观感受就是你比较专业和严谨,每天固定的时间汇报,时间一致,格式一致,从没有忘记过。是不是一举多得。

思路

既然有了想法,就要去实现,首先推荐Python,简单且搞笑,有点开发基础的基本很快上手,很快实现。

然后确定数据源,拿我的例子举例,目前我们公司用的腾讯的tapd,很多工作相关的需求,项目进度,BUG情况都能在tapd体现。

但领导往往很少看这些散列的数据,往往需要你定时整理一份指定格式的汇总报表,以邮件的方式发送给他,相信这样的需求大家经常碰到。

既然需求出现了,那就让代码解决吧。

这里以我每周要发送一份项目进度为例,目标Excel如下格式:

截图1

数据源是在tapd中,目标产物也有了,剩下的无非就是获取数据源的数据,然后转换成对应的目标产物,最后通过邮件的方式发送给目标用户。

python实现

主要用了下面三个核心库,分别用来获取数据,生成Excel,发送邮件。

代码语言:javascript复制
#用于调用API获取数据源
import requests
#用于生成Excel
import xlsxwriter
#用于调用exchange发送邮件
from exchangelib import Credentials, Account

几个核心库的基础用法这里就不多说了,官方文档和网上的教程也一大堆。

基本上这类需求都是三个步骤,首先通过requests来获取你的目前数据,不管是有官方API,还是通过爬虫爬取的方式,当然后API是最好的,比较简单,像tapd就提供了相应的API,简单调用就能获取到数据。

代码语言:javascript复制
'''
    调用API获取tapd需求内容
'''
def getTapdStories(ids):
    url='{0}?limit=200&workspace_id={1}&id={2}'.format(TAPD_API,WORKSPACE_ID,ids)
    request=requests.get(url,headers = HEADERS)
    response = request.json()['data']
    return response

接着就是将目标数据转换成你需要的数据,这里tapd的任务会无限嵌套,所以搞了个递归获取到最小粒度的任务信息:

代码语言:javascript复制
'''
    递归获取最小粒度的任务信息
'''
def getTaskData(id,programName,moduleName,moduleId):
    taskData=[]
    response=getTapdStories(id)
    if isinstance(response,list)==False:
        story=response['Story']
        strChildrenId=story['children_id']
        if  strChildrenId =='|':
            taskData.append(buildData(story,programName,moduleName,moduleId))
        else:
            strChildrenId=strChildrenId[2:].replace('|',',')
            taskData.extend(getTaskData(strChildrenId,programName,moduleName,moduleId))
    else:
        for story in response:
            story=story['Story']
            strChildrenId=story['children_id']
            if  strChildrenId =='|':
                taskData.append(buildData(story,programName,moduleName,moduleId))
            else:
                strChildrenId=strChildrenId[2:].replace('|',',')
                taskData.extend(getTaskData(strChildrenId,programName,moduleName,moduleId))
    return taskData

然后利用xlsxwriter将目标数据生成Excel:

代码语言:javascript复制
workbook = xlsxwriter.Workbook('test.xlsx')
worksheet = workbook.add_worksheet('sheet1')
#写入表头
worksheet.write_row('A1',EXCEL_TABLE_HEADER_NAME,titleStyle)
#设置列宽
for index in range(len(EXCEL_TABLE_HEADER_WIDTH)):
        worksheet.set_column(index,index,EXCEL_TABLE_HEADER_WIDTH[index])
#填充数据
for index in range(len(excelData)):
        worksheet.write_row(index 1,0,excelData[index],defaultStyle)

#合并单元格      
for index in range(len(merageData)):
        worksheet.merge_range(i, 1, merageData[index]['merageCount'] i-1,1,merageData[index]['moduleId'][-7:], cell_format=defaultStyle)
        i =merageData[index]['merageCount']
workbook.close()

最后通过exchangelib发送邮件:

代码语言:javascript复制
def sendMail(htmlBody, day, account):
    m = Message(
        account=account,
        subject=SUBJECT.format(day),
        body=HTMLBody(htmlBody),
        to_recipients=TO
    )
    m.send_and_save()

总结

由于涉及到公司内部的一些敏感信息,所以不能贴完整的代码,但整体思路基本如上面所说,熟练使用上面的几个组件,相信大部分类似的需求都能轻松搞定。

最后还是想说,还是要学会偷懒,重复的事情千万不能将就,也许发个周报每天只要几分钟,但一天天积累下来,所花的时间还是不少的,不如花点时间,搞点创新,把时间花在更有的意义的事情上。

0 人点赞