Enterprise Blue Ocean ◮

神谷町RPAブログ

  • Blue Prism 初級者向け
    • Blue Prism を 無料で利用する 方法はこちら
    • Blue Prism の Blue Prism 事始め!オンボーディングの記事はこちら
    • Blue Prism で Excelを操作 する記事はこちら
  • Blue Prism、ちょっと進んだコンテンツ☆
    • Blue Prism の ベストプラクティス 記事はこちら
    • Blue Prism の 逆引きナレッジ wiki こちら
    • Blue Prism を リアルタイムで起動する 方法はこちら
  • RPA、そもそも論!
    • Youtube で、あらためて振り返る RPA とは?・・・はこちら☆

Blue PrismでExcelを操作する<詳細版⑧> Append Field (Text) でコレクションに列を追加する

今日は、ちょっとマニアックな話をします。

 

 

Blue Prismのコレクション操作は超重要

Blue Prismを使う場合、コレクション(要は配列)の操作が必要な場面に多く出くわすと思います。

Excelからデータを読んだり書いたりする場合、ほとんどの場合、データはリスト形式だったり、テーブル形式だったりしますよね。

これらはBlue Prismでは、すべてコレクションとして扱われます。

Excelだけでなく、Webシステムクラサバを扱う際も、リスト形式、テーブル形式のデータは頻出します。

したがって、Blue Prismにおいて、コレクションの操作は超重要な機能…だと思います。


ただ、ここだけの話、Blue Prismのコレクション操作って、結構、クセが強くないですか?

慣れればどうってことないのかもしれませんが、ブェー(断末魔)みたいな思いをすることが無きにしも非ず。

今日はそんなコレクション操作で苦労した話です。


なお、先に断っておきますと、VBOの Collection Manipulation は、私が作っているわけではないので、以下は実験結果および考察です。一利用者の意見としてとらえていただけますと幸いです。

 

Collection Manipulation の Append Field(Text)

Blue Prismでコレクションを操作するには、VBOの BPA Object - Utility - Collection Manipulation が欠かせません。

アクションの数も多く、応用次第でいろいろなことができます。

ただ、この Collection Manipulation 、結構、クセがある個性的に感じます。

特に Append Field(Text) は特にクセ球特色のある印象…ムービング・ファスト・ボール的な。。何かちょっと芯が外されるんだよなぁ。


Append Field(Text)は、あるコレクションに列を追加するためのアクションです。入出力は以下のような感じ(勝手訳)です。

 

Append Field (Text)

コレクションに列を追加します。追加される列に入る値は、テキストになります。

Append Field (Text)の入力

  • Collection: 追加前のコレクション
  • Field Name: 追加する列の名前
  • Value: 追加される列に入る値

Append Field (Text)の出力

  • Appended Collection: 列を追加したコレクション

 

Blue Prismの利用シーンとして、コレクションに列を追加したいことは多いので、割と多用したいアクションですが、以下のようなクセのある挙動をします。

たとえば、以下のようなケースを考えた場合、 Append Field(Text) の結果はどうなるでしょうか。

  1. 空のコレクションに、 Append Field(Text) で列を追加する
  2. 既に初期値が設定されているコレクションAppend Field(Text) で列を追加する。ただし、出力には空のコレクションを選択する
  3. 既に初期値が設定されているコレクションに、 Append Field(Text) で列を追加する。ただし、出力は入力と同じコレクションにする(再帰的な呼出し

はい、実験してみました。結果はこちら

  1. 何も起きない。列は追加されないし、エラーも出ない
  2. 列が追加された形で、コレクションが出力される
  3. エラーが起きる

エラー内容は、以下の通りです。

f:id:EnterpriseBlueOcean:20181226184223p:plain

Internal : Collection fields are defined but cannot be matched to the incoming collection - The collection definition does not contain the field フィールド名

 

実験結果の考察(というか、推測)

何度も言いますが、別に私が Collection Manipulation を作っているわけではないので、以下は推測です。

まず、1.のケースですが、これはおそらくNULL状態のコレクション(おそらく、内部的にはDataTable)に対して、列を増やすという操作がそもそもできない(やり方はあるかもしれないが、通常とは違う方法が必要)のだと思います。Append Field (Text) は、初期値を設定したコレクションしか入力できないわけです。

そして、2.のケースですが、Append Field (Text) した結果は、最初にNULL状態で定義したコレクションにしか出力できないのだと思います。コレクションの列を可変にするには、コレクションの最初の定義をNULLにしておく必要がある…ということなのでしょう。何か列を定義してしまうと、コレクションの定義が定まってしまうのだと思います。

そして、3.のエラーは、 出力時に定義の定まったコレクションを利用しているため、Append Field (Text)出力時の型のチェックで上記のエラーが起きる…というのが私の推測です。

 

…この状態だと、Append Field (Text) は、再帰的な呼出しができないことになります。これはちょっと困ったことです。なぜなら、コレクションに列を追加する際に、追加する列の数が可変(動的)になるケースはよくあるからです。

追加する列の数が可変になるのに、再帰的な呼出しが難しい、となると、コレクションの定義を動的に増減させる必要性が出るので、実装できなくなってしまいます。

 

Append Field (Text) は再帰呼出しができないのか?

…と思うじゃん?

実はできます。

 

やり方は簡単で、

  1. 最初にNULL状態で定義したコレクション(X)を用意する
  2. 初期値を設定したコレクション(Y)を用意する
  3. XYを入れる
  4. XAppend Field (Text)入力/出力に使う

こうすることで、 Append Field (Text) を利用する際の要件2つ;

  1. 初期値を設定したコレクションしか入力できない
  2. 最初にNULL状態で定義したコレクションにしか出力できない

同時に満たすことができるので、同じコレクションを入力にも出力にも設定でき、再帰的な呼出しが実現できます。

これにより、追加する列の数が可変になっても、対応できます。
(初期値がいらなければ、後で消しておけばOKです)

 

たとえばこんなことができる:行列の転置、つまり行と列の置き換え

あんまり良い例ではないかもしれませんが、Append Field (Text) の再帰的な呼出しができると、例えば行列の転置が可能になります。

簡単に手順を書くと以下の通りです。

  1. 入力された行列から一列を選択する
  2. 列の値を上から一つずつ読み取って、一行にまとめる(ここでAppend Field (Text) を使用する)
  3. 一行にまとめたものを、コレクションに追加していく

以下のようなフローになります。

(オブジェクトで作っちゃった。。)

f:id:EnterpriseBlueOcean:20181226184924p:plain

以下のような入力が

f:id:EnterpriseBlueOcean:20181226185154p:plain

こうなります。

f:id:EnterpriseBlueOcean:20181226185211p:plain

行と列の数が可変になっても、上記で処理できます。

やったぜ。

 

動画も撮ってみました。

youtu.be

 

まとめ

  • Collection Manipulation は、ちょっとクセがある個性的
  • 特に Append Field(Text)クセが強く特徴的で、一見すると再帰的な呼出しができず、追加する列の数が可変のときに使えないように見える
  • しかし、工夫すれば Append Field(Text) も再帰的な呼出しが可能
  • うまく使えば、行列の転置とかもできちまうんだ

久しぶりに、まともな記事を書いたな。。

そして仕事は…終わんね…