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