1. 邮件操作
1.1 前期准备
商店中找到outlook的sdk,添加到build中
在process中添加outlook的SDK
电脑上装了outlook的邮箱并且已经登录
我用个人foxmail邮箱向outlook发了一封带附件的销售订单邮件,就以此作为例子
1.2 搜索邮件
搜索有两层,第一层是按邮箱属性搜索,第二层再按邮件属性搜索
第一层邮箱属性涉及的就是待搜索的邮箱账号、邮箱内的文件夹类型(Inbox,Draft,Junk)、邮箱内文件夹名
对搜索到的结果可以根据收信时间和邮件标题做升序或降序排序
第二层邮件属性搜索就可以根据邮件的特征进行搜索
邮件搜索标准datatype:https://help.sap.com/doc/e57d7b179db649e6b5f2d26d9894f9d9/Cloud/en-US/datatypes/emailSearchCriterion.html
这里就按包含Files of Sales Order的标题的邮件进行搜索了
若需遍历邮箱邮件则如下图所示
1.3 保存邮件附件
简单来说就是在原本遍历邮件的基础上,加上保存附件的操作
下载前最好根据index去动态创建文件夹以区分不同的邮件,常规操作是在指定的文件夹目录下,创建年月日文件夹,再创建索引文件夹,每次执行前将索引文件夹清空
保存附件时填入刚才创建的文件夹即可,可以根据文件后缀过滤所需的文件类型
1.4 读取邮件+保存附件(代码方式)
代码也并不复杂
// 打开outlook 进程
irpa_outlook.application.openOutlook();// 搜索参数
var ls_searchCriteria = {searchCriterionList : [ { element: "subject", operand: "contains", value: "Files of Sales Order" }],folderType: "olFolderInbox"
};// 搜索邮件
irpa_outlook.email.search( ls_searchCriteria );// 检查邮件是否存在,若存在则持续遍历
var lv_index = 0;
while( irpa_outlook.email.context.isContextCurrentEmailExist() ){// log 标题irpa_core.core.log( irpa_outlook.email.emailItem.properties.getSubject() );// 创建文件夹irpa_core.fs.folder.create( "C:\\Users\\41078\\Desktop\\" + "销售订单" + lv_index );// 保存邮件irpa_outlook.email.emailItem.saveAllAttachments( "C:\\Users\\41078\\Desktop\\" + "销售订单" + lv_index );// 转到下一封邮件irpa_outlook.email.context.getNext();lv_index += 1;}irpa_outlook.application.closeOutlook();
1.5 参考文档
irpa outlook sdk:
https://help.sap.com/doc/e57d7b179db649e6b5f2d26d9894f9d9/Cloud/en-US/SDKdocumentation.html
irpa中使用邮件:
https://developers.sap.com/tutorials/spa-extend-outlook-automation.html
2. Excel 操作
2.1 前期准备
在商店中找到excel的SDK,Add到Build中,但是一般excel的sdk是默认添加的
在process中添加excel的SDK
预先准备一个excel文档,存放在本地电脑上,作为待操作的excel数据源
2.2 创建data type
需要一个data type来存放从excel中读取到的数据
通过右上角的import excel file可以根据excel内容快速创建data type,结果如果type有异常的话还是需要手动微调一下
2.3 读取excel(传统方式)
传统方式和新方式区别不大,主要的点在读取excel数据至变量中时,新方法操作起来更简单,先从传统方式开始
主要步骤如下:打开excel进程,打开目标excel,激活目标工作簿,计算行列范围,读取行列范围,赋值给目标二维数组
2.3.1 初始化变量
为方便测试,创建结构ty_excel_config用于存储excel信息
同时创建结构为ty_data的lt_data用于存储excel数据
2.3.2 操作excel
依次打开excel进程,打开excel
激活待使用的sheet页,获取使用的行和列,并放入ls_excel_config中存储
根据计算得到的行列数,转换为excel的行列,并用get values(Cells)获取读取的范围
稍微要写一点点代码,用来将数字列转换成字母列
入参数字列,出参字母列
/* 十进制转二十六进制再转char */
var col10 = col_count;
var col26 = "";// 依次除以26,直到十进制除完
while(col10 != 0){col26 = String.fromCharCode( ( col10 % 26 ) + 64 ) + col26; col10 = Math.floor( col10 / 26 );
}return col26;
2.3.3 读取excel结果至二维数组
把二维数组当成sap中的内表就好了
通过get values(cells)获取范围内的excel数据,最后会返回一个object的二维数组
通过foreach遍历行,再通过add item将行中的各元素赋值给输出的结果
最后要关闭excel工作簿和进程
测试结果正常
2.4 读取excel(新方式)
新方式的区别就在2.3.3这一步上面,可以将此节的步骤替换为2.3.3,两者均可
将excel cloud link拖拽至原先foreach的位置
这种方式说实话sap还能再优化一下,前面的步骤都是为了定位正在使用的最后一个单元格,如果能把这个痛点解决那么使用此方法会更方便
2.5 读取excel(代码方式)
以上的两种方式对于完全无经验的开发者来说相对友好,但如果会js的话在看完sap的sdk之后个人感觉可以通过代码方式来完成上述工作,相对来说简单很多
process中引入了数据类型,按理来说应该在sdk中有对应的语法可以去使用数据类型,但是实际上无法在script中声明之前创建过的数据类型,语法是typescript的,在script中编写后编译器也能识别其中的元素,但是控制台检查却不通过
let ls_data: $.ty_data;
必须引入相关数据类型的变量,才可以通过$访问到数据类型,但是控制台报错不给用,所以也没啥用处
由于没法在script中直接声明要使用的变量,只能通过入参的方式来传递指定数据类型的变量
然后参考sdk的文档写代码就可以了
var ls_excel_config = is_excel_config;
var lt_data = it_data;
var ls_data = is_data;// 打开excel进程,不显示,不报警告
irpa_excel.application.newExcelInstance( false , false );// 打开workbook
irpa_excel.workbook.openExistingWorkbook( ls_excel_config.path );// 激活sheet
irpa_excel.worksheet.activateWorksheet( ls_excel_config.sheet );// 获取行列索引
ls_excel_config.row_count = irpa_excel.worksheet.range.getUsedRangeRow();
ls_excel_config.col_count = irpa_excel.worksheet.range.getUsedRangeColumn();// 列数字索引转字母索引
// 依次除以26,直到十进制除完
var lv_col_count_char = "";
var lv_col10 = ls_excel_config.col_count;
var lv_col26 = "";
while(lv_col10 != 0){lv_col26 = String.fromCharCode( ( lv_col10 % 26 ) + 64 ) + lv_col26; lv_col10 = Math.floor( lv_col10 / 26 );
}lv_col_count_char = lv_col26;// 获取range信息
var lt_object = irpa_excel.worksheet.getValues( "A2:" + lv_col_count_char + ls_excel_config.row_count );
irpa_core.core.log( lt_object );// any类型转换为数组,再遍历给数据类型ty_data
var la_object = [];
var la_el = [];
la_object = lt_object;
la_object.forEach( el => {la_el = el;ls_data.orderNumber = la_el[0];ls_data.orderAmount = la_el[1];ls_data.orderDate = la_el[2];ls_data.shippingCountry = la_el[3];ls_data.expectedDeliveryDate = la_el[4];ls_data.orderStatus = la_el[5];irpa_core.list.addItem( lt_data, ls_data );
} );irpa_core.core.log( lt_data );// 关闭excel进程
irpa_excel.application.closeExcel( );return lt_data;
个人感觉用代码的方式处理对程序员更友好一些,也不会因为流程过于冗长而导致可读性变差,上述的代码块完整把之前的流程实现了,但实际的业务上可以分割成几个小的function script以实现模块化,视情况而定可能也需要混入一些活动(比如关于ui的操作,这部分靠活动更容易实现)
2.6 参考文档
irpa excel SDK:
https://help.sap.com/doc/b8b5c9bbac3846a0a57aedab3f412880/Cloud/en-US/SDKdocumentation.html
irpa core SDK:
https://help.sap.com/doc/77f2293985d7420aabecc0c8d0647e46/Cloud/en-US/SDKdocumentation.html
在irpa中使用微软产品:
https://developers.sap.com/group.spa-ms-office.html
https://developers.sap.com/tutorials/spa-create-excel-automation.html
3. Word操作
3.1 前期准备
使用word的自动化的场景比较少,如果要使用的话是一般是根据模板将数据插入到模板的指定位置,但是目前build的word包只支持根据bookmark插入文本,图片表格类的复杂数据完全不支持
先准备一份简单的word模板,如下图所示,使用bookmark标记待插入数据的指定位置
在store中添加word的sdk
在流程中添加word的依赖
3.2 插入文本
总体的流程如下,关于word的所有活动其实就截图这些,可以看到支持的操作并不多
先将模板copy为新文件,打开新文件,向各个bookmark处插入数据,保存并关闭word即可
主要用到的就是set bookmark value,根据bookmark的位置插入数据
还有一段在js中获取当前日期的函数代码
// 获取yyyy-MM-dd格式数据var date = new Date();
var seperator1 = "-";
var year = date.getFullYear();
var month = date.getMonth() + 1;
var strDate = date.getDate();
if (month >= 1 && month <= 9) month = "0" + month;if (strDate >= 0 && strDate <= 9) strDate = "0" + strDate;var currentdate = year + seperator1 + month + seperator1 + strDate;
return currentdate;
最后结果如下
4. 资源下载
上述流程可从百度网盘下载
链接:https://pan.baidu.com/s/18csw1TNAIYnIkL7mU7UuRA?pwd=SEEL
提取码:SEEL