Power Automate Desktopで学ぶRPAテクニック
3月の頭にリリースされたMicrosoft Power Automate Desktop(以下、PAD)により、世の中の多くの人が高額な商品を買わずとも、まず勉強できる環境が手に入るようになりました。すでに多くの人が色々な機能をテストしたり、知見をネットに共有し始めています。
さて、PADに限らず世のRPAで作られてる多くのフローはプログラミング経験の無い方が作成されてるが故に、不安定な動作や確実性の低いものが多く存在します。今回はそういった問題点を列挙しつつ、安定動作する為に必要なテクニックをまとめてみました。
※2021/04/07 Peaceful Morning社よりPower Automate Desktopの無償の学習テキストが公開されました。
今回使用するアプリケーション
PADに関する基本的な内容については、以下のリンク先にある前回のエントリーをご覧ください。
多くのRPAフローに内在する問題点
テクニックを学ぶ前に、現時点での作成されている多くのRPAのフローに内在する問題点を見ていこうと思います。その根本原因は「フロー作成者にプログラミングに関する知識が無い」事に尽きます。プログラミング不要=プログラミング知識不要では有りません。スタート地点からして誤っているので、不安定な動作や確実性を欠いたフローが出来、結果的に「RPAは使えない」という判断をしてるケースが非常に多いです。
また、プログラミング知識以外にも、例えばITリテラシーが低いが故にPADで言えばレコーダーの記録に頼った作り方をしたが為に、問題を起こしてるケースも多々見受けられます(これは、Excelのマクロの記録でも同様の事が言えます)。よって、以降RPAでシナリオを作る上で認識しておくべき問題点は以下の数点になるかと思います。今回のまとめではこれらに基づいてフローを作成します。
- RPA製品付属のレコーダーの記録に頼ったフローを作ってしまっている(あくまでもレコーダーは補助です。環境が異なると動作しないようなものも多数あります)
- マウス操作を記録したようなアクションをRPA上に作ってしまい、違う環境で動かないであったり、メンテナンス性が非常に悪いフローが故に不安定で遅いものに仕上がってる
- ITリテラシーがあれば最短で行けるルートを作らず、ある動作の為にいくつものステップを作り込んでるケース(ショートカットキーやURL Schemeの活用をしていない)
- ブラウザ操作などに於けるセッションやクッキーの存在を考慮せずに作り、思ったような挙動になっていないケース
- 変数やインスタンスといったプログラミングでは普通に利用するものを使わず作ってるために、冗長なフローになってるケース
- Excel操作に於いて、1セルずつ処理するようなオカシナシナリオを作ってるケース(非常に動作を遅くする原因になってる)
- Excel操作に於いて、データの抽出をするに当たって、不確実な操作で再現しようとしてるケース
- Microsoft365の各アプリケーションの操作で、Power AutomateやREST APIを使わず実現しようとしてるケース
- エラーが出た場合などの対処法を組み込んでいないケース
- RPAのアクションだけでなんとかしようと無理やり構築してるケース(コマンドラインやVBA・VBS、Pythonなどを併用していない。また、複雑な条件判定処理をRPAでやらせようとしてるケース)
RPAが世に出てすでにもう3年程度経過し、初心者であるならば最初はレコーダーに頼るのは仕方ないにせよ、その後もプログラミング知識を身に付けずに、同じレベルでフローを作ってる人は、そろそろ脱却しなければなりません。
※そもそもその作業は必要なものなのか?といった業務最適化前整理は当然必要になります。
データの整備
ホワイトカラーの現場を見ていると、RPAでの作業自動化の最初の起点がExcel、終点が基幹業務システム(会計システムや給与計算システム)といったケースが非常に多く見受けられます。また、逆のパターンも多いですね。しかし、このExcelがそもそも問題だらけで、その後の自動化を行う上での障害になってるケースが非常に多く見受けられます。まずは、総務省の統一ルールにあるように、好き勝手に我流で作ってるようなExcelシートをどうにかする所から始めましょう。
総務省の統一ルールからリストアップすると
- 1セル1データは鉄則。1つのセルに複数のデータを備考のように詰め込んでるようなケースはNGです。
- 数値のセルデータに▲などの記号類や円マーク、単位名などを含めない(セルの書式設定でやるべき事です)
- セルの結合を行わない。人間にとって見栄えが良くても、プログラムが扱う上では最悪です。
- スペースで均等割り付け風にしない。スペースの存在は邪魔以外の何もでもありません。
- 複数のレコードで同じような項目が列挙されてるケースで1つ目だけ項目名を表示して、以下を省略するような表記を行わない。
- 1つの表で実現できる事を、特定のジャンルでわざわざ分割表記しない(都道府県別に別々に表を作る事になんの意味もありません)。都道府県という列を用意してジャンルを記述しておけば済む話です。
まだ他にもあります。
- 生データではなくいきなり集計表形式で表を作らない。集計表というものは生データから加工して作るものです(ピボットテーブルなども生データから加工して作る事例の1つ)。生データ→集計表は簡単でも、集計表→生データは非常に面倒です。
- 同じ列なのに、数値のものと文字列のものが混在してる。数値の列は数値のみ、文字列のものは文字列のみにすべき。
- 数値に於いて全角文字は使わない。
- 日付の形式をyyyy/mm/ddの形式を使用し、21.10.5といったような入力をしない。
- 列の非表示、フィルタを掛けっぱなしで運用するような真似をしない。
- 月別合計列などの小計を列と列の間、行と行の間に設けない。邪魔です。合計列は一番右、合計行は一番下は鉄則です。
- 100列も200列もあるような巨大で横長なデータは作らない。行数はいくらあっても構わないけれど、列数はきちんと項目を整理して、生データの形式にするべき。目的の値を探す時間が無駄以外の何物でもありません。
- 無闇矢鱈に条件判定や複数の入れ子にした関数を駆使したような表は作らない。メンテナンス性最悪です。
- 一方でSUM関数1つで済むようなものを、A1+B1+C1+・・・といった悪い数式で合計したりしない。
- テーブル機能を活用し、vlookupなどで固定もせずに作ってるような表は作らない。
- 追跡不可能なほどに複数のExcelブックやシート間リンクといった表は作らない。
- 1列のステータス列だけで表現できる事を、複数の列を使って表現するような表は作らない。
- 備考欄にすべき内容を、セルのコメント機能を使って表現しない。
- 部門によって同じような内容なのに、表の形式・入力ルールが統一されていない(列の順番すら違うケースも多数有り)表は作成しない。
- 縦横の1枚の表以外に余計な場所に入力欄やら、マクロのボタンなどは設置しない。ボタンはリボンで作るべきです。
- 表のタイトル列に環境依存文字であったり、特殊記号、数字から始まるタイトル、括弧などを含めたタイトルは使用しない(命名規則を勉強しましょう)
- IDなどは必ず一番左端に配置し、また重複しない連番の列も用意すべき。
- 可能であれば、マスターとサブマスタは分離管理し、データベースはAccessで管理するか?Power Queryなどを活用して連結して別シートで管理をするようにする。
※早い話が縦横1枚の表で作れば良いだけ。余計な事をするなという事です。余計なデザインや脚色をしたいのであれば、それを行わないマスターデータを用意し、別シートでそこから集計する形で好き勝手にやってください。ということです。人間本位から見たデータではなく、コンピュータに合わせたデータを作成・運用出来なければ、RPAで自動化など出来ないと思ってください。
デスクトップの操作
デスクトップアプリケーションの操作をPADで行う上での一番の秘訣は「レコーダをなるべく使わず、マウス操作での操作をなるべく行わない」に尽きます。その為のテクニックの基本をPADで実現する事でより確実な操作が可能になります。
ショートカットキーを活用する
業務用アプリケーションに限らず、多くの標準的なWindowsアプリケーションは、様々な機能の呼び出しは「ショートカットキー」で可能になっています。キーの送信を活用する事で、マウス操作多用を省略する事が出来、またボタンをクリックもショートカットキーで「はい」「いいえ」を実行できるので、積極的に活用しましょう。注意すべきは必ずキーを送りたいウィンドウがアクティブの状態である事が必要です。
例:IrfanViewでファイルを開く画面を出す
- irfanViewをアクティブにするウィンドウのUI要素をクリックするアクションで実現(この記録だけレコーダーで行うと手軽)
- Alt+Fキーでファイルメニューを開き、続けて、Oキーを送るとファイルを開くを、キーの送信アクションで実現
印刷などはCtrl+PキーがWindowsアプリの共通のショートカットキーになっていたりします。また、キーの組み合わせはアプリの入力欄の所に記述されてたりします(例:ファイル名(O)とあったら、Alt+Oキー。直接Ctrl+Pと書いてあったらその通りにクリックといった具合です)
ボタンの位置などは関係なく、その画面がアクティブならば確実にボタンを実行できるので、マウス操作は鬼門です。
図:キーの送信でショートカットキーを送り込む
ファイルの指定はフルパスで送り込む
続けて、このアプリでファイルを読み込む場合、ファイルを開くダイアログを操作するわけですが、この操作をウィンドウのUI要素をクリックなどでレコードして実現すると、ファイルの配置の違いなどから失敗する可能性が高いです。読み込むファイルの場所が決まっているのであれば、PADでフルパスを構築し、ダイアログに送り込んで開くをクリックさせるだけにすれば、確実性がアップします。
例:IrfanViewでドキュメント直下の特定のファイル(dum.jpg)を開く
- 特別なフォルダーを取得アクションにて、「個人用」を指定する(%SpecialFolderPath%で呼び出せる)
- 変数の設定アクションで、1.の変数に加えて、¥dum.jpgをつなげて、%filefullpath%として保存する
- 呼び出されてるファイルの選択ダイアログにて、ウィンドウのUI要素をクリックするアクションにて、ファイル名欄をクリックさせる(Altキー+Nのキー送信でも可)
- キーの送信アクションで%filefullpath%を送信する
- 最後にキーの送信アクションで「Return」を送信すると読み込まれる
図:ファイルの選択は操作では記録しない
コマンドラインを活用する
多くのWindowsアプリケーションのEXEは、実はコマンドラインからも引数付きで起動できるようになってる事があります。IrfanViewもかなりの動作をコマンドラインから直接ダイレクトにやらせることが出来たりするので、活用すると余計な操作を全てすっ飛ばして結果を得る事が可能だったりします。
例:IrfanViewを起動させ、ドキュメント直下の特定のファイル(dum.jpg)を開く
- 特別なフォルダーを取得アクションにて、「個人用」を指定する(%SpecialFolderPath%で呼び出せる)
- 変数の設定アクションで、1.の変数に加えて、¥dum.jpgをつなげて、%filefullpath%として保存する
- アプリケーションの実行アクションにて、アプリケーションパスはEXEへのフルパスを指定
- 同じく、コマンドライン引数に%filefullpath%を指定する
これで、起動させた上に直接ファイルを開いてくれます。キー送信もマウス操作の記録も無しなので、確実な処理が実現出来ます。
図:確実に開く処理を実行出来ます。
URL Schemeを活用する
コマンドラインの活用同様、Windowsアプリの中には「特殊なURIを実行すると、アプリを起動してダイレクトに特定の機能を呼び出した状態に遷移する」事が可能なものがあります。例えばiTunesなどは有名ですね。また、Windows10の設定の特定の項目を開く事も可能になっています。
これらはコマンドラインの実行でも可能ですし、VBSで呼び出しも可能です。コマンドラインからの場合は、「start ms-settings:sound」を実行するとサウンドの設定がダイレクトに開かれます。
例:Teamsを起動して特定の人とのチャット欄を開き、メッセージの入力まで行う
- 変数の設定アクションを追加し、メアドを入れて、%address%として保存する
- 変数の設定アクションを追加し、メッセージを入れて、%message%として保存する
- VBScriptの実行アクションを追加する。
- ダブルクリックして、以下のスクリプトを記述する(1.と2.の変数を組み込む)
- 実行すると、ダイレクトにその人とのチャット画面が立ち上がり、メッセージが入った状態になります。あとは送信の処理を入れれば完成です。
これだけで、Teamsの対象者のチャット入力欄を表示してメッセージまで入れた状態に遷移出来ます。マウスでやってたら大変な事です。後は送信をクリックするアクションを入れればこれで、Teamsでメッセージが送信出来ます。自作のアプリにURL Schemeを搭載すれば、同様の事が実現可能です。
1 2 3 |
Dim ws Set ws = WScript.CreateObject("WScript.Shell") ws.Run "msteams:/l/chat/0/0?users=%address%&message=%message%" |
図:変数を組み合わせてURL SchemeをVBSで実行
Excel操作
RPAは本質的に言うとExcel操作は得意分野ではありません。Excelの操作はやはりVBAが圧倒的に優れており、複雑な処理をさせるならば、素直にVBAで処理を構築させ、RPAは脇役に徹するべきです。
しかし、表データを読み取り必要なデータ加工だけを行って、出力するといった単純なものであるならば、RPAで行うほうが長々とコーディングせずに済む点もあるのと、マクロの記録のような人間の動作を記録して実行するようなものでなければ、有効な場面は結構多いのではないかと思います。
EXCELのデータは一発で読み込む
それなりにプログラミング経験のある人は、1セルずつ読んでは作業してといったフローが効率が悪く非常に面倒であることを知っています。故に例えばデータを読み取る場合も一発で読み込み、メモリ上で処理をしてから一発で書き出すのが定石です。
シートにあるタイトル列まで含めてデータの全範囲を指定して取得してみます(VBAで言う所のUsedRange)
- 特別なフォルダを取得にて、デスクトップを取得
- Excelの起動にて、1.と合わせて、jinkou.xlsxを開く
- アクティブなワークシートの設定にて、Sheet1を指定する
- Excelワークシートから最初の空の行や列を取得にて、最後の列や行を取得(実際にはそれぞれ-1した値)
これで、そのシートの表のデータを取得出来ます(ただし、空の列や行がある場合は注意)
図:一発でデータ範囲を確定してデータを取得
図:実際に範囲内のデータを取得する設定
EXCELのデータ書き込みは一発で書き込む
取得したデータを別にシートに書き込みます。前述の設定では、詳細にて1行目はタイトル列で指定しています。これを書き込むのに、ループを使って1セルずつや1行ずつ書込みはNGの書き込み方です。
書込み先は範囲指定ではなく、書込み開始のセルの番地を指定するだけでOKです。Sheet2にも1行目はタイトル列が存在するので注意。
- アクティブなワークシートの設定にて、Sheet2を指定する
- Excelワークシートに書込みにて、1列目2行目のポジションを指定して書込み(タイトル列は書き込まれません)
- Excelを閉じるにて、データを保存しつつ閉じます。
図:一発でデータも書込みをするのが定石
図:書込み範囲の指定ではなく、書込み開始セルの指定
以下、一発読み込み・一発書込みのコードになります。
1 2 3 4 5 6 7 8 |
Folder.GetSpecialFolder SpecialFolder: Folder.SpecialFolder.DesktopDirectory SpecialFolderPath=> SpecialFolderPath Excel.LaunchAndOpen Path: $'''%SpecialFolderPath%\\読み込むxlsxファイル.xlsx''' Visible: True ReadOnly: False LoadAddInsAndMacros: False Instance=> ExcelInstance Excel.ActivateWorksheetByName Instance: ExcelInstance Name: $'''Sheet1''' Excel.GetFirstFreeColumnRow Instance: ExcelInstance FirstFreeColumn=> FirstFreeColumn FirstFreeRow=> FirstFreeRow Excel.ReadCells Instance: ExcelInstance StartColumn: 1 StartRow: 1 EndColumn: FirstFreeColumn - 1 EndRow: FirstFreeRow - 1 ReadAsText: False FirstLineIsHeader: True RangeValue=> ExcelData Excel.ActivateWorksheetByName Instance: ExcelInstance Name: $'''Sheet2''' Excel.WriteCell Instance: ExcelInstance Value: ExcelData Column: 1 Row: 2 Excel.CloseAndSave Instance: ExcelInstance |
SQLを活用して抽出を行う
Power Automate Desktopは非常に便利な事にODBCドライバが使えるようになっています。前回の記事では、Excelを起動しそのブックに対してODBCにてSQLを発行し、データをフィルタしつつ新規シートを作って書き出しを実践しました。しかし、もっと便利な使い方は、データはAccessやSQLiteに保存し、クエリで加工したものを作っておき、書き出す事です。
こうする事で2つ以上のテーブルを結合させつつ、シンプルなSQLでデータの取り出しが可能です。今回はSQLiteにある2つのテーブルを結合したビューであるpricemanからデータを取り出し、Excelに貼り付けてみたいと思います。
事前にこちらのサンプルDBを用意し、またPCにはSQLite ODBC Driver(64bitならsqliteodbc_w64.exe)をインストールしておき、できればDB Browser for SQLiteもあると良いでしょう。
- 特別なフォルダを取得にて、デスクトップを取得
- Excelの起動にて、1.と合わせて、query.xlsxを開く(空のExcelファイルです)
- SQL接続を開くにて、1.と合わせて、接続文字列を入力(値はDRIVER=SQLite3 ODBC Driver;Database=%SpecialFolderPath%\testdatabase.db)
- SQLステートメントの実行にて、pricemanからデータを取り出す(例:select * from priceman)
- Excelワークシートに書込みにて、1列目2行目のポジションを指定して書込み
- Excelを閉じるにて、データを保存しつつ閉じます。
更に、これにpricemanの各列をフィルタするために、Where条件を変数などで指定すれば、自由自在に結合したpricemanからデータを取り出せます。Excelと違い、AccessやSQLiteといったデータベースの場合このように、リレーションシップで結合したクエリやビューを作る事で、複雑なデータ構造と正規化されたデータで格納できるので、Excelだけに拘らずに活用すると、PADの活用の幅が一気に広がります。
※今回のサンプルDBは両者の同じitemidで結合し、数量と単価を掛けたものをtotal列として生成させてあります。以下、SQLiteからのデータ取り出しのコードになります。
1 2 3 4 5 6 |
Folder.GetSpecialFolder SpecialFolder: Folder.SpecialFolder.DesktopDirectory SpecialFolderPath=> SpecialFolderPath Excel.LaunchAndOpen Path: $'''%SpecialFolderPath%\\query.xlsx''' Visible: True ReadOnly: False LoadAddInsAndMacros: False Instance=> ExcelInstance Database.Connect ConnectionString: $'''DRIVER=SQLite3 ODBC Driver;Database=%SpecialFolderPath%\\testdatabase.db''' Connection=> SQLConnection Database.Execute Connection: SQLConnection Statement: $'''select * from priceman''' Timeout: 30 Result=> QueryResult Excel.WriteCell Instance: ExcelInstance Value: QueryResult Column: 1 Row: 2 Excel.CloseAndSave Instance: ExcelInstance |
図:テーブルの構成。2つのテーブルが入ってる
図:結合したビューの中身
図:SQLiteからデータを取り出すフロー
テンプレを用意して手数を減らす(グラフ作成等)
RPAを活用して、会議資料の作成であったり、請求書を生成などを作りました。ということで、フローを見てみるとやたらと手数が多いのを何度か見たことがあります。手数が多くなる原因は、Excelで予めテンプレートを用意して、各入力欄に値を嵌め込んでいくようにフローを作っている為。また、グラフの作成もなぜかゼロから作るように構築しようとしてる為に、マウス操作が何度も行われてるのが原因です。
果たしてこれだけの手順必要なのか?といったら、全く必要ありません。テンプレートを使うまでは良いのですが、これらは以下の方法で改善出来ます。
- データを各セルに嵌め込むのではなく、別のシートに1行レコードを追記するようにし、各セルはそれらを参照するように数式を入れておけば良い。
- グラフの場合は予め、領域を参照してグラフを生成するようにして置き、値を入れ替える事で書き換えるようにすれば良い。
これだけです。また、複数の請求書等を連続でPDFにしたいといった場合でも、なんどもセル単位で値を嵌め込んでPDF化ではなく、データベースを別シートに貼り付けて、メインのシート側は、データのIDを基準に入力欄の値の参照先を変えて於けば良いだけなのです。
人間が行うような手順で忠実にRPAを作るのは愚策です。手数が増える上に誤作動の原因、エラーの原因を自ら生み出してるに他なりません。当然、速度面でもそのような煩雑なRPAは不利になり、メンテナンスも非常に大変になるので、Excelで出来る事はExcelにきちんと任せるのが肝要です。
今回、テンプレをコピー、入ってるデータを回してデータを入れ替え、連続PDF化実行まで実装してみました。予め、PDF化を1クリックで出来るようにこちらのサイトを参考に、クイックアクセスツールバーに「PDFまたはXPS形式で発行」を追加しておいてください。ちなみに自分の場合このボタンは5個目に配置しています(Alt+5キーで実行されます)。サンプルのデータはMockarooにて生成しました。template.xlsxはこちらです。
- 特別なフォルダーにて、デスクトップのパスを取得します。
- 変数の設定にて、デスクトップのtemplateフォルダ内にあるtemplate.xlsxを1.と組み合わせてフルパスを作ります。
- ファイルのコピーにて、2.のパスをデスクトップにコピーします。
- Excelの起動にて、1.とtemplate.xlsxを組みわせて起動。なぜか、3.のCopiedFilesの変数の値が使えなかった。
- アクティブなシートを設定にて、Sheet1をアクティブにする
- 変数を設定にて、recordNumとして1を設定(ループのカウント用)
- ウィンドウにフォーカスにて、template.xlsxを開いてるExcelのウィンドウをアクティブにする
- Loopにて今回は1~5で回すように追加
- ワークシートの9列目2行目の場所に、6.の値を書き込み
- 2秒間Waitを追加
- キーの送信にて、PDF化コマンドと、ファイル名としてrecordNum、最後に実行のEnterを送り込みます({Alt}(5) %recordNum% {Return})
- 2秒間Waitを追加
- 変数を大きくするを追加し、recordNumに+1する
Alt+5キーで自分の場合はPDF化コマンドが実行されるので、いちいちマウス操作なしでダイレクトにPDF化出来ます。また、ファイル名としてrecordNumを送ってますが、ここにフルパスで例えば会社名などをデータから取っておいて送り込むと、会社名毎のPDFとなり、指定の場所に発行されます。利用するデータも別のファイルからコピーしたテンプレに貼り付けるフローを追加すればかなり汎用性が高まりますね。コードは以下の通り。7.のウィンドウにフォーカス部分とAlt+5キー送信部分は、各々でリメイクが必要です。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
Folder.GetSpecialFolder SpecialFolder: Folder.SpecialFolder.DesktopDirectory SpecialFolderPath=> SpecialFolderPath SET template TO $'''%SpecialFolderPath%\\template\\template.xlsx''' File.Copy Files: template Destination: SpecialFolderPath IfFileExists: File.IfExists.Overwrite CopiedFiles=> CopiedFiles Excel.LaunchAndOpen Path: $'''%SpecialFolderPath%\\template.xlsx''' Visible: True ReadOnly: False LoadAddInsAndMacros: False Instance=> ExcelInstance Excel.ActivateWorksheetByName Instance: ExcelInstance Name: $'''Sheet1''' SET recordNum TO 1 UIAutomation.Windows.FocusByTitleClass Title: $'''template.xlsx - Excel''' Class: $'''XLMAIN''' LOOP LoopIndex FROM 1 TO 5 STEP 1 Excel.WriteCell Instance: ExcelInstance Value: recordNum Column: 9 Row: 2 WAIT 2 MouseAndKeyboard.SendKeys TextToSend: $'''{Alt}(5) %recordNum% {Return}''' DelayBetweenKeystrokes: 100 SendTextAsHardwareKeys: False WAIT 2 Variables.IncreaseVariable Value: recordNum IncrementValue: 1 IncreasedValue=> recordNum END |
図:連続でデータを入れ替えPDF化
ウェブの操作
iframeの中を操作する
現代の各種ウェブサービスでは、ある目的以外では通常iframeは利用しません(Google Apps ScriptのWebアプリはSandbox環境とするために、表示自体がiframe内での実行という形を取っています)。しかし、そうではなく古いウェブサービスの中にはDiv Boxのような現代的なレイアウトではなく、iframeを用いてデザインをしていたようなケースも見受けられます。
このようなサイトを表示する時に、Puppeteerはiframe内を操作できるので問題ありませんが、Power Automate DesktopのウェブレコーダではUI要素を取得出来ません。このようなサイトの場合には
- ウェブでまずはログインを行う
- 対象のページに移動する
- そのページ内にあるiframeで括られたエリアは直接操作出来ないので、ソースを調べてiframe内のURLを導き出す(相対パスである事が多いです)
- その導きだしたiframe内のURLに移動するフローを一個追加する(Cookieやセッションは維持される)
- 4.で表示したページ内を操作する
といったように、3.と4.のようにワンクッション入れると操作ができます(但し、iframe内のページが動的に生成されていて、尚且アドレスがランダムで推測の出来ないタイプだと操作が出来ない)。
※動的生成でランダムなiframeページの場合には、スクレイピングしてiframeのsrcを調べて移動させるというテクニックもありますが、中々高度です。
URL Schemeを活用する
Web Intentとも呼ばれるのですが、デスクトップやスマフォのような特殊リンクではなく、https://から始まるURLを実行すると、直接ツイートの画面が起動するといったようなショートカット的なURLが色々なサービスに用意されています。これらを活用する事で、いちいちウェブサービスを操作するのではなく、URLの移動時にそのURLを構築しておいて実行する事で、あとは送信をクリックするだけの状態にすれば、必要最低限の操作で目的の処理を行わせる事が可能です。
例えば、Twitterでツイートする画面の場合は以下のようなURLになります。
1 2 |
//Twitterのツイート画面(テキスト入り) https://twitter.com/intent/tweet?text=ここにツイート内容 |
ツイート内容を予め構築してURLにつなぎ、Chrome操作で移動させれば、あとはツイートするボタンをクリックするだけのフローで自動ツイートが完成します。大幅にマウス操作を減らし安定操作に繋がります。
図:Webの操作は最小限で実現できる
クラウドストレージ操作
現代は昔とはもう違い、社内のファイルサーバを廃止し、インフラエンジニアを排除、Google WorkspaceやMicrosoft365などのグループウェアを使うのが定石になっています。Google DriveやDropBox、Boxを使って仕事をするのが中小企業でも簡単に実現できます。
しかし、一方でファイルがクラウド側に行った事で、自動化処理にとっては壁になってしまいました。OAuth2.0認証でプログラムを書いたり、ウェブブラウザでクラウドストレージを操作するのはハードルが高いです。そこで、使うのが、Drive File StreamやBox Driveといったアプリです。これらを使い、クラウドストレージをローカルドライブとしてマウントする事で、これまでと同じ自動化の手段が使えます。それぞれのフルパスは
- Drive File Stream = Gドライブとしてマウントされる
- Box Drive = C:¥Users¥ユーザ名¥Boxとしてマウントされる
- OneDrive = C:¥Users¥ユーザ名¥OneDriveとしてマウントされる(標準装備)
Drive File StreamはGドライブとしてマウントされるので、誰が使ってもファイルのパスは変わりませんが、他はユーザ名が入る事で、フルパスが変わってしまいます。これをPower Automate Desktopの共通の処理で構築するには、以下の2パターンを使います。今回はOneDriveを処理します。
- DOSコマンドの実行フローにて、「subst z: %%USERPROFILE%%\OneDrive」で、Zドライブとしてマウントさせる
- VBScriptの実行フローにて、以下のコマンドを入力し、ユーザ名を取得。変数にてC:\Users\%VBScriptOutput%\OneDriveを格納して以降処理する
特別なフォルダの取得フローだとユーザフォルダ直下が取得出来ないので、この方法を取っています。前者は%%で%USERPROFILE%を括ることで、環境変数からパスを取得させています。後者はユーザ名を取得したものを元にパスを構築して変数に格納しています。こうすれば、面倒な処理なく、クラウドのファイルの直接読み書きが可能になります。
1 2 3 4 |
Dim x Set x = WScript.CreateObject("WScript.Network") WScript.StdOut.Write x.UserName |
図:VBSでOneDriveまでのフルパスを取得する
HTTP通信
REST APIを活用する
OAuth2.0認証のようなClient IDおよびClient Secretを使ってAuthcodeを取得、Authcodeを持ってAccess Tokenを取得し、期限が来たらRefresh TokenでAccess Tokenを取り直すといった作業は、Power Automate Desktopで行うにはなかなか厳しいです。しかし、ウェブサービスには単純に固定のTokenを発行し使えるタイプのサービスがあります。
Line通知で使うLine Notifyはそういったサービスで、手軽にスマフォに通知を送る手段として活用出来ます。このタイプであれば、Power Automate Desktopから例えば作業完了後にLINEに通知といったような事が可能です(Power AutomateにはLINEコネクタが無い)。以前のエントリーを参考に、作ってみました。
- Line Notifyにログインし、マイページに移動する
- トークンを発行するボタンでTokenを取得しコピーしておく(この時の命名がLINEの通知名になります)
- グループチャットの場合には、予めそのグループLINEにLine Notifyを招待しておく必要があります。
- Power Automate Desktopに変数を一個追加し、2.のトークンを追加する(変数名:token)
- 同じく変数を一個追加し、好きなメッセージを入れる(変数名:message)
- Webサービスを呼び出しますを追加し、URLはhttps://notify-api.line.me/api/notifyを指定
- メソッドはPOSTとし、受け入れはapplication/json、コンテンツタイプはapplication/x-www-form-urlencodedを指定
- カスタムヘッダには、Authorization: Bearer %token%を記述
- 要求本文には、message=%message%を記述
- これで、実行すると自分のLINEにPAD通知としてLINEが到着します。
ソースコードは以下の通り。
1 2 3 |
SET token TO $'''ここにTokenを入れる''' SET message TO $'''ここにメッセージを入れる''' Web.InvokeWebService Url: $'''https://notify-api.line.me/api/notify''' Method: Web.Method.Post Accept: $'''application/json''' ContentType: $'''application/x-www-form-urlencoded''' CustomHeaders: $'''Authorization: Bearer %token%''' RequestBody: $'''message=%message%''' ConnectionTimeout: 30 FollowRedirection: True ClearCookies: False FailOnErrorStatus: False EncodeRequestBody: False UserAgent: $'''Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.8.1.21) Gecko/20100312 Firefox/3.6''' Encoding: Web.Encoding.AutoDetect AcceptUntrustedCertificates: False ResponseHeaders=> WebServiceResponseHeaders Response=> WebServiceResponse StatusCode=> StatusCode |
図:完了通知は必須の機能になるかも
図:Line NotifyのTokenが必要
関連リンク
- RPA導入に於ける注意点
- [Power Automate Desktop]名前を指定してフローを実行するPowerShellスクリプト
- Power Automate Desktopの基礎から学べる動画サイト「Power Hacks」
- 統計表における機械判読可能なデータ作成に関する表記方法について
- Excelのその使い方、間違ってませんか? 総務省の統一ルールに学ぶ、Excelへの正しいデータ入力方法6選
- 【Windows,Mac】アプリのURLスキームを簡単に抽出できるアプリの決定版!(2017)
- Windows10の『設定』を開くコマンドms-settings:URLスキーム一覧リスト
- WindowsでURLのプロトコルからアプリを起動する
- Power Automate から LINE に通知を送ってみよう
- Power Automate DesktopのフローからMicrosoft Graph APIを呼び出してみました。