使用Python拒绝重复性工作,每周项目进度依旧自动发送或书面汇报。往往领导的要求很“苛刻”,要求每天发XXXX报告,每周发XXXX周报。作为一个理想的码农,我内心是拒绝的。因此,每天的工作周报、每周的项目进度等标准化的汇报项目,都由自动化脚本处理。idea通常衡量一个东西能否用脚本来实现,主要是在标准化和复用方面。换句话说,经常需要重复的标准化项目可以用自动化脚本代替。经常这样的操作可以提高你的工作效率,让你有更多的时间去学“浪”。像我目前遇到的,需要每天在群里汇报今天的工作内容和进度,每周发送项目整体进度等等,这些都可以通过自动化脚本来处理。一旦处理好,给外界的直观感觉就是你更专业、更严谨,每天固定时间汇报,时间一致,格式一致,过目不忘。不是服务于多种目的。既然有了想法,就得去实现它。首先推荐Python,简单有趣。稍有开发基础,即可快速上手,快速实现。然后确定数据源。以我的例子为例。目前我们公司使用的是腾讯的tapd。很多工作相关的需求、项目进度、BUG情况都可以在tapd中体现出来。但是,领导往往很少看这些经过哈希处理的数据,往往会要求你定期按照规定的格式整理一份总结报告,通过邮件发给他。相信您经常会遇到这样的需求。既然需求出现了,就让代码来解决吧。这里我想以每周发一个项目进度为例。目标Excel格式如下:数据源在tapd,目标产品也有。剩下的无非就是获取数据源的数据,然后转换成对应的目标产品。最后通过邮件发送给目标用户。python实现主要使用了以下三个核心库,分别用于获取数据、生成Excel、发送邮件。#用于调用API获取数据源导入请求#用于生成Excelimportxlsxwriter#用于调用exchange发送邮件fromexchangelibimportCredentials,Account几个核心库的基本用法这里就不多说了,官方文档和网上教程也很多。基本上,此类需求分为三个步骤。首先通过requests获取你当前的数据,有没有官方的API或者通过爬虫爬取。当然API最好,比较简单,比如tapd提供了相应的API,简单调用即可获取数据。'''调用API获取tapd所需内容'''defgetTapdStories(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']returnresponse接下来就是将目标数据转换成你需要的数据。这里tapd任务会无限嵌套,所以递归获取到最小粒度的任务信息'''递归获取最小粒度的任务信息'''defgetTaskData(id,programName,moduleName,moduleId):taskData=[]response=getTapdStories(id)ifisinstance(response,list)==False:story=response['Story']strChildrenId=story['children_id']ifstrChildrenId=='|':taskData.append(buildData(story,programName,moduleName,moduleId))else:strChildrenId=strChildrenId[2:].replace('|',',')taskData.extend(getTaskData(strChildrenId,programName,moduleName,moduleId))else:对于故事响应:故事=story['Story']strChildrenId=story['children_id']如果strChildrenId=='|':taskData.append(buildData(story,programName,moduleName,moduleId))其他:strChildrenId=strChildrenId[2:].replace('|',',')taskData.extend(getTaskData(strChildrenId,programName,moduleName,moduleId))返回taskData然后使用xlsxwriter生成目标数据到Excel中,workbook=xlsxwriter.Workbook('test.xlsx')worksheet=workbook.add_worksheet('sheet1')#writetableheaderworksheet.write_row('A1',EXCEL_TABLE_HEADER_NAME,titleStyle)#设置索引范围内的列宽(len(EXCEL_TABLE_HEADER_WIDTH)):worksheet.set_column(index,index,EXCEL_TABLE_HEADER_WIDTH[index])#filldataforindexinrange(len(excelData)):worksheet.write_row(index+1,0,excelData[index],defaultStyle)#mergecellsforindexinrange(len(merageData)):worksheet.merge_range(i,1,mergeData[index]['merageCount']+i-1,1,merageData[index]['moduleId'][-7:],cell_format=defaultStyle)i+=merageData[index]['merageCount']workbook.close()最后通过exchangelib发送邮件:defsendMail(htmlBody,day,account):m=Message(account=account,subject=SUBJECT.format(day),body=HTMLBody(htmlBody),to_recipients=TO)m.send_and_save()由于公司内部的一些敏感问题进行总结资料,所以没法贴出完整的代码,但是总体思路基本上就是上面说的。相信通过熟练使用以上组件,大部分类似的需求都可以轻松处理。最后还是想说,我还是要学会偷懒,把事情重复一千次不要放过,也许发个周报只需要几分钟,但还是要花很多时间日积月累。不如花点时间,做点创新,把时间花在更有意义的事情上。
