【RPA】(Microsoft)Power Automate Desktop を使ってみてわかったこと。~プログラマ視点でできること(できないこと)をまとめてみました(前編)~
生徒
RPAってどんなことができるの?
先生
PCで人間が行う操作のほとんどは、自動できるよ。プログラミング知識がなくても、誰でも自動実行ツールが作れる、便利なツールだよ。

目次

はじめに

最近現場で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]で'まさお'が取得できる。

idfamilyList
1{'まさお','32','true'}
2{'まさこ','15','false'}
3{'まさし','5','true'}

データテーブル型変数にリスト変数>リスト変数を入れる(二重の入れ子)

personDatatableの格納イメージ:
※familyListへのアクセスは、personDatatale[0][3]
 familuList[0]で、{'まさお','32','true'}のリストが取得できる。

nameageisManfamilyList
なつお32False[{'まさお','32','true'},{'まさこ','15','false'},{'まさし','5','true'}]
花子28truw[{'花男','20','true'},{'花江','10','false'}]

長くなったので、次に続く。。