【注意】「WorkFusion」のフリーライセンス版はダウンロードできなくなりました。以前からインストールしている方は利用できるようです。「WorkFusion」が無料で使えないので当記事はほとんど役に立たないですが、「RPAとは何か?」という理解に少しでも役に立てばと思い、記事を残しておきます。

こんにちは、M田です。
RPAを使って「Amazonにある書籍の価格を調べる」ことをやってみる。前回は前準備とKindle版の価格と書籍版の価格の取得を行いました。

トライRPA! WorkFusionで本の価格調査 Part.1

トライRPA! WorkFusionで本の価格調査 Part.2

今回はそのPart.3です。

今回やること

前回、全体の工程を3つに分けました。

  1. 初期設定……レコーディングで使う変数の設定と準備
  2. 価格のスクレイピング……AmazonのHPから価格を取得して整形
  3. Excelへの書き込み……結果を書き込むExcelを開いて目標の行に変数を書き込む

前回は「1.」「2.」をやりましたので、今回は「3.」の部分をやってみます。
WorkFusion上での各工程がどこに当たるのかを図示してみました。

今回実装する範囲

緑枠の部分が今回実装する範囲です。しかしまずはRPAツールでのExcelの操作について少し触れます。

RPAツールでのExcel操作

1日のうちで仕事で一番使うのはExcel」という方は多いのではないでしょうか?

作業の自動化にとってExcelの操作は避けて通れません。なので多くのRPAツールにはExcelの基本操作専用の命令セットが準備されています。

WorkFusionのアクションライブラリにもExcel専用のアクションがあります。

WorkFusionのExcelアクション

今回はこの内の枠内の5つのアクションを使用します。

これらのアクションは画面が表示されず、いわゆるバックグラウンドで実行されます。なので実行スピードがとても早いです。
反面、実行中の様子が見れなかったり用意されたアクション以外のことはできないので、例えば「D列にオートフィルターを設定する」などアクションが用意されていない場合は別の方法をとる必要があります。

最終行を見つける

前回に取得したKindle版と書籍版の価格ですが、これは結果出力用のExcelファイルに「追記」します。
ということは、Excelファイルの最終行を見つけなければなりません。これが今回やることのキモの部分です。

「Excelファイルの最終行を見つける」のは人間の手(目)では簡単ですが、機械(プログラムやRPAなど)でやろうとするとなかなかに悩ましい問題になります。

いろんなアプローチがあるのですが、今回やる方法は次のようなシンプルなものです。

最終行の見つけ方
※クリックで大きな画像が開きます

WorkFusionのレコーディングに落とし込むには次のようなフローになります。

作業のフロー

左下のループしている部分がキモの部分ですね。

Excelファイルへ結果を書き出す

前置きが長くなりましたが、実際のWorkFusionのレコーディングを見ていきましょう。

Excelファイルを開く

まずはExcelファイルを開くので、「スプレッドシートを開く」をアクションライブラリからアクションフローにドラッグします。

スプレッドシートを開く アクション
※クリックで大きな画像が開きます

赤枠内にExcelファイルの場所(フルパスのファイル名)を入力しますが、出力用のExcelファイルの場所は「初期設定」で変数に格納しています。Part.2でやったように変数を入力するときは、「${(変数名)}」のように「${」と「}」で囲みます。いずれも半角です。
また、「最後のアクション後にファイルを保存」にチェックを入れておきます。これで処理が終わると同時に、Excelファイルが保存して閉じるようになります。

シートの切り替え

次にシートの切り替えを行います。アクションライブラリから「シートの切り替え」をアクションフローにドラッグします。
このとき、Part.2で「ウェブの要素」を「ウェブを開く」の入れ子にしたように、スプレッドシートを開く」の入れ子にします。こうすることで操作の対象を指定することになります。

シートの切り替えを行う
※クリックで大きな画像が開きます

赤枠内でExcelファイルの1番目のシート、「Sheet1」を指定しています。
インデックス番号はExcelファイルのシートをあらわす番号で、左から0,1,2……となっています。つまり「Sheet1」はインデックス番号「0です。

ファイルの先頭のセルの値を取得

次にExcelファイルの先頭のセル(A1ですね)を選択し、そのセルの値を変数に格納します。

先頭セルをアクティブセルにする
※クリックで大きな画像が開きます

Excelで、クリックして選択状態になっているセルを「アクティブセル」と言います。アクティブセルを設定するにはその名の通り、「アクティブセルを設定」をアクションフローに追加します。

赤枠内でどのセルをアクティブセルに設定するか指定します。「座標」を選択すればA1やB5のように座標で指定できますが、今回は「位置」を選択してみます。
セル位置のドロップダウンの中から「START_OF_DOCUMENT」を選択します。これでファイルの先頭セルをアクティブセルに設定できます。

次にそのセルの値を取得して変数に格納するために、「セル値を取得」をアクションフローに追加します。

アクティブセルの値を取得
※クリックで大きな画像が開きます

赤枠内の指定方法は先程と同じ要領です。セル位置のドロップダウンは「CURRENT」を選択します。これは「現在のアクティブセルの位置」という意味です。

取得した値は変数「temp_value」に格納します。また出てきましたね、「temp_value」。ここでも使いまわしています。

ループして最終行を探す

いよいよループがやってきました。ループを作成する方法は複数あるのですが、今回は「条件が成立する間はループを続ける」方法をつかいます。
まずはアクションライブラリ内の「ループ」>「の間」をアクションフローに追加します。

~の間ループをする
※クリックで大きな画像が開きます

赤枠内がループの条件で、この条件が成立するあいだループを続けます。

条件は次のように設定します。「等しくない(!=)」のドロップダウンの右の入力欄は、何も入力しません(つまり(空欄)です)。

${temp_value}が(空欄)と等しくない

現在「temp_value」に格納されている値は、ファイルの先頭セルの内容です。本稿の上の方のExcelファイルのスクリーンショットを見てみると、「■マンガで読み解く~」が先頭セルの内容ですのでこれが格納されています。
(空欄)と等しくないので条件を満たしていますなのでループ内の処理を実行します
このようにしてループが始まりました。

本稿のフローによると、一つずつアクティブセルを下に移動させ、そのアクティブセルの値が(空欄)と等しくなるとループから脱出、すなわちスクレイピングの結果を書き込む行に到達したことになります。

というわけでアクティブセルを一つ下に設定しましょう。アクションライブラリ内の「アクティブセルを設定」をアクションフローに追加します。
これはループの中の処理ですので、「の間」に入れ子にするようにします。

ひとつ下のセルをアクティブセルに設定する
※クリックで大きな画像が開きます

赤枠のセル位置は「CELL_BELOW」を選択します。つまり「現在のアクティブセルのすぐ下のセル」ということになります。
アクティブセルが新しい位置に更新されました。

更新された新しいアクティブセルの位置の値を取得します。再び「セル位置を取得」で「CURRENT」を選び、「temp_value」に格納します。

そしてループの先頭に戻ります。再び「の間」で「temp_valueが(空欄)と等しくないか」を調べます。等しくない、つまりなにか内容が格納されているなら再びループ内の処理がはじまります。
以上を繰り返して最終行を見つけます。

最終行が見つかったらいよいよ結果書き込み

(空欄)を見つけてループを脱出しました。アクティブセルはスクレイピング結果の書き込み位置にあります。
まずはスクレイピングを行った日時をA列に書き込みます。アクションライブラリ内の「Excel」>「セル値を設定」をアクションフローにドラッグします。

アクティブセルの位置に値を設定
※クリックで大きな画像が開きます

セル位置」は「CURRENT」を選択します。「書き込み位置は現在のアクティブセルの位置」ということです。

今回は「セル値の取得」ではなく「セル値の設定」なので、「新しいセル値」で設定する値を選択します。ここでは変数の「price_date」をドロップリストから選択します。
price_date」の中身には何が入ってるでしょうか? 前回の「初期設定」で「yyyy/mm/dd HH:mm 記録」という文字列を作成して格納しておきました。

これで書き込み位置のセルには「price_date」の内容を設定できました。

【注意】WorkFusionの翻訳ミスなのか私の環境だからなのかバージョンのせいなのかもしれませんが、「セル値の設定」をアクションフローに配置すると、表示が「セル値を取得」になります。 上のスクリーンショットのアクションフローで、最後の3つの「セル値を取得」は、正しくは「セル値の設定」です。ご了承ください。

続いて「Kindle版の価格」「書籍版の価格」を、それぞれB列、C列に設定していきます。

Kindle版価格を一つ右のセルに設定
※クリックで大きな画像が開きます

同じように「セル値の設定」アクションの赤枠内を設定していきます。
セル位置」を「CELL_TO_THE_RIGHT」、つまり現在のセル(=アクティブセル)の右側と指定することで、B列を指定したことになります。
セルに設定する値はKindle版の価格を格納している変数、「price_kindle」を選択します。

書籍版の価格を設定
※クリックで大きな画像が開きます

書籍版も同じような設定になります。「セル位置」はKindle版のさらに右側なので「CELL_TO_THE_RIGHT」を選択、セルに設定する値は書籍版の価格を格納している変数、「price_book」を選択します。

以上ですべての処理は終了となりました。Excelファイルは新たな価格取得の結果が書き込まれ更新されたので、保存しないといけません。新たな処理が必要でしょうか? 不要です。

本稿「Excelファイルを開く」のところでExcelファイルを開く際に、「最後のアクション後にファイルを保存」にチェックを入れておきました。このチェックのおかげでExcelファイルは無事保存されるというわけです。

結果

以上ですべての処理が終了しました。Excelファイルを開いて結果を見てみましょう。

7行目に新しい取得結果が記録されています。「Amazonで『人を動かす』のマンガ版のKindle価格と書籍版の価格を取得し、Excelに記録していく」という目的が達成できました。

発展とまとめ

今回やったサンプルの発展としては、

  • 他の本についても取得してみる。
  • 本ごとの取得結果を別のExcelファイルに出力してみる。
  • 在庫のチェックも行ってみる。
  • 定期的に「勝手に取得して記録する」仕組みにしてみる。

などが考えられます。いずれも役に立ちそうです。

WorkFusionを使っての作業の自動化のサンプルですがいかがだったでしょうか?
もともと人手でやっている作業を機械(プログラム)に変わってやってもらう、というのが「RPAによる作業の自動化」です。RPAの命令セット(WorkFusionでいうところのアクション)は、手作業でやっていることの置き換えがやりやすいようなものが用意されています。そのおかげで、プログラミング言語によるプログラミングより身近に感じられる、とっつきやすく親近感があるのではないかと思います。

今回は処理を一つ一つ手動で積み重ねていきました。WokFusionに限らず他の多くのRPAツールではこの他に、「手動操作を記録して、再現する機能」を備えています。Excelの「マクロの記録」のような感じです。また機会を改めて紹介できたらと思います。

以上、読んでいただいてありがとうございました。