はじめに
最近現場でRPAをシステムのテストツールとして導入するということで、1ヶ月ほど触れてみました。
一応プログラマなので、プログラミング視点から見た、できることできないことなど、気づきをまとめておこうと思います。
結論からいうと、、、
ざっくりした感想ですが、プログラムでやるほとんどのことは、RPAで置き換えられそうという印象です。
ただ、RPA操作中にほかの作業ができないことや、プログラムの実行スピードに比べたら実行速度が遅いこと、意外と学習コストが高いことなど、実際に導入するにはいろいろと検討が必要そうです。
こんなツール作るの、プログラムで作ったほうが早いじゃん!!って私は最初に思いました(笑)
ただ、プログラミングしたことない人でも、プログラムが簡単に作れちゃうっていう意味では
敷居が低くて良いかもしれません。
RPAってなに?
「ロボティック・プロセス・オートメーション」の略です。
パソコンで行う作業(プロセス)を自動化するツールです。
「ノーコード/ローコード開発」などと呼ばれており、プログラミング知識がなくても、基本的アクションを組み合わせてフローを作ることができます。
<使用する例>
・毎日のPCで行う定例作業(日報を書く、勤怠登録をする、アラートメールを送信するなど)
・EXCEL資料の作成(定例のもの)
RPAツールの種類
この記事で紹介するのは、Microsoft社製品の「Power Automate Desktop」(通称、PAD)です。
他各社商品ありますが、Windows10の標準搭載になるらしいので、これから需要が伸びてくるかなと思います。
他商品では、UiPathとかが有名です。
私が使っているのは無償版ですが、だいたいのことができます。
個人で使用する分にはこちらで十分かと思います。
ただ、有償版だと、他ユーザとフローの共有ができたり、アクションから他のアクションをよべたりするみたいです。
ちなみに、PADで使用されているのは、ROBINと呼ばれるプログラム言語で、画面からは見えないですが、フローをコピー、メモ帳に貼り付けなどしてコードを確認することができます。
RPAでできる・できないこと(気づいたこと)
1. 変数の生成時に、型を明示する必要がない。
※他言語でのプログラミングほと意識しなくてもよいので楽!
変数生成時に設定する初期値の内容に応じて型が決定されます。
ただし、「アクション」を用いて明示的に型変換するとき(「テキストを数値に変換」、「Datatimeをテキストに変換」等)は、その変換前の指定の型の変数を設定しないとエラーになるので注意しましょう。
エラー例)
Number 変数に3を設定
「テキストを数値に変換」でテキストにNumber(数値型)を指定する
⇒Numberはテキスト型ではないのでエラー。"3"の文字列で設定する必要がある。
<作成できる型>
型 | 例 |
---|---|
数値型 | Numberを{1}に設定します |
テキスト型(文字列型) | Nameを{'なつお'}に設定します |
bool値 | |
リスト型 | Listを{'ねこ','哺乳類','たま'}に設定します ※Listを入れ子にすることも可能 |
データテーブル型 | Datatableに{% ^['動物名','種別','名前'],['ねこ','哺乳類','たま']%} |
データ行 | For each datarow in datatable{…} ※データ行にはデータテーブルの単一行の値が含まれます |
カスタムオブジェクト型(JSon形式) | {"id":1,"name":"なつお",”age”:32,…} ※プロパティと値のペアになっている |
Datatime型 |
※ちなみに、作成した変数の型は、変数欄のフロー変数の変数をクリックし、変数の値のポップアップにて確認できます。
2.文字列結合時のパターン(変数%%の扱い)がいろいろあって間違えやすい
変数を扱うとき、%%を使用するが、以下のようなパターンがある。
- %%を続けて書く
%sei%%mei% - 足し算する
%sei + mei% - 途中に文字をはさむ
%'姓' + mei%
%sei + 'ミドル' + mei%
やりがちなNG例)
%sei% + %mei%
'姓' + %mei%
⇒変数を使う場合でかつ結合(+)する場合は、%%は最初と最後にはさむ!
3.変数にプロパティがある
プログラミングでは常識ですが、RPAでも同じようなことができるとはおもっていませんでした。
ただし、使用できるプロパティは少ないです。
どんなプロパティがあるかは、「変数の選択」から変数の名前に「>」マークがあるもの(ないものはプロパティを持っていない変数)を押すと表示されます。
(私は結構あとになって気づいた…!)
<よく使うプロパティ代表例>
テキスト型 | 内容 |
---|---|
Lengh | テキストの文字数を返します |
IsEmpty | テキストが空かどうかを判定した結果を返します |
Trimmed | 文字の両端に空白文字があった場合に、それらを削除した文字列を返します |
リスト型 | 内容 |
---|---|
Count | リストの件数を返します |
データテーブル型 | 内容 |
---|---|
Columns | データテーブルの列の名前を含むリストです。 |
RowsCount | データテーブルの行数です。 |
データ行型 | 内容 |
---|---|
ColumnsCount | データ行が保持する列の数です。 |
ColumnsNames | データ行のヘッダーを含むリストです。 |
<プロパティの使いどころ>
- ループのTo変数 0~***.Count-1
- データへのアクセス ***.Columns["name"]
- 条件分岐 ***.IsEmpty == true{…}
4.変数名を一括変更できる
変数名の変更は、変数欄のフロー変数の「…(縦点)」を(もしくは右クリック)し、「名前の変更」から変更することで、一括変更できる
フローから変更すると、そのフローの変数しか変更されないので注意!
5.Loopを利用する際のToの数値について
「<」なのか、「<=」なのか、プログラミングでは明治できますが、RPAだとどっち…??
正解は「<=」です。
よく考えたら「To」って日本語では「~まで」って意味ですもんね。当然ですよね。。
含めたくない場合は、To ***.Count -1 として調整しましょう。
6.Loopアクションを使うと、カウンタ変数(LoopIndex)が自動で作られる
別途、カウンタ変数を作らなくても良いです。
カウントアップも増分にセットすると自動でやってくれます。
(+も-も設定できるが、-を設定したとき、正常に登録できるが、後に開いたときに「無効な値」ってなる。なぜ??)
C#だと、For(int i=0; i<5; i++)と同じです。
ただ、ループの種類がLoopとFor each しかない…。WhileとかDoとかはないんですね。…十分な気がします。
7.複合型の変数を作ることができない
例えば、以下のような複合型のデータを持つPersonクラス(※)があったとします。
このクラスでは、名前や年齢、性別の他に、家族リスト(List型)の変数を、プロパティとして持つことができ、このPersonクラス自体を、配列に格納することが可能です。
Personクラスを複数格納して、ループ処理で回したりするときに便利ですよね。
RPAでは、このような1つの変数に、さまざまな型を格納することはできません。
ただし、データテーブルもしくはリスト変数にリスト変数を入れ子にして工夫すれば、同じようなデータ構造が再現できます。
例)
(※)様々な型(リスト型含む)の変数を持つPersonクラス(C#)
// Personクラス
public class Person{
// プロパティ
public string Name = {get; set;}
public int Age = {get; set;}
public bool IsMan = {get; set;}
public List<FamilyList> FamilyList = {get; set;}
// 家族リスト
public class FamilyList{
public string Name = {get; set;}
public int Age = {get; set;}
public bool IsMan = {get; set;}
}
}
Personクラスを利用する側のクラス
// PersonUseクラス
public class PersonalUse{
Person[] personDatatable = new Person[2];
Person p1 = new Person();
p1.Name = "なつお";
p1.Age = 32;
p1.IsMan = false;
p1.FamilyList = new List<FamilyList>{
new FamilyList {Name = "まさお",Age= 32, IsMan = true}
new FamilyList {Name = "まさこ",Age= 15, IsMan = false}
new FamilyList {Name = "まさし",Age= 5, IsMan = true}
};
Person p2 = new Person();
p2.Name = "花子";
p2.Age = 28;
p2.IsMan = true;
p2.FamilyList = new List<FamilyList>{
new FamilyList {Name = "花男",Age= 20, IsMan = true}
new FamilyList {Name = "花江",Age= 10, IsMan = false}
}
personDatatable[0] = p1;
personDatatable[1] = p2;
}
リスト型変数の中にリスト変数を入れる(入れ子)
プログラミングイメージ ※変数への格納イメージを伝えたいだけなので文法は適当です
Loop id = 1 To 3{
if (id == 1){familyList ={'まさお','32','true'}}
if (id == 2){familyList ={'まさこ','15','false'}}
if (id == 3){familyList ={'まさし','5','true'}}
familyDataList = {familyList} // = familyDataList.Add(familyList)
}
familyDataListの格納イメージ:
※familyListにはリストが格納されている。familyList[0]で'まさお'が取得できる。
id | familyList |
---|---|
1 | {'まさお','32','true'} |
2 | {'まさこ','15','false'} |
3 | {'まさし','5','true'} |
データテーブル型変数にリスト変数>リスト変数を入れる(二重の入れ子)
personDatatableの格納イメージ:
※familyListへのアクセスは、personDatatale[0][3]
familuList[0]で、{'まさお','32','true'}のリストが取得できる。
name | age | isMan | familyList |
---|---|---|---|
なつお | 32 | False | [{'まさお','32','true'},{'まさこ','15','false'},{'まさし','5','true'}] |
花子 | 28 | truw | [{'花男','20','true'},{'花江','10','false'}] |
長くなったので、次に続く。。