Microsoft Power Automate DesktopでRPAを実現してみる
自分自身の個人的意見としては、エンドユーザコンピューティングは大いに結構だと思ってるけれど、一方で日本でジリジリと熱さが消えつつある国内の有象無象のRPAについては滅んだほうが良いとも思ってる。理由は後述するとして、本日良いニュースが発表されました。Power Automate Desktopについて追加費用無し無償で利用可能になるとのこと。これは既にあるMicrosoft365のEnterpriseプランなどに標準で利用できてるPower Automateのデスクトップ版のようで、Windows10に標準でついてくるようになるとのこと。
ということで、現時点のMicrosoft365で使えてるPower Automate Desktopを使ってみて、どんな感じなのか?またリリース後にその違いなどをここに記述していこうかなと思っています。また、Seleniumベースのウェブ自動化についても取り上げてみようと思います。
※Connpassにて無償のPower Automate Desktop勉強会がYoutubeライブで開かれました。アーカイブされてるので、いつでも閲覧可能です。
※2021/04/07 Peaceful Morning社よりPower Automate Desktopの無償の学習テキストが公開されました。
図:MS謹製というインパクトは大きい
目次
- 1 まえがき
- 2 アプデ情報
- 3 Power Automate Desktopを使ってみる
- 3.1 インストール
- 3.2 実際に起動してみる
- 3.3 様々なアクションの数々
- 3.4 レコーディング機能
- 3.5 ちょっとしたテクニック
- 3.5.1 アクションはコピペしてテキスト保存もできる
- 3.5.2 作成したフローはOneDriveに保存されてる
- 3.5.3 キャッシュされたファイルについて
- 3.5.4 直接他のEXEを実行するテクニック
- 3.5.5 フローの中から他のフローを実行
- 3.5.6 PowerShellを使って名前指定でフローを実行
- 3.5.7 UWSCを使ってフローを実行
- 3.5.8 Robin.exeでPower Automate Desktopのフローを実行
- 3.5.9 ミリセカンドのウェイトを入れたい
- 3.5.10 テキスト置換で空白を使いたい
- 3.5.11 ショートカットキーを送信したい
- 3.5.12 URL Schemeを活用する
- 3.5.13 Python3スクリプトを実行
- 3.5.14 再インストール後にエラー頻発
- 3.5.15 ZIP解凍で日本語文字化け
- 3.6 有償のプランで使ってみる
- 4 気になる機能でRPAを作ってみた
- 5 トラブルシューティング
- 6 参考動画
- 7 関連リンク
まえがき
有象無象のRPAは滅ぶべし
自分が国内のRPA製品群に対して良い印象を持たない理由は様々です。既にRPA導入に於ける注意点でも記述してることですが、その中から製品そのものに対してフォーカスすると以下の数点にまとめられます。
- 他社製品と互換性が全くない(MSのようにデファクトスタンダードを取れるなら話は別)
- ライセンス料金が非常に高額で、故に専用機を用意して1台だけで運用などというオカシナ使い方が横行
- ほとんど国内でしか利用されていないので、開発資料が殆ど存在しない
- 1.に関連する事として、他の会社に行ってもそのスキルを活かせない。故に会社に特定の製品に卓越した人材を得にくい。
- 高いライセンス料金の割にサポートがゴミレベル
- 誰でも簡単にプログラミングなしで作れるというセールストークで詐欺まがいの販売をしてる
- その製品の継続性が非常に疑問(会社や製品がなくなる可能性が高い)
- 一般に普及している製品でない為、学習機会が会社以外で存在しない。結果、シナリオ作成も外注してるという本末転倒な事例も。
などなどですね。今現在、RPAは一時期の盛り上がりから現実を知り、停滞ではなく衰退、幻滅そしてコロナ禍とその後に待ってる不況によりIT投資が激減することを考えると、今から国内RPAに手を出すのは正直オススメしません。とりわけ、今回のRPA騒動は食いっぱぐれたSIer連中のボーナスステージが如く高額の料金で利用者から搾取してる事例が多いというのが自分の印象です。ちなみに、Google TrendsによるRPA動向は以下のような感じ。見事に落ちていっています。
Power Automate Desktop無償提供の意味
2021年3月3日ひな祭り - MicrosoftからこれまでMicrosoft365のPower Automate(旧Microsoft Flow)の製品の1つとして存在しているPower Automate DesktopがWindows10に標準搭載され、追加費用なしで利用できるようになると発表。誰でも自由に自身のマシンでRPAを構築する環境が手に入ることになりました。その製品の完成度は別としても、これは非常に喜ばしいニュース。Google WorkspaceにはデスクトップRPAと呼べる製品は無く、またWeb自動化ではPuppeteerがあるものの、要プログラミングのライブラリなので製品とは呼べない。AppSheetはEnterpriseでしか利用できないという有様なので、この分野はMicrosoftに軍配があがりますね。
このリリースは非常にインパクトが大きく、国内の有象無象のRPAの多くはこれで淘汰されて消えることになるでしょう。故に今、国内RPAに手を出すべきじゃないのです。前述の滅ぶべしで記述した項目に対応させてみると
- Windows10およびMicrosoftというデファクトスタンダードを取ってる企業による製品である
- ライセンスは無償。専用機を用意して共用など不要。いつでも自分のマシンでRPAを実行できる(巨大なバッチ処理は専用機用意したほうがいいけれどね)
- 世界企業のMSによるものなので、開発資料は期待できる。また、一般ユーザによるノウハウ公開も大いに期待できる。
- デファクトスタンダードなので、他社に行ってもそのスキルは活かす事が可能(他社でもその製品は普通に存在するでしょう。標準搭載なので)。会社側も卓越した人材を得やすい。
- サポートは不明。これから次第。VBAのように一般ユーザに広がればサポート自体要らなくなるかもしれない。
- そもそも、RPAは誰でも簡単に出来るものではない。それはPower Automateも同じ。ただ開発環境で長い歴史のあるMSの技術力を考えると国内のRPAよりはずっと期待できる
- Microsoftがリリースサポートしてるものであるので、国内の名も知れぬ企業の製品よりも、継続性では遥かに有利。
- Windows10に標準搭載で無償で利用可能なので、学習機会は自宅でもカフェでもいつでもどこでも勉強出来る。
- また、PAD特有ですが、有料アカウントだとPower Automateと連携出来るので、Microsoft365の各種サービス他に処理を繋げる事が可能
何よりも企業でテスト導入するにあたり、コスト不要で出来、うまく動けばそのまま継続すれば良いという点で非常に良い選択肢になるでしょう。他社のRPA導入したはいいものの、結局使わず無駄な出費をしたあげく打ち捨てられる専用機といった悲しい結末は見ずに済みます。
※トリガー機能およびクラウドフロー連携機能は有償ですが、MS謹製を考えたら国内RPAにお金払うよりは価値があるのでは?
図:Microsoft365のEnterpriseなどがあれば使える機能もある
Power Automate Desktopについて
Power Automate DesktopはPower Automateファミリーに追加されてまだ間もない製品です。SoftoMotive社のWinAutomationを買収しベースとしています。その内容はRobinという自動化の言語に対してUIを用意したものとなっています。よって、Robinで記述した内容をコピペでPower Automateに貼り付けるとアクションが生成されたりします。
まだ、バギーな面もあり、変なところをクリックするとよくわからないエラーが出るシーンもありますが、概ね直感的なインターフェースで作れるようになっています。
なお、システム要件その他はこちらのページに記載されています。使っているOSのエディションやログインしてるアカウントの種類によって、実行できる内容に差があります。主な差異は
- Windows10 Homeの場合、Windows Recorder v1は使えません。
- Windows10 Homeの場合、Selenium IDEは使えません
- Windows10 Homeの場合、クラウド連携は実行出来ません。
- Windows10 Homeの場合、プレミアムアカウントの機能が使えません。
- Microsoftアカウントの場合OneDriveにフローは保存。企業アカウントの場合Dataverseに保存される
- プレミアムアカウントのみがクラウドフロー連携やトリガー起動、スケジューリングフローを利用する事ができる
- プレミアムアカウントのみが作成したフローを組織のメンバーと共有可能
- プレミアムアカウントのみが一元管理とレポートを利用できる
- プレミアムアカウントのみがAIビルダーやカスタムコネクタを利用する事が可能
PADを扱う上でのテクニック
Power Automate DesktopやRPAをしっかり扱う上でのいろいろなテクニックをまとめてみました。以下のエントリーも参考にしてみてください。
アプデ情報
2021年3月のアップデート
リリース直後は色々バギーで、なぜか使えないといったものがあったりもしたのですが、以下のアップデートが施されています。
- プレミアムアカウントの場合、共有アイテムに誰かと共有してるフローが表示されるようになった。
- 設定に実行フローのホットキーによる停止やバッググラウンド実行などが追加
- 企業アカウントに於いてかねてより問題だった、Dataverseデータベースが、PADから作成可能になった。
- 変数中の値を実行中に確認できるようになった。
- 最後のエラーを取得アクションが追加。他にも追加されてるみたい。
- マウスカーソル座標をアクション作成中に追えるようになった
- Windows環境変数を取得に於いて、リストからも選べるようになった。
- レコーダー記録中に変数を利用可能になった
- レコーダーでのUI要素追加時のメッセージ。誤訳でCtrl + ← + クリックがきちんと、Ctrl+クリックに訂正された。
あと、リリース直後使えなかったFTP接続ですが、使えるようになってます。ホスト、ポート、ユーザ名、パスワードの設定だけできちんと、自分の契約サーバに接続し、ファイルのFTPにアップロードフローにて、リモートの場所を指定しておけば、自動アップデートができるようになったので、ウェブサイトのファイルの更新なども、PADでバッチリできるようになりますね。
図:FTPが使えるようになったのが一番ありがたい
2021年4月のアップデート
結構早いペースで色々アップデートが実施されてるPADですが、今回のアプデにて割と重要な内容がありました。
- プレミアムアな組織アカウントにて、更新ボタンが追加。Power Automate上のマイフローと共有フローの両方のリフレッシュ更新が可能になりました。
- 既存のフローの複製が名前を付けて保存にてコピーを作る事ができるようになりました。
- デスクトップレコーダーにて、画像を認識してOCRを使った処理をできるようになりました。
- アクションコピーにて、UI要素もコピーされるようになった
- Javaアプレットなどの操作もできるようなったとか
- robin言語のサイトが消滅しました
特に、2.名前を付けて保存で簡単に既存のフローをコピーできるようになった点。これまでは、オリジナルの内容をコピーして、新たにフローを作って貼り付けといった面倒だった手順が簡単にできるようになった点。
そして、これまでのフローのコピーは「UI要素(appmask部分)」についてはコピー出来なかったのが、今回のアプデでその部分もまとめてコピーできるようになったので、コピペのコードで完全な複製を配布したり、取っておく事が可能になりました(単純なUI操作でも、かなりの行数のコードになるので、ウェブ上での配布ではファイルでの配布が必要かも)
図:フローのコードの後半にUI要素が含まれるようになった
図:フローの複製が簡単に
2021年6月のアップデート
今回のアプデで、大きな機能追加がありました。これまで、フローの中でサブフローを呼び出す事は出来ていましたが、サブではなくメインの別のフローをフローの中から呼び出して連続してRPAを実行するという機能が装備されました。前のフローからの結果を受け取ってフロー実行などが出来ます。
手順としては
- 先に呼び出し先のフローを開く
- 右サイドバーにある「入出力変数」の+ボタンをクリックして、入力を選ぶ
- 変数名と外部表示名、既定値などをセットして保存する
- もし、結果を呼び出し元に返したい場合は、「入出力変数」の+ボタンをクリックして、出力を選ぶ
- 4.に続いて、外部表示名と返す値をセットする
- 呼び出し元は、フローコントロールからDesktopフローを実行を追加
- Desktopフローでは先程の呼び出し先のフローを指定
- 入力変数として3.でセットした名前が出てくるので、そのテキストボックスに渡したい変数や値を入力(ない場合は既定値が利用される)
- 同じく返り値を受け取りたい場合は、生成された変数の中にあるスイッチをオンにする(すでに4.での名前が出てるはず)
- 別のフロー実行中は、呼び出し元のフローは一時停止の状態になり、返り値を受け取ると再開します。
また、単純なフローを部品化しておく事で、再利用性が高まり、フローの単純化にも貢献すると思います。
図:フローコントロールに追加されています
図:呼び出される側は変数受け取りを用意しておく
他に実装されたものとして
- RDPやCitrixの操作の際のレコーダーは画像認識ベースに自動で切り替わる
- Windowsの環境変数の取得や削除が可能になった
- Windowsのサービスの開始などが出来るようになった
- MODI OCRが廃止
Power Automate Desktopのアプデ配信通知がリリースから7日後に送られるようになったのも大きいですね。
Power Automate Desktopを使ってみる
インストール
Windows10に標準搭載となると次回の大型アップデート以降に乗っかってくると思いますが、現在でも既にインストーラは利用出来るので以下の手順で利用する事が可能です。今回は、VMware Workstation 14のWindows10(Build 1803)にインストールして検証してみます。
- MSのサイトにアクセスして、無料Downloadをクリックする
- ダウンロードされたSetup.Microsoft.PowerAutomateDesktop.exeを実行する
- 次へをクリックし、インストール先を指定。最後のチェックボックスをチェックして、インストールをクリック
- インストールが完了したら閉じる
- インストール後は、スタートメニューとデスクトップにPower Automate Desktopとして登録されます
※認証プロキシの入ってる環境だとインストールに失敗するケースがあります
※一部の企業アカウントでMicrosoft Dataverse(Common Data Service)が作成されていないため、利用できないというエラーが出ています。管理者による管理センターでのデータベースの追加が必要とのこと。
図:リモートは有償プラン用の設定です
実際に起動してみる
今回はまず、通常のMicrosoftアカウントでログインしてみようと思います。起動時にログインが必要です。ログイン後に国の選択がありますが、一番下の方にある「日本」を選択し、開始するをクリックします。起動直後の画面は簡素で、新しいフローのボタンをクリックしたら作成開始になります。
今回はまず、Excel2019を起動して適当になにかして保存までを自動化してみようかと思います。ただ現在は作成したフローを誰かと共有する機能は有償のプランが必要。
- フロー名は適当に目的に応じて付けます。作成ボタンをクリック
- フロー一覧に出来上がるので、鉛筆アイコンをクリックして編集します。
- 左サイドバーが各種アクションの類、真ん中がフロー作成画面、右サイドバーが変数の処理などを担当してるようです。
図:膨大なアクションの数々
様々なアクションの数々
左サイドバーの数々のアクションの数々。これをフロー作成画面にドラッグアンドドロップして、一連の自動化の流れを作るわけなのですが、非常に膨大にあるだけでなく、なにやらマニアックなアクションもあるようで・・・。見てみると、いわゆるデスクトップRPAとSeleniumを使ったWeb自動化は統合されていて一つになっているようです。
- 変数 - 変数関係の処理。JSONオブジェクトに変換やらリストの処理などもある
- 条件 - 条件分岐関係の処理。ifやswitchなどなど
- ループ - 繰り返し処理。for eachとloopの二種類。javascriptでいうcontinueやbreak処理もある
- 遅延 - いわゆるウェイト処理。ウェブの状態待ちやプロセス、ファイルの待機など
- システム - コマンドライン実行やVBScript、JavaScript、PowerShell、Pythonの実行、シャットダウン、印刷などを担当してる。ただ、Pythonが2.x系だけというね・・・
- ファイル - ファイルの移動やコピー、CSVファイルの読み取りなどの処理
- フォルダ - フォルダの作成やコピー、移動などの処理
- 圧縮 - ZIP圧縮処理
- UIオートメーション - デスクトップアプリのウィンドウの捕捉やフォームへの入力を作成する
- Web - ダウンロードやWebサービス(REST APIを叩く)処理を作る
- Webオートメーション - いわゆるChromeの自動化。データの抽出やフォームの自動入力などを行う
- Excel - Excel操作を担当。ワークシート読み取り、保存、書き込み、マクロの実行、シートの操作など多種多様に可能
- データベース - SQLの実行。ODBCドライバを使っての実行なので、AccessやMySQLもドライバが入っていれば叩ける
- メール - メール送信やメールの処理などを行う
- Exchange - 企業利用でのExchange Serverのメール処理を行う
- Outlook - Outlookを使ってのメール送信やメールの処理を行う
- メッセージボックス - msgboxを出してメッセージを表示
- マウスとキーボード - カーソルポジションの取得とボタンのクリックなどレガシーなアプリ自動化で必須の機能
- クリップボード - クリップボードに一時コピーや貼付けなどを行う
- テキスト - テキストの処理全般を担当。分割、結合、置換、正規表現、トリミングなど
- 日時 - 加算、減算、現在の日付の取得を行う
- PDF - PDFファイルから文字や画像の抽出、ページの分割、統合を行う
- CMDセッション - cmdラインのセッション処理?
- ターミナルエミュレーション - AS400とかにアクセスしてなにかするとか?
- OCR - Tesseract、MODI OCRを使ってのOCRエンジンを利用したり、テキスト抽出を行う
- 暗号化 - AESで暗号化やハッシュ化などを担当します
- サービス - Windowsサービスの開始停止などのコントロールを担当
- XML - XMLファイルのパースから値の取得などを行います
- Active Directory - ADの操作全般を行います
- AWS - Amazon Web Service EC2のインスタンス操作をなぜか行える
- Azure - Microsoft Azureの仮想マシンの操作やリソースグループの操作を行える
- コグニティブ - IBM, Google, Microsoftの持つAI関係のAPI処理を利用出来ます。
- FTP - FTP関係の処理全般を行います。
- フローコントロール - 本フロー全体に於いてサブフローやエラートラップ、コメント、停止などの汎用的な処理
赤:よく使う 青:使えると便利 緑:必要なシーンはありそう という事で色分けしてみました。なぜか、AWSに対応していたり、GoogleのVision API系の画像認識処理や翻訳など、またJavaScriptやVBS、Python、Excelマクロも叩けるなど、RPAオンリーではなくスクリプト言語との連携という結構かゆいところに手が届く感じで用意されてるのがGoodです。
また、ウェブの自動化はSeleniumを使うわけなのですが、こちらの処理に関しては上記のサイドバーから以外に別に用意されています。
レコーディング機能
前述のアクションを使ってマニュアル操作でガリガリ作り込んでいくのが定石なのですが、それ以外にもWebレコーダーおよびデスクトップレコーダーの2つの大きな機能があります。これはExcelのマクロのようにユーザの操作を記録し、フローとして起こしてくれる機能。前者はSeleniumを使ったことがある人ならば結構おなじみの機能ですね。後者はマウスカーソルやキーボードなどの人間の操作をフローとして記録してくれます。
ただし、Excelのマクロでも言えることなのですが、レコーディング機能は色々な要件で完璧に動作は再現しません。あくまでも手動でフローを作るよりも手軽に作れるのでアシスト機能として捉え、レコードした内容を前述のアクションで微調整しながら完成を目指すためにあります。なお、WebレコーダーはSelenium IDEそのものなので、Chromeの拡張機能のSelenium IDEでも記録して利用が可能かもしれない。
Webレコーダー
フロー作成画面上部にあるボタンで実行する。押して見るとどのブラウザを自動化するか?を選択できる。選択をすると自動化の記録が始まる。試しにChromeを選択して、自分のサイトの問い合わせフォームに入力して送信してみる
ただし、Webレコーダーはiframe内の操作は記録出来ない(Puppeteerはできるのですが)。また、reCaptchaは対応していないのでこれも記録されないのでそれらは無しということが前提です。
- インスタンスを指定でChromeを選択する。次へをクリック
- 初回はPower Automate Desktop拡張機能のインストールを求められるので、Get Extensionをクリック
- 拡張機能を有効にするをクリック
- 一度ここで処理をキャンセルしてもう一度1.から実行する
- Chromeと同時にWebレコーダーが起動する
- 記録の開始をクリックするとレコーディング開始。ここからは慎重に操作を行う
- 最後に終了をクリックするとフローが作成されている
- Chromeを閉じる
- 上記のツールバーの実行ボタンをクリックしてみると再現される
- 上書き保存ボタンを押して、フローを保存することを忘れずに。
ウェイト処理やら細かい調整が必要かなぁと思っていたのですが、これくらいの処理ならば微調整は全く必要もなく、ブラウザの読み込み完了まで待ってくれるし、キーボード入力のスピードも非常に高速で正確でした。結構使えるかもしれません。ポップアップダイアログが出た場合の処理が細かなフローのプロパティにも記載されていたりするので、この辺はフルスタックで作らないと行けないPuppeteerよりも手軽なのは間違いありません。
図:主要な4種類のWebブラウザに対応
図:操作の記録中の様子
図:自動作成されたフロー
図:細かなオプションは各フローをダブルクリックで設定可能
デスクトップレコーダー
実は以前、Microsoft Flow時代に一度使った事があるのですが、ちょっと精度が悪くてこちらの機能はまだまだだなと思っていた機能です。いわゆるロケットマウスやらmacOSのAutomatorなどが行ってるジャンルですね。通常のアプリを起動し、マウスやキーボードでの操作を記録し、再現する機能なのですが、モニター解像度やマウス座標、また例外処理など色々考慮しなければならない項目が多いので、Web自動化よりも難易度は高めです。
フロー上部にあるデスクトップレコーダーをクリックして記録します。今回は自作のとあるツールで2つのファイルを読み込ませて、仕込んでおいたマクロを実行するという単純なものをやってみたいと思います。
- デスクトップレコーダをクリックする
- デスクトップレコーダが起動するので、記録の開始をクリックする
- 自前のマクロの入ったxlsmファイルを起動する
- 自作のリボンのコマンドを使って、シートを2枚読み込んで、処理を実行。最後に終了メッセージをクリックして閉じる
- 最後にデスクトップレコーダの終了をクリックする
非常に単純な処理ですが、Excelにはマクロが入っておりそちらで複雑な処理はやらせています。作ってみた感想ですが、結構クセが強めかもしれませんが、この単純な処理では以下の2点に注意すればきちんと実行して正確に完了することが出来ました。
- 操作記録中に別のウィンドウなどをクリックしたりして処理を間に挟まない
- 記録する時は、ホイホイ次のマウス操作をするのではなく、赤い枠がきちんとそのアイコンやボタンを捕捉するまで待ってからクリックすること(Ctrl+クリックです)
- 自作のリボンタブはきちんと捕捉してくれました。
- タブのアイコンをクリックすると、ファイル選択ダイアログが出ますが、こちらも2.をきちんと意識して一個ずつ丁寧に動作をさせて記録します。
- デスクトップに配置した2つのファイルを選択後、シートに取り込まれ、最後にメッセージボックスが出るのですが、これも2.を意識してボタンをクリックすればきちんとポップアップメッセージを閉じる事が可能です
特に微調整を施すことなく、Excelマクロを実行してファイルを取り込み処理まで行わせる事ができました。以前使った時よりも遥かに精度は上がっていると言えると思います。
また、Power Automate DesktopはJavaScriptやPython、VBS、さらにはExcelのマクロを直接実行できる点からも複雑な処理は、RPAではなくそれらスクリプトにやらせて、全体の大きな処理のフローをRPAとして構築するのが正しい使い方といえます。全てをRPAで行わせるのは、メンテナンス面や実行確実性の観点からも愚策です。簡単な処理だったら問題ないですが、Excelの操作はVBAが一番確実に処理を行ってくれます。
(今回の2シート取り込みとその後の処理はRPAで組むには条件分岐や配列処理、ループ処理があるので、作り込むと後が大変です)
※VMware Fusion内でPower Automate DesktopでUIFlowのクリック捕捉は、Control+Command+クリックになるので注意
図:デスクトップ記録も基本は同じ
図:細かな調整ももちろん可能
ちょっとしたテクニック
Power Automate Desktopはまだ一般に無償公開されてから間もない為、いくつか「これはどうしたら良いのか?」というシーンがあります。これまでTwitterなどでツイートされていたものなどを元に検証をしてみました。
アクションはコピペしてテキスト保存もできる
Power Automate Desktopに構築した個々のアクションですが、他でも流用したいと思ってもどうしたら良いのか?同じフロー内ならば右クリックでコピペが出来ますが、実はこれコピーするとわかるのですが、Robin言語そのものがコピーされています。以下のようなものがコピーされているわけです。
Ctrlキーで複数まとめてコピーしておけますから、テキストエディタなどでフローを保存しておく事が可能です。よって、他のフローに対してコピーしたものを持っていくことが可能です。なぜか、Power Automate Desktop上ではそのフロー自体を複製する手段がないのですが、フローはWeb版のほうから、全く同じフローを複製することも可能です(有償プランのみ)。
1 2 3 4 5 6 |
@@timestamp: '2021-03-03T02:35:46.6377841Z' WebAutomation.FormFilling.PopulateTextField BrowserInstance: Browser Control: appmask['Recording']['input 3'] Text: 'テスト' @@timestamp: '2021-03-03T02:35:52.8587063Z' WebAutomation.FormFilling.PopulateTextField BrowserInstance: Browser Control: appmask['Recording']['textarea'] Text: 'テストだよ' @@timestamp: '2021-03-03T02:36:13.0894470Z' WebAutomation.FormFilling.PressButton BrowserInstance: Browser Control: appmask['Recording']['input 4'] |
現在、無償版では他人と共有したいと思ってもそのままでは共有は出来ないのですが、上記のようにコードで取っておけるので、一般公開したい場合や、他人に配布したい場合は、テキストの形で配布し、利用者はコピペをすればアクションを復元する事が可能です。Githubなどを使えば、コードの保管や差分管理も出来るのではないかと思います。
Power Automate Desktopへの貼り付けは普通に上記のコードをCtrl+Vを実行するだけ。
※但しコピペできるのは、フローだけ。UI要素(Ctrl+クリックなどでアプリのテキストボックスなどの場所の情報)などは、フロー内にはなく、appmaskのほうに入ってしまってるので、コピペ出来ません。なるべく、UI要素に頼らないフローを作りましょう。(2021/04のアプデで、UI要素のコピペもできるようになりました)
何よりすごいのは #Robin で記述したソースコードをそのままPower Automate Desktopに貼り付けるアクションとなり実行できることです。
これにより #PowerAutomateDesktop の開発はコーディングで行える可能性があり、また、コードでの管理や差分チェックも行うことができるのかなと期待しています。 https://t.co/zEgFZbiwaS pic.twitter.com/STNmbY7q6q— Maekawa (@HiMaekawaSan) September 30, 2020
作成したフローはOneDriveに保存されてる
通常のMicrosoftアカウントの場合、作成したフローはOneDriveの中の「アプリ」→「Power Automate for Windows」のフォルダの中に保存されているようです。ただしファイル名はランダムな数字で、ファイルの中身はBase64でエンコードされて文字列化されてる。ファイルで共有したりバックアップ?というのは難しいみたい。
有償のMicrosoft365アカウントの場合、DataverseというPower Platformのデータベース内に同様に保存されているようです。このファイルはおそらくRobinという言語で書かれたフローのコードが格納されているのではないかと話。実行時にPower Automate Desktopにキャッシュされて実行されてるようです。
図:ファイルでやり取りできたらいいのにね
キャッシュされたファイルについて
Power Automate Desktopで作成したフローを実行すると、以下のフォルダにキャッシュされて実行されてるようです。そこには拡張子robinというファイルが生成されており、これはrobin editorにて開けるようになっています。
1 2 |
//キャッシュされてるフォルダの場所 %USERPROFILE%\AppData\Local\Microsoft\Power Automate Desktop\Console\Workspace |
ただし、Robin Editorで実行しても動くケースと、Power Automate Desktopでないと動かないケースがあり、100%互換ではなく、ベースとして拡張されてるからという事で、対応していない場合も大いにあります(OCR関係など特に)
図:実行時にソースコードがキャッシュされる
図:Robin Editorで開いてみた
直接他のEXEを実行するテクニック
Power Automate Desktopのアクションの中には、EXEをフルパス指定で実行するといったようなアクションはありません。用意されてる手段で使えそうなのが、VBS実行、PowerShell実行、DOSコマンド実行の3つ。
VBSで実行は、こちらのコードを使ってやってみたところ
- ドキュメントフォルダ以下のEXEであれば起動する事ができる
- しかし、Programフォルダ以下のEXEは起動に失敗する(管理者権限が必要?)
DOSコマンド実行の場合もそのままでは同じ結果だったのですが、対象のEXEのショートカットをデスクトップに作っておき、DOSコマンドの実行で以下のようにすると起動させることが出来ました。
- start "dummytitle" "デスクトップのlnkへのフルパス"
この場合、DOS窓でstartコマンドにてlnkを叩いてるだけなので、無事にProgramフォルダ以下のプログラムでも起動出来ました。
フローの中から他のフローを実行
使い道があるかどうかわかりませんが、Power Automate Desktopのフローの中から、別に作ってあるフローを呼び出す事が可能です。手順は以下の通り。
- ウィンドウ内のボタンを押すアクションを追加する
- ダブルクリックで編集する
- UI要素をのドロップダウンをクリックする
- 新しいUI要素の追加をクリック
- Power Automate Desktopのフロー一覧画面を出し、Ctrlキーを押しながら、そのフローの実行ボタンをクリック
- 完了をクリック
- 3.の一覧から5.で追加した要素を指定する
- フローを実行すると、Power Automate Desktopの5.で指定したフローを実行してくれる
図:UI要素の追加でフロー一覧のボタンを追加
PowerShellを使って名前指定でフローを実行
きぬあさ氏がPowerShell + UI Automationを利用して、名前を指定して特定のフローを実行する手段を開発されました。ps1を叩くだけで実行出来るので、タスクスケジューラ等を利用すれば、時限実行も可能なのではないかと思います。
UWSCを使ってフローを実行
次項にあるRobin.exeと似てるものの、もっと手軽に他のEXEからフローを実行したい!となった場合、古より使われてきたUWSCを使って、Power Automate Desktop自体を操作する事が可能です。今回、特定のフローを指定してUWSCで作成されたEXEを使って実行のできるPadFlowRun.exeを試してみました。
使用手順は以下の通りです。
- こちらのサイトよりPadFlowRunをダウンロードする
- 解凍をすると、EXEが入ってるので、実行してみる。
- メッセージがでるので「はい」をクリックすると呼び出すコマンドラインがクリップボードにコピーされる
- 例えば、テキストエディタに貼り付けて、フロー名だけを自分のPADのフロー名に書き換えて、拡張子BATで保存する
- 実行するとPadFlowRunがPAD上で検索し、該当のフローを自動実行してくれます。
他のプログラムから簡単にPADを呼び出して実行ができるので、例えばタスクスケジューラに登録して呼び出すといった事も可能です。
- Windows10の検索窓からタスクスケジューラを実行する
- タスクスケジューラライブラリをクリックする
- 右側の「基本タスクの作成」をクリックする
- 名前を適当につけて、次へ進む
- トリガーは今回「毎日」を指定してみます。次へ進みます。
- 開始する日時を指定。間隔は1日。次へ進みます。
- 操作では、プログラムの開始を指定します。
- プログラム/スクリプトを指定します。例えば前項で作ったBATを指定したり、PadFlowRun.exeを指定して、引数にフロー名を指定したりします。次へ進みます。
- 完了をクリックします。
- これで、タスクスケジューラで実行されます。
細かいタスクスケジューラの発火タイミングを指定すれば、PADを極めて細かく柔軟に実行させる事が可能になります。
図:EXEが一個のシンプルなプログラムです
Robin.exeでPower Automate Desktopのフローを実行
Power Automate Desktopをなんらかの手段で直接対象のフローを他から実行したいなと思うと、当然Power Automate Desktopでは作れません。しかし、Robin Editorで作ったフローからは呼び出せるので、以下のような形で、Robin Editorでフローを作って、Power Automate Desktopの特定のフローを実行できるようにしてみました。
※但し、Power Automate Desktopの正式リリースに伴いサイトは消滅しました
- Robin UI Spyを起動する
- Add Controlをクリック
- Ctrlキーを押しながらPower Automate Desktopの特定フローの実行ボタンをクリック
- 右上の名前を今回はcalcmanとして付けて、winman.appmaskとして保存
- Robin Editorを起動する
- 以下のようなコードを記述して、script.robinとして保存する
- Power Automate Desktopを起動しておく
- DOS窓を開いて、robin.exe run script.robinを実行する
実行すると、起動してるPower Automate Desktopの特定のフローの実行ボタンが押されて、PAD側でのフローが発火します。
※タスクスケジューラなどでこの8.のDOS窓コマンドをBATファイルにでもしておけば、RobinからPADのフローを時限発火させる事ができるのではないかなぁと期待
1 2 3 |
IMPORT 'winman.appmask' AS appmask UIAutomation.Click Element:appmask.calcman.Button ClickType: UIAutomation.ClickType.DoubleClick OffsetX: -15 OffsetY: -10 MousePositionRelativeToElement: UIAutomation.RectangleEdgePoint.MiddleCenter |
図:appmaskを作成してる様子
図:Robinでフローを手動で構築する
図:robin.exeで実行してフローを実行
こんな感じにコマンドラインから実行する
ミリセカンドのウェイトを入れたい
Power Automate Desktopである処理の前にウェイトを入れたい場合、現在は指定できるのが「秒」単位です。環境によってはこれだとちょっと遅いなぁと思うシーンもあるでしょう。
この対策ですが、意味のないキーの送信アクションを入れる事で、標準のウェイトの代わりにミリセカンド単位でのウェイトを実現可能です。意味のあるキーだとテキストが入力されたり、コマンドが実行されてしまうので注意。
このテクニックを使う事で0.5秒のウェイト等が実現できれば標準よりも早くアクションを実行できるので処理時間の短縮が出来ます。
図:意味のないキーでウェイトを代替
テキスト置換で空白を使いたい
いろいろなプログラムのコーディングでも、値を上書きではなく「空白」で置き換えることは結構あります。入ってる値を空にしたいわけなのですが、Power Automate Desktopだと空のままだとフローを保存出来ません。
置き換え先のテキストには「%''%」とシングルコーテーションの空文字を%%で括ったものを指定することで、空で置き換えられます。
以下のようなフローの場合、元の変数の「とうもろこし球場」という値は、球場部分を空で置き換えるので、メッセージには「とうもろこし」だけが表示されます。
図:簡単な置換のフロー
図:置き換えるには空の変数を使う
ショートカットキーを送信したい
RPAと言っても、あらゆるマウス操作をゴリゴリ記憶する方法だと非常にメンテナンス性が悪いだけでなく、確実性に劣り、またスピードも遅くなります。その場合、マウス操作ではなくキーボード操作を組み合わせることで、ダイレクトにその機能を呼び出したり実行ができるので、手数の削減になります。
通常キーの送信では、テキスト入力欄に入力したい内容を送るものですが、キーコードの送信も可能です。また、複数の組み合わせたキーである「ショートカットキー」も送れるので、印刷であったりプログラムの終了などのCtrl+Pや、Alt+F4などのキーを送る事が可能です。Alt+F4を送り込みたいのであれば、以下のようなコードを送信するテキストに記入します。
{Alt}({F4})
見たままなのですが、@マークなどの特殊文字はそのままでは入れられず、{Oem3}が@マークになります。Enterなどはそのまま{Enter}です。押したまま別のキーとなった場合、二個目のキーを()で括れば、これでショートカットキーとなります。
特殊なキーはこちらの仮想キー一覧を参考にすると組み立てやすくなるのではないかと思います。
図:マウス操作を記録すれば良いってもんじゃない
URL Schemeを活用する
上記のキーコード送信同様、ウェブなどのアプリ(ローカルアプリもだけれど)にはURL Schemeと呼ばれるものが存在します。例えばTeamsを起動して操作したい場合、長々としたフローを作成して人を探してなんてやってたら、非常に面倒くさいのでここでもURL Schemeが活躍します。今回はデスクトップ版のTeamsを起動し、対象のアドレスの人を呼び出し、メッセージの入力までをやってみますが、非常に簡単です。
- Power Automate Desktopでフローを作成する
- フローに、VBScriptの実行を追加する。
- ダブルクリックして、以下のスクリプトを記述する
- 実行すると、ダイレクトにその人とのチャット画面が立ち上がり、メッセージが入った状態になります。
この1ターンだけで、Teamsの対象者のチャット入力欄を表示してメッセージまで入れた状態に遷移出来ます。マウスでやってたら大変な事です。後は送信をクリックするアクションを入れればこれで、Teamsでメッセージが送信出来ます。自作のアプリにURL Schemeを搭載すれば、同様の事が実現可能です。
もちろん、https://から始まるURLでも同様の事が可能です。
1 2 3 |
Dim ws Set ws = WScript.CreateObject("WScript.Shell") ws.Run "msteams:/l/chat/0/0?users=ここにメアド&message=ここにメッセージ" |
図:フローの一つとして使えます
Python3スクリプトを実行
現在、Power Automate Desktopはなぜか、Python 2.x系のスクリプトしか実行する事が出来ません。すでにもうPython 2.xは長い歴史に終止符を打ってサポート終了済みなのですが。そのため、現在主流のPython 3.x系はアクションから呼び出すには、コマンドラインやPowerShellなどを使って呼び出すことになります。
以下のようなPython3スクリプトを実行してみます。
※Pythonは様々なライブラリのおかげで強力な自動化を実現できるスクリプト言語なので、RPAで無理に作らずPythonで処理をやらせて他への橋渡しにPower Automate Desktopを活用すると有効活用できるでしょう。
1 2 3 4 5 6 7 8 9 |
from tkinter import messagebox def world(): messagebox.showinfo("test", "抹茶が飲みたい") strings = 'Hello, World!' print(strings) return world() |
test.pyとしてデスクトップに配置したこのスクリプトの実行結果は、stringsとしてprintされたものを返り値として受け取ります。コードとしては以下のようなコードになります。
1 2 3 4 |
Folder.GetSpecialFolder SpecialFolder: Folder.SpecialFolder.DesktopDirectory SpecialFolderPath=> SpecialFolderPath SET NewVar TO $'''%SpecialFolderPath%\\test.py''' System.RunPowershellScript Script: $'''python %NewVar%''' ScriptOutput=> PowershellOutput ScriptError=> ScriptError Display.ShowMessageWithTimeout Title: $'''返り値''' Message: PowershellOutput Icon: Display.Icon.None Buttons: Display.Buttons.OK DefaultButton: Display.DefaultButton.Button1 IsTopMost: True Timeout: 3 ButtonPressed=> ButtonPressed |
図:こんな感じで呼び出して出力を受け取る
再インストール後にエラー頻発
再インストール後に何度フローを作って保存しようとしても、「The cache contains multiple tokens satisfying the requirements. Try to clear token cache」といったようなエラーが出て保存出来ないケースがあります。せっかく作ったのに保存できず唖然とします。自分の場合、先程でましたが、再度作った場合きちんと保存出来ましたが、ちょっと具合が悪いですね。
コミュニティの報告によると、これは再インストールもしくは新版で上書きインストールした場合に、LocalAppData以下のPADフォルダ内にゴミが残ってるのが原因のようなので、アンインストールし該当のフォルダを削除後に再インストールで解消するようです。
該当のフォルダですが、アンインストール後に
- エクスプローラを起動する
- パスの所に「%LocalAppData%\Microsoft\Power Automate Desktop」を入力
- この中にあるファイルを削除して、再インストール
- ログインし直す
データそのものはクラウド上に残されてるので、ログインできれば復元されます。このエラー以外でも、Object reference not set to an instance of an object.Errorといったエラーでも同様の効果があるようです。
図:変なエラーが結構出る
ZIP解凍で日本語文字化け
PADにファイルの解凍というアクションがありますが、これがZIP解凍のアクションになります。しかし、実際にやらせてみると日本語ファイルが文字化けします。おそらく内部的に文字コードの処理がオカシイというローカライズ上のよくある問題かと。しかしこれでは利用者側は困るので、7zipのコマンドライン版を使って解凍できるように組んでみた。
予め、7zipコマンドライン版をドキュメント直下の7zフォルダ内に配置して、7za.exeへのフルパスを取得しておきます。
- 特別なフォルダー取得で、デスクトップを取得するフローを追加(desktoppathで設定)
- 変数を設定で、デスクトップにあるzipファイルのフルパスを1.と組み合わせて追加(zipfileで設定)
- DOSコマンドの実行にて、「7za.exeへのフルパス x -y -o%desktoppath%\zipman %zipfile%」といったコマンドラインを追加(zipmanフォルダに強制解凍)
- IF文を追加し、CommandErrorOutputが空の場合は成功したメッセージを表示し、そうでない場合はCommandErrorOutputの内容をメッセージで表示するエラートラップを追加
ソースコードとしては以下のようになります。もちろんパスワード付きも解凍出来ますし、7z形式も行けます。
1 2 3 4 5 6 7 8 |
Folder.GetSpecialFolder SpecialFolder: Folder.SpecialFolder.DesktopDirectory SpecialFolderPath=> desktoppath SET zipfile TO $'''%desktoppath%\\nodepj.zip''' System.RunDOSCommand DOSCommandOrApplication: $'''ここに7za.exeへのフルパス x -y -o%desktoppath%\\zipman %zipfile%''' StandardOutput=> CommandOutput StandardError=> CommandErrorOutput ExitCode=> CommandExitCode IF IsEmpty(CommandErrorOutput) THEN Display.ShowMessage Title: $'''メッセージ''' Message: $'''解凍が完了しましたよ❤''' Icon: Display.Icon.None Buttons: Display.Buttons.OK DefaultButton: Display.DefaultButton.Button1 IsTopMost: False ButtonPressed=> ButtonPressed ELSE Display.ShowMessage Title: $'''エラー''' Message: CommandErrorOutput Icon: Display.Icon.None Buttons: Display.Buttons.OK DefaultButton: Display.DefaultButton.Button1 IsTopMost: False ButtonPressed=> ButtonPressed2 END |
図:excelファイル名が文字化けてる
図:7zipはバッチリ解凍できる
有償のプランで使ってみる
今回の無償化でPower Automate Desktopの主要な機能は誰でも今すぐ利用可能になりましたが、有償のプラン(Microsoft365のEnterpriseや単独でPower Automateを契約してる方々)にだけ利用できる機能というものもあります。サラっとだけですが調べてみました。Microsoft365のアカウントでログインを行います。自分のプランではさらに上位のプレミアムは使えないのですが、プレミアム契約を行うと、プレミアムクラウドコネクタ、フローの自動実行、監視機能などがさらに使えるようになるみたいです。
※但しプレミアム契約の殆どは今回のデスクトップフローの為ではなく、通常のPower Automateの為の機能なので、デスクトップ利用の場合はあまり契約する意味はないかもしれません。
Dataverseデータベースが見つかりません
Microsoft365アカウント(法人アカウント)を使って、早速試してみましたが、自分の場合会社の方ですでにPowerAppsなどを活用してることもあって、何事もなく動作していますが、twitterを見てるといくつかの人が「Microsoft Dataverseデータベースが見つかりませんでした」というエラーで、Power Automate Desktopが動かない人がいるようです。
これは、その法人のMicrosoft365の管理者がきちんと設定をしていないのが原因です。以下の設定が必要になります。
- 管理センターに入る(管理者アカウントのみ)
- 左サイドバーの環境をクリックすると、下の方にデータベースの追加がある
- データベースの追加をクリックすると、言語は日本語を指定し、通貨はJPYを指定する。
- 適当にユーザとアクセス許可を設定しておく
- 保存してから10分くらいで反映し、タスクトレイにいるPower Automate Desktopを一旦終了し再度、立ち上げ直す
- すると、エラーが解消し作れるようになる。
以上は、Twitterからの情報でした。この設定関係のドキュメントはMS公式ページにも記載がされています。また、以下の手順でも同様にdataverseが作成されて利用可能になるそうです。
- Teamsにログインする
- 左下にあるアプリを開き、「承認」を検索してクリックする。
- 承認者欄は自分自身を入れる
- 送信する
- なぜか、Power Automate Desktopでのエラーがなくなる
— きりの (@imksoo) March 3, 2021
図:このエラーが出たら設定が必要
図:Teamsで承認フローを作ると使えるようになるみたい
AzureADアカウントでサインイン時
自分もActive Directoryのアカウントでサインインしているのですが、自分のケースでは遭遇していないものの、一部の企業での構成上の問題?なのか、Azure ADアカウントでサインインしようとするとサインインに失敗する事例があるようです。
この解決法ですが初回サインイン時に以下の手順で入ることが出来たとの報告あり。
- 個人のMicrosoftアカウントで入力する
- すると、アカウント選択画面が出てくる
- そこでAzure ADアカウントを選択してサインイン
これで入れるそうで。理由は不明ですが、何度やっても入れない人はお試しあれ。ブラウザのキャッシュ削除であったり、資格情報マネージャに登録されてるAzure ADの情報を削除するのも効果はあるかもしれませんが、ちょっとリスキーなので、管理者になぜこうなるのか?を問い合わせするのが一番良いでしょう。
作成済みフローの共有
有償プランの人は、作成したデスクトップフローを組織の人間と共有することが可能です。ただ、プログラムの不具合?なのか、Power Automate Desktop上では共有する機能がなく(共有アイテムはあるのだけれど出てこず)、ウェブのPower Automateにログインして作業をしました。
- ウェブのPower Automateにログインする
- 左サイドバーのマイフローをクリックし、メイン画面の「デスクトップフロー」をクリックする
- Power Automate Desktop側で作成したフロー一覧が出てくる
- 共有ボタンがあるので、それをクリックする
- ダイアログボックスのユーザを追加に、メアドを入れる
- アクセス許可は、ユーザ(実行のみ)もしくは共同所有者(編集可能)を割り当てる
- 共有をクリックすると、共有した人間もフローを利用することが出来るようになります。
無償版でも前述のように、フローをテキストにコピペして渡す事ができるので、この集団で相手と共有すれば良いでしょう。
図:作成シナリオを横展開出来ます
指定時刻にフローを実行
Power Automate Desktop自体に指定時刻に作成したフローを自動実行するような仕組みは存在しません。しかし、Power Automateそのものに「スケジュール済みクラウドフロー」というものがあり、こちらを利用して、クラウド側から指定のデスクトップマシンのPower Automate Desktopで作成されたフローを実行できるようです(自分のプランと環境ではちょっと試せなかった)。手順としては、以下の通り。
- 事前にon-premise data gatewayのインストールが必要です(ここで複雑なネットワーク構成の会社だとゲートウェイ用メアドの登録に失敗する)
- ウェブのPower Automateにログインする
- 左サイドバーの作成をクリックし、スケジュール済みクラウドフローをクリック
- 適当な名前、実行開始日付と時間、そして実行間隔を指定し作成をクリックする
- フロー作成画面で、新しいステップをクリック
- コネクタでは、「デスクトップフロー」を選択する
- アクションに於いて、Power Automate Desktopで構築したフローを実行(Premium)を選択する
- 1.でセットアップが完了できれば、ゲートウェイ名の選択でゲートウェイが出てくる
- ドメインとユーザ名は組織のADのdomainとユーザ名を円マークで結合したものを入力する
- そしてログインパスワードを入力
- 作成をクリックして完了
これで指定時刻で例えば1日置きに実行などが出来ます。非常に面倒な手順なので、条件判定と変数を利用して、変数にある指定時刻かどうかを判定し指定時刻になったら実行のようなトリッキーな手のほうがマシかもしれない。
※指定時刻ではなく例えば特定のメールを受信したら実行といったトリガーを起点として発火させる場合も同様の構築が可能になっています。ただMSに望む事はこんなのは、クライアント側のアプリで対応することなので、ゲートウェイなど使わず、タスクスケジューラで実行出来るようにすべきだということ。わざわざなんでクラウド側から面倒な仕組み使ってやらせてるのか。
図:例えば深夜に大きなバッチ処理やらせる等で使用
図:フローでは各種設定が必要
Power Automate Desktop側からPower Automateを実行
有償プランに入ると、前述のようにPower Automate側からPower Automate Desktopのフローを連続して実行出来るので、何かをトリガーにしてPower Automate Desktopを実行可能なのですが、現実、どちらかというとクラウドファーストではない企業のほうが多かったりするのと、思ったほどタスクランナーって使わないので、むしろ、Power Automate Desktop側からPower Automate側を叩いて、ウェブサービスを動かすほうが需要が高いと思います。
Premiumアカウントの場合、以下の手順でPower Automate Desktop側からPA側を叩けるので実行結果をTeamsに投稿などは簡単に実現可能です。
- Power Automateにログイン
- 左サイドバーからマイフローに入り、新しいフロー⇒インスタントクラウドフローを選択
- 最初に選ぶトリガーは、「HTTP要求の受信時」を選ぶ
- 要求本文のJSONスキーマは以下のようなものを入力します。
- 続けて、アクションとして、Teamsのメッセージを投稿するV3をつなげます
- 既に作ってあるチームを選びます。また、その中のチャンネルを選びます(チャンネルが1個の場合はGeneralを選ぶ)
- メッセージ本文には、動的なコンテンツの中から、3.のmessageを選びます。
- 保存すると、3.にPOST用のURLが生成されるので、これをコピーしておく
- このURLをPower Automate Desktopで使うのですが、そのまま貼り付けると構文エラーになるので、こちらのサイトでURLデコードする
- Power Automate Desktop側で、Webサービスを呼び出しますアクションを追加する
- URLに9.のデコードしたURLを入力
- メソッドはPOSTを選択
- コンテンツタイプはapplication/jsonを指定する
- 要求本文は今回はシンプルに{"message":"hello world"}を入れておきました。
- 詳細を開いて、要求本文をエンコードしますのチェックは外しておく
- 保存して、Power Automate Desktop側から叩くと、3.のPA側アクションが実行されて、14.のメッセージが渡されて、5.のTeamsにメッセージが投稿されます。
このPower Automate側のフローにさらに続ければタスクランナーできます。
1 2 3 4 5 6 7 8 9 10 11 |
{ "type": "object", "properties": { "channel": { "type": "string" }, "message": { "type": "string" } } } |
Power Automate Desktop側のコードは以下のような感じ
1 |
Web.InvokeWebService Url: $'''ここにPA側のPOST用URLを入れる''' Method: Web.Method.Post Accept: $'''application/json''' ContentType: $'''application/json''' RequestBody: $'''{\"message\":\"hello world\"}''' 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 |
図:PA側のPremiumコネクタを利用します
図:URLデコードが必要です
図:PAD側の設定内容
気になる機能でRPAを作ってみた
今回のPower Automateにていくつか気になる機能で簡単なRPAを作ってみようと思います。サクっと色々試してみた感想は、これは他のRPAにも言えることですが、プログラミングの考えが習得出来てる人は、学習コストは低いです。そうでない人は、条件分岐やインスタンス、エラー処理などなど一連の「基礎知識」はやはり必要。といっても、実際にVBAとかでゴリゴリ最初から勉強するよりは、はるかに低コストです。
OCR機能
今回は既存で用意されていて今すぐ使えるMODIおよびTesseractの2つをテストしてみましたが、もうひとつコグニティブ→Microsoft→Computer Visionにも別のOCR APIが用意されています。Googleにもビジョンにテキスト検出などのVision APIの項目がありますね。有償のサービスですが、無償枠もあるので試してみる価値はありそうです。
MODI OCR
※6月アップデートで廃止されました
Power Automate DesktopのOCRは2種類のエンジンが利用できるのですが、この中でMODI OCRは現時点では多くの人が使えず、また非常に古いエンジンなのでものすごく読み込む画像を選びます。よって実用するにはちょっとアレな機能ですが、やってみました。
事前にOffice2007に含まれていたMicrosoft Office Document Imagingというものが必要でこれがMODIの本体です。無償化されたSharePoint Designer 2007にも含まれていたようですが、現在はもう配布されていません。そこで、Webarchiveを利用して入手し(430MBもある)、Office Document Imagingのみをインストール後に再起動して、以下の画像を読み込んでみました。
図:Wikipediaのとあるテキストを画像化しておいた
以下の手順でRPAを組んでいます。
- MODI OCRエンジンを作成を追加。
- OCRを使ってテキストを抽出を追加。OCRソースはディスク上の画像で、ファイルパスでフルパスを指定。OCRエンジンは1.で作ったエンジンの変数を指定します。
- テキストファイルに書き込みますを追加。ファイルパスはフルパスでresult.txtを指定。書き込むテキストは2.の変数を指定。上書きでエンコードはUnicodeを指定
これで実行するのですが、いろいろな画像を読み込ませましたが、殆どでエラー。認識できない文字や記号があるとNGのようです。
図:3つのステップのみで構築
OCR結果は以下の通り
京王 6000 系電車は、京王電鉄京王線用の通勤形電車である。 1 972 年から 1991 年に 304 両が製造され、 20n 年まで運用された。都営地下鉄新宿線乗り入れを前提に設計され、京王で初めて 20m 級の車体を採用した。京王線全線・都営地下鉄新宿線で運用されたのち、 1 998 年から 20n 年 3 月にかけて事業用車に改造された 3 両と静態保存された 1 両を除いて廃車・解体された。三多摩地区開発による沿線人口の増加、相模原線延伸による多摩二ュー夕ウン乗り入れ、都営地下鉄 10 与線く後の都営地下鉄新宿線、以下、新宿線と表記する)乗入構想により、京王線の利用客増加が見込まれ、相当数の車両を準備する必要に迫られるなか、製造費用、保守費用を抑えた新型車両として 6000 系構想された。 … …
Tesseract OCR
もう一つ用意されてるOCRエンジンがTesseractで、オープンソースで開発されてるOCRエンジンです。結構昔から開発されてるようで、現在最新版は、v5.0として用意されています。実際に使ってみましたが、MODIと違って読み取れる画像を選ぶといったこともなくて、問題なく取り込めました。
しかし、Power Automate Desktopで標準で用意されてる読み取り先言語が英語やスペイン語など5ヶ国語のみで、日本語が入っていません。ということで以下の事前準備をします。
- このページにあるインストーラをダウンロードしてインストールする(今回は64bitを選びました)。
- インストール後、インストール先にあるtessdataというフォルダを適当にデスクトップにコピーする(この中に日本語の言語ファイルが入ってる)
今回は以下のファイルを読み込ませてみました。
図:結構複雑な文字が混じってるWikiのとあるページ
以下の手順でRPAを組んでいます。
- Tesseract OCRエンジンを作成を追加。ダブルクリックで設定を変える
- 他の言語を使うのスイッチをオンにして、言語の省略形はjpnを指定。言語のデータパスはデスクトップにコピーしたtessadataを指定する
- OCRを使ってテキストを抽出を追加。OCRソースはディスク上の画像で、ファイルパスでフルパスを指定。OCRエンジンは1.で作ったエンジンの変数を指定します。
- テキストファイルに書き込みますを追加。ファイルパスはフルパスでresult.txtを指定。書き込むテキストは2.の変数を指定。上書きでエンコードはUnicodeを指定
これで実行させてみました。オプション設定以外は特にエラーもなくすんなり読み込めました。若干オカシナ部分もありますが、大体きれいにOCR出来ています。
図:ここのオプション設定が肝です
OCR結果は以下の通り
子実体は高さ5-8cmあるいはそれ以上に達し、頭部と明瞭な柄とで構成される。頭部は全体としては歪んだ球状をなし、表面には著しい凹凸やしわを生じて脳状の外観を持ち、黄褐色ないし赤褐色を呈する。柄は太く円柱状でしばしば浅い縦じわを有し、類白色ないしクリーム色で多少ざらつく。縦断面では、頭部は一枚の円盤状の子実層所 (胞子形成部結実部 : Hymenophore) が複雑かつ不規則に折りたたまれた構造を有し、柄の内部にもしばしば不規則な空隙を生じている。
子裏は細長い円筒状ないしこん棒状を呈し、無色で大形かつ薄壁、ヨウ素溶液で青く染まらず (未熟な子電では細胞質が黄褐色に染まるが、青変することはない) 、先端に薄い円盤状で明瞭な蕎 (Operculum) を備え、内部に8個の子衰胞子を生じる。子要胞子は広椿円形で無色・薄壁
10パーセントの水酸化カリウム水溶液中で観察すると両端にさく低いクッション状をなした附属体 (Apicula) が認められ、ヨウ素溶液で呈色することはなく、しばしば2個の小さな油滴を含み、1個の核を有する。 子裏に混じって、無数の側糸 (不稔菌糸) が見出され、少数の隔壁を有し、その先端は僅かに膨れるとともに赤褐色の占粒を含んでいる。 子実体を構成する菌糸は無色・薄壁で、隔壁部で弱くくびれることがあり、かすがい連結を持たない。柄の表面においては、菌糸の先端が洋ナシ状ないし球状に膨れるが、顕著に発達した表皮上層をなすことはない中!。
Google Cloud Vision API
前述2つのOCRは正直前時代的というか、古い時代のOCRの仕組みであるため、精度は正直良いとは言えません。そこで使うのが有償になりますが、Google Cloud Vision API。コグニティブにあるアクションでかなり簡単に利用出来ます。
MicrosoftのAzureにもComputer Visionという同様のAPIが用意されていますが、Azureは個人的にごちゃごちゃしていて使いにくいので、GoogleのAPIを自分は使ってます。
スクショを取ってメールで送る
とあるアプリで画面にエラーが出て、ヘルプデスクに助けを求める。スクショを取って⇒なぜかExcelに貼り付ける⇒メールに添付して⇒ヘルプデスクのアドレスを入れて⇒本文書いて⇒送る。こんな処理なのですが、まずスクショのとり方知らない人が多い。よしんば知っていてもなぜかExcelに貼り付けて送ってくるものだから、画像が小さすぎて見えない・・・なんで、Excelに貼り付けるのか理解に苦しむ。間違ったアドレスにヘルプを求めるといったことが結構あったりします。
ということで、今回これを自動化するRPAをつくってみました。難点はそのままだとPower Automate Desktopがスクショに入ってしまうので、こいつを最小化してからスクショを撮る必要がある点をRPAに加えておく必要がある事です(作成画面ではなく一覧からなら、この処理はいらないんですけれどね)
以下の手順でRPAを組んでいます。
- ウィンドウの取得を追加。ダブルクリックして、フォアグラウンドウィンドウを指定する
- ウィンドウの状態の設定を追加。ダブルクリックして、検索モードを「ウィンドウのインスタンス/ハンドルごと」を指定。ウィンドウインスタンスは1.で設定したものを選択。ウィンドウの状態は「最小化」を指定する
- スクリーンショットを取得を追加。ダブルクリックして、対象はすべての画面を指定、スクリーンショットはファイルとし、保存先を指定(拡張子まで付けたフルパス)、画像の形式はjpgを指定。
- 入力ダイアログを表示を追加。ダブルクリックして、入力の種類を複数行に変更する。
- IFを追加。4.のButtonPress変数を見て、OKならばxxxx、ELSEを追加し、キャンセル時の処理とする
- 5.でOKの時という形でオプション指定をしておき、ELSEとの間にメール送信の処理を追加していく
- Outlookを起動しますを追加。
- Outlookからのメールメッセージの送信を追加。アカウントは自身のメアド(グループアドレスも行けるかも)。宛先、本文は4.の入力値の変数を指定する。
- 8.に続けて、添付ファイルでは、3.で指定したフルパスをそのまま入れる(これなんで変数じゃないんだろう・・・)
- 最後にメッセージを表示を追加。終了した旨の通知を入れる。この後に7.のインスタンスを閉じる処理を入れてもいいんだけれど、環境によっては5分後に送信とかだと、Outlookからまだメール送ってないよ?ってメッセージが出てしまうので今回は入れていない。
- この後送信後に、3.のフルパスのファイルを削除する処理を入れても良いかもしれない。
- ELSE側にはキャンセル時なので、メッセージを表示を追加。
実際に試してみた所、RPAを起動すると
- Power Automate Desktopが最小化
- スクショ撮影
- プロンプトが出るので、エラー内容を記述してもらう
- OKクリックでOutlook起動、ファイル添付、メッセージ追加、そして送信
- 終了メッセージ
という一連の作業を半自動化という形のRPAを作れました。ユーザは宛先を気にせず、またスクショ撮影でもたつかず、入れるのも本文のみなので、確実にエラー画面を情シスに送り込めます。このフローを有料アカウントならば全社員に共有し、なにかあったら実行して指示に従えで済みます。(ついでにTeamsに通知とかあっても面白いかもしれない)
※メールを送信ではなくOutlookを起動を選んでいる理由は、Microsoft365のExchange Serverを使ってる場合、SMTP送信が用意されていないケースがあるため。SMTPサーバが用意できるならば、メールを送信を追加でも可ではないかと思います。
1 2 3 4 5 6 7 8 9 10 11 |
UIAutomation.Windows.GetForegroundWindow WindowTitle=> WindowTitle WindowInstance=> AutomationWindow UIAutomation.Windows.SetStateByInstanceOrHandle WindowInstance: AutomationWindow State: UIAutomation.WindowState.Minimized System.TakeScreenshotAndSaveToFile File: $'''ここに保存するjpgのフルパスを指定''' ImageFormat: System.ImageFormat.Jpg Display.InputDialog Title: $'''エラーが発生しました。''' InputType: Display.InputType.Multiline IsTopMost: True UserInput=> UserInput ButtonPressed=> ButtonPressed IF ButtonPressed = $'''OK''' THEN Outlook.Launch Instance=> OutlookInstance Outlook.SendEmail Instance: OutlookInstance Account: $'''送信元メールアカウントを指定''' SendTo: $'''ここに送信先メアドを指定''' Subject: $'''エラーが発生しました。ボスケテ''' Body: UserInput IsBodyHtml: False Attachments: $'''指定されたjpgへのフルパス''' Display.ShowMessage Title: $'''送信完了''' Message: $'''助けを呼びました''' Icon: Display.Icon.Information Buttons: Display.Buttons.OK DefaultButton: Display.DefaultButton.Button1 IsTopMost: False ButtonPressed=> ButtonPressed2 ELSE Display.ShowMessage Title: $'''送信キャンセル''' Message: $'''ヘルプはキャンセルされました。''' Icon: Display.Icon.Information Buttons: Display.Buttons.OK DefaultButton: Display.DefaultButton.Button1 IsTopMost: True ButtonPressed=> ButtonPressed3 END |
図:こんな感じに処理を作ってみました。
図:ウィンドウ最小化をしないとRPAの画面が取れてしまう
Excelのマクロ実行でシートPDF化後に全部結合する
実務ではよくあるのですが、各担当会議用資料をバラバラに持ってきて、それらを個別に印刷⇒一枚ずつ拾ってはホチキス止めという非生産的な仕事が事務にはよくあったりします。これらは一度PDF化した後に、pdfasのような結合ソフトを使って一枚にし、それから印刷をすれば一枚一枚拾う必要がありません。これをRPAを使って、個別のファイルをPDF化⇒1枚のPDFに結合⇒印刷までをサクっと終わらせるというものをやってみました。
今回はExcelファイル1個なのですが、マクロを仕込んでおり、シートを1枚ずつPDFにして指定のフォルダに入れています。Power Automate Desktopには印刷のメソッドはあってもPDF化するメソッドは無いので、こういう所はマクロの出番です。使用させて頂いたマクロはこちらのコードです。
以下の手順でRPAを組んでいます。Excelファイルはマイドキュメント直下に格納しています。
- 特殊なフォルダーを取得を追加。特殊なフォルダーの名前では個人用を選択(これがMyDocumentらしい)。これを入れることで人毎に異なるMyDocumentのパスを自動判定で取ってくれます。
- Excelの起動を追加。ドキュメントパスは1.のパスに\食虫植物.xlsmと付け加えたパスを指定してあげています。(例:%SpecialFolderPath%\食虫植物在庫.xlsm)
- Excelマクロの実行を追加。内部でsample2()というマクロが存在してるので、マクロでその関数名を指定します。ここで、各シートが個別のPDFとしてpdfというフォルダに格納されます。
- Excelを閉じるを追加。
- フォルダー内のファイルを取得を追加。フォルダは3.の出力先を指定したいので、1.のパスとpdfを組み合わせたパスを指定(例:%SpecialFolderPath%\pdf\)
- つづけてフィルタはPDFのみなので、*.pdfとしてワイルドカードを指定。
- PDFファイルを統合を追加。PDFファイルでは、5.の変数でファイルの一覧として指定。統合されたPDFのパスは3.と同じパスを指定してみました。
- ドキュメントの印刷を追加。既定のプリンタでしか印刷が出来ませんが、これで問い合わせ無しで印刷が実行されます。
- メッセージを表示を追加。印刷完了のメッセージを表示して、RPA実行完了。
担当者には指定のフォルダにでも突っ込んでおいてもらい、それぞれには予めPDF化のマクロを仕込んでおく。For eachループでも使って順番にマクロを実行して、PDF化。のちにそれらを統合して印刷実行。とまで組み上げれば、資料の作成手間が大幅に減るのではないかと思います。いくつか工夫は必要ですが。
また、PDF化をRPAでなんとかしようとせず、簡単なマクロ一個で実現出来る事なので、積極的にマクロも組み合わせるほうが楽にRPAは作れます。
図:今回のフローはこんな感じ。一連の作業を一塊にした。
図:PDF結合部分のフロー
ExcelデータをJSON化→GASにPOSTで送信
Excelの表データを読み込んで、Google Spreadsheetに仕込んで於いたdoPost宛にREST APIとしてデータを送り込んで追記するといったことをPower Automate Desktopにやらせてみたいと思います。ちょっと複雑なので、詳細に記述をしてみたいと思います。
使用する素材
事前準備
Google Spreadsheetには以下のdoPostでデータを受け付けるコードが入っていますので、事前にコピーし、以下に設定変更とデプロイが必要です。
- スクリプトエディタを開く
- コード.gsのssidにスプレッドシートのIDを記述する
- デプロイボタンをクリックし、新しいデプロイを選択
- デプロイする時に今回は認証なしで受け付けるので、アクセスできるユーザを全員に設定する
- デプロイボタンをクリックしたら、URLが出るのでコピーする
- 読み込むExcelデータはダウンロードしたら自分のドキュメントフォルダ直下に配置します。
ソースコード
Power Automate Desktop側
以下のコードをコピーして、貼り付けるとフローが構築されます。構築されたら、ウェブサービスを呼び出しますの項目にてダブルクリックし、URLの欄に事前準備の5.でコピーしたexecで終わるURLを記述して保存します。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
Folder.GetSpecialFolder SpecialFolder: Folder.SpecialFolder.Personal SpecialFolderPath=> SpecialFolderPath Excel.LaunchAndOpen Path: $'''%SpecialFolderPath%\\test.xlsx''' Visible: False ReadOnly: False LoadAddInsAndMacros: False Instance=> ExcelInstance Excel.ReadCells Instance: ExcelInstance StartColumn: 1 StartRow: 1 EndColumn: 4 EndRow: 11 ReadAsText: False FirstLineIsHeader: True RangeValue=> ExcelData Variables.CreateNewList List=> jsonman # EXCELデータをJSONに変換 LOOP FOREACH CurrentItem IN ExcelData SET jsonrec TO $'''{''' SET jsonrec TO $'''%jsonrec% \"ID\": \"%CurrentItem['ID']%\",''' SET jsonrec TO $'''%jsonrec% \"item\": \"%CurrentItem['商品名']%\",''' SET jsonrec TO $'''%jsonrec% \"price\": \"%CurrentItem['価格']%\",''' SET jsonrec TO $'''%jsonrec% \"count\": \"%CurrentItem['在庫数']%\"''' SET jsonrec TO $'''%jsonrec% }''' Variables.AddItemToList Item: jsonrec List: jsonman NewList=> jsonman END Text.JoinWithCustomDelimiter List: jsonman CustomDelimiter: $''',''' Result=> JoinedText Excel.Close Instance: ExcelInstance SET sendjson TO '{\"excelman\":[' + JoinedText + ']}' Web.InvokeWebService Url: $'''ここにGAS側のURLを記述''' Method: Web.Method.Post Accept: $'''application/json''' ContentType: $'''application/json''' RequestBody: sendjson 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 Display.ShowMessage Title: $'''テスト''' Message: WebServiceResponse Icon: Display.Icon.None Buttons: Display.Buttons.OK DefaultButton: Display.DefaultButton.Button1 IsTopMost: False ButtonPressed=> ButtonPressed |
今回のフローは以下のような構成です。
- ドキュメント直下のtest.xlsxを読み込み
- Excelワークシートを読み取りでは、詳細にて範囲の最初の行に列名が含まれていますにチェックを入れています。(これがJSONのキーになる)
- リストを用意(これがJSONの土台になります)- jsonmanという変数名
- For eachで読み込んだExcelデータをJSONに変換。
- 構築後にテキストの結合を利用して、3.のデータカンマ区切りに変更する
- POSTで送り込む用に、5.のデータにexcelmanというキーを付け、5.のデータは[]の配列として構築し直す。
- ウェブサービスを呼び出すで、GAS側のURLをPOSTで叩く。この時、詳細にてリダイレクトに追従するにチェックが必要。
- また、要求本文をエンコードするのチェックは外しました。
- 要求本文には6.でセットした変数を指定する
- 実行結果がGAS側からreturnされてくるので、それを受け取ってメッセージボックスで表示する
図:REST APIを叩く時にもお世話になります
GAS側コード
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 |
//書き込みスプレッドシートID var ssid = "このスプレッドシートのID"; //POSTで受け取ってスプレッドシートへ書き込み function doPost(e) { try{ //送信パラメータを取得する var temp = e.postData.getDataAsString(); if (temp == undefined) { //パラメータ不良の場合はundefinedで返す return ContentService.createTextOutput("なんか送信データがオカシイです"); } else { //JSON化 var json = JSON.parse(temp); //excelmanだけ取り出す var excelman = json.excelman //スプレッドシートを取得 var ss = SpreadsheetApp.openById(ssid).getSheetByName("シート1"); //JSONからレコードを生成してappendrowする for(var i = 0;i<excelman.length;i++){ //一時配列を用意 var temparr = []; //レコードを一個取り出す var rec = excelman[i]; //JSONから配列を構築 temparr.push(rec.ID); temparr.push(rec.item); temparr.push(rec.price); temparr.push(rec.count); //書き込み ss.appendRow(temparr); } //ログ出力と値の出力 return ContentService.createTextOutput("Googleスプレッドシートに追記しました"); } }catch(e){ //エラーメッセージを表示 return ContentService.createTextOutput(e.message); } } |
- GAS側では、JSON化されたデータをPower Automate Desktopで受け取っています。
- 受け取ったデータを1行ずつ配列とし、appendRowで書き込んでいます。
サブフロー活用で処理を分岐
プログラム開発でもある程度大きな処理は、処理パートを分けて、大元の関数から条件に応じて呼び出すようにするのが開発テクニックとして普通に行われています。同じフローの中で記述しても良いのですが、処理が大きければ大きいほど、見通しが悪くなり、メンテナンスも行いにくくなります。Power Automate Desktopもこの「処理を分岐させて条件に応じて呼び出す」といった事が可能になっています。それがサブフロー。
基本的にはIF ELSE ENDを使い、それぞれの中でサブフローの実行アクションを入れて、処理の中身はサブフローの側に記述していくことになります。今回は起動時に出勤か?退勤か?をユーザに選ばせて、それぞれのケースに応じてサブフローを実行する半自動化で作ってみてます。出勤ならばSelectIndexの値が1なので、incomeを実行。退勤ならば0なのでoutgoingを実行といった感じです。また、今回のサイトでは出勤・退勤をクリックする部分が「iFrame」で作られてしまってるので、処理に「iFrame内のソースURLを指定してそこにページを移動」の処理を入れています(Puppeteerでもよくこの手の処理を行います)。
クリックが実行されたら最後にブラウザを閉じることで完了となります。実際のコードは以下の通りです。
1 2 3 4 5 6 7 8 9 10 11 12 |
Variables.CreateNewList List=> List Variables.AddItemToList Item: $'''出勤''' List: List NewList=> List Variables.AddItemToList Item: $'''退勤''' List: List NewList=> List Display.SelectFromList Title: $'''勤怠''' Message: $'''どうする?''' List: List IsTopMost: True AllowEmpty: False SelectedItem=> SelectedItem SelectedIndex=> SelectedIndex ButtonPressed=> ButtonPressed Display.ShowMessage Title: $'''アクション''' Message: SelectedIndex Icon: Display.Icon.None Buttons: Display.Buttons.OK DefaultButton: Display.DefaultButton.Button1 IsTopMost: False ButtonPressed=> ButtonPressed2 IF SelectedIndex = 1 THEN CALL income ELSE CALL outgoing END WAIT 5 WebAutomation.CloseWebBrowser BrowserInstance: Browser |
図:メインフロー内で処理分岐でサブフローを呼び出す
図:サブフローではそれぞれの実行処理を記述する
SQLを利用してExcelデータを47都道府県別に振り分け
ごちゃごちゃになってるデータベースに対して、特定の列でフィルタをし、それらをそれぞれのシートに振り分けるというのは結構転記の事例では多いのではないでしょうか?今回、Power Automate DesktopのみでExcel VBAを利用せずにSQLを利用して分類しデータを振り分けるサンプルを作ってみました。
使用する素材
- data.xlsx - 47都道府県名が入ってるだけのExcelファイル
- database.xlsx - 47都道府県がごちゃまぜに入ってるデータ(疑似個人情報生成サービス利用)
今回使用するODBCドライバは、本来Accessに付属のモノなのですが、Accessが無くとも、Microsoft Access データベース エンジン 2016 再頒布可能コンポーネントをインストールすれば、Microsoft.ACE.OLEDB.12.0として利用する事が可能です。
実演動画
実行速度もまずまずです。手作業でこんな作業してたら何分掛かることやら。。フィルタもSQLで一発なので、これから先のRPAを武器にする事務員はSQL文も勉強しましょう。
ソースコード
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
Excel.LaunchAndOpen Path: $'''ここにdata.xlsxのフルパス''' Visible: True ReadOnly: False LoadAddInsAndMacros: False Instance=> ExcelInstance Excel.ActivateWorksheetByName Instance: ExcelInstance Name: $'''Sheet1''' Excel.ReadCells Instance: ExcelInstance StartColumn: 1 StartRow: 1 EndColumn: 1 EndRow: 48 ReadAsText: False FirstLineIsHeader: True RangeValue=> ExcelData Variables.RetrieveDataTableColumnIntoList DataTable: ExcelData ColumnNameOrIndex: $'''都道府県''' ColumnAsList=> ColumnAsList SET ExcelPath TO $'''ここにdatabase.xlsxのフルパス''' Database.Connect ConnectionString: $'''Provider=Microsoft.ACE.OLEDB.12.0;data source=%ExcelPath%;extended properties=\"Excel 12.0 Xml;HDR=Yes\";''' Connection=> SQLConnection LOOP FOREACH CurrentItem IN ColumnAsList SET Prefecture TO CurrentItem Database.Execute Connection: SQLConnection Statement: $'''SELECT * FROM [Sheet1$] WHERE [prefecture] = \"%Prefecture%\" ''' Timeout: 30 Result=> QueryResult SET rec TO QueryResult Excel.AddWorksheet Instance: ExcelInstance Name: Prefecture WorksheetPosition: Excel.WorksheetPosition.Last Excel.ActivateWorksheetByName Instance: ExcelInstance Name: Prefecture Excel.WriteCell Instance: ExcelInstance Value: QueryResult Column: 1 Row: 1 END |
- data.xlsxのフルパスとdatabase.xlsxのフルパスを指定します。
- data.xlsxのSheet1からは47都道府県のデータを取得して、データテーブル列をリストに追加という形でリスト型の変数を作ります。
- SQL接続を開くを利用して、xlsxに対して接続文字列で接続します。xlsxの場合には、Provider=Microsoft.ACE.OLEDB.12.0;data source=%ExcelPath%;extended properties="Excel 12.0 Xml;HDR=Yes";という形になります。%ExcelPath%がdatabase.xlsxへのフルパスの変数を割り当ててます。
- ループでリストを回して、都道府県名を1個 %Prefecture%という形で取得しておきます
- SQLステートメントの実行にて、データの塊にSQL文をなげて、データの塊を取り出します。条件は都道府県が%Prefecture%と合致するもの。SQL文はSELECT * FROM [Sheet1$] WHERE [prefecture] = "%Prefecture%"になります。文字列なので変数に""を括るのを忘れずに
- データが取得出来たら、新しいシートをdata.xlsxに新しいシートを%Prefecture%にて作成、アクティブにします。
- Excelワークシートに書き込みにて、5.で取得した結果をセルの1列目1行目に一発書き込みします。
- 後は都道府県分だけぶん回すと、5000件のダミーデータが都道府県別に振り分けされていきます。
- GROUP BYといったものだけでなく、SUMやCOUNT、INSERTやUPDATE文なども使えるようです。
ODBCドライバがあれば、AccessデータベースやMySQLなども使えます。特にAccessの場合はクロス集計クエリが使えたりするので、予めAccess側で作り込んで於けば、クロス集計をした結果を一発で取得といった荒業も可能です。
図:Excelに対してSQL文をぶん投げて抽出する
トラブルシューティング
無線LANにアクセスできなくなる
WPA2-Enterpriseのような、社内LAN接続に証明書を使って接続するタイプの接続方法を取っている企業に於いて、Power Automate for Desktopをインストール後に無線LAN接続ができなくなるという現象が報告されています。この原因は、PADがインストール時に様々な証明書をインストールする事によって、既存の証明書が上書きされてしまい、結果無線LANに接続できなくなるという結構大きな問題です。
こちらの問題点の解消については、こちらのブログのエントリーにて回避方法が提示されています。PADを社内展開する前に実験機でテストをし、同様の症例にぶつかるようであれば、回避策を講じる必要があるでしょう。
参考動画
関連リンク
- できるPower Automate 無償ダウンロード
- Add a Microsoft Dataverse database
- Microsoft、「Excel」のようなローコード向けプログラミング言語「Power Fx」を発表
- Microsoft、デスクトップ操作の自動化ツールをWindows 10ユーザーに追加費用なしで提供
- Windows:PowerAutomate Desktopをインストールして使ってみる
- Set up Power Automate Desktop
- アクションリファレンス
- MicrosoftのPower Automate DesktopでSAPを操作してみた
- Microsoft Power Automate のRPA機能を試してみた
- Selenium IDE のフローを編集する
- Chrome Extension : Selenium IDE
- Power Automate 価格
- クラウドフローを共有する
- 日本一わかりやすい、非公式な Power AutomateとRPA機能UI flowsのライセンス表
- RPAのMicrosoft Power Automate DesktopとUiPathを比べてみた
- Power Automate のRPA機能「UIフロー」でAdobe Photoshopを含めるタスク自動化を試してみました
- Microsoft Dataverse に関する私的メモ
- Microsoft Dataverse データベースの追加
- Microsoft Office 2010 で使用する MODI のインストール
- 「SHOの、Robinをインストールしてみた」
- Power Automate Desktop からOpenCVを使うときの注意点
- 一般公開された Microsoft Dataverse for Teams で新しい働き方を実現しよう
- 【MicrosoftのRPA機能】「WinAutomation」とは?【その1 機能の説明】
- Microsoft Teams での承認
- Power Automate Desktop のフローの保存方法だったりそれ以外だったり
- Quick guide: Utilize Robin Scripts through C#
- Power Automate Desktop が Excel ファイルを読み取り JSON データで Node-RED に連携するメモ
- Power Automate Desktop 無料で使えるRPAでExcel入力を自動化してみた
- Power Automate Desktop が Excel ファイルから obniz のテープ LED のカラーを変えるメモ
- Google Apps ScriptのdoPostでJSONなパラメータのPOSTリクエストを受ける
- Problem installing Power Automate Desktop
- [Power Automate]UIフローで指定したパスのアプリケーションを実行しようと試行錯誤した件
- Use AutoHotkey to run scripts with “robin.exe”
- Referring to the AppMask
- PowerAutomateを使用したSAPGUIAutomationのRPAPlaybook:APIフロー、UIフロー、およびPower Automate Desktop
- Passing keyboard shortcuts to Power Automate desktop
- Reinstallation did not resolve error
よしおと申します。
詳しい記事をありがとうございます!
大変参考になりました。
ちょうど、コマンドプロンプトからフローの実行を模索していたので、
「Robin.exeでPower Automate Desktopのフローを実行」は特に興味深かったです。
手前味噌ですが、「PadFlowRun.exe」というフローを呼び出すだけのものを公開しております。
UWCSというもので作ってexe化したものです。
Stream Deck用 としていますが、「PadFlowRun.exe “フロー名”」という記述でコマンドからも実行できます。
Robin run からの実行ですと動作開始まで少し時間がかかりますが、こちらですと少し早く動きますし、フロー名で指定できるので、すこしだけ楽かもしれません。
よければ試していただけたらと思い、コメントさせていただきました。
https://yoshio-akz.blogspot.com/2021/03/stream-deck-power-automate-desktop.html
よしお様
officeの杜管理人です。さすがのUWSCですね。大昔から自動化で貢献してきたツールだけあります。
早速試してみようと思います。
UWSCだと、何かをトリガーにして発火ができるというので、Power Automate Desktopと違い、バックグラウンドで待機させて、トリガーひかれるのを待てる
というので、組み合わせたら、面白い事ができそうですね。
使ってみた感想をブログに記載しても良いですか?
akanemaru2017 様
試していただいてありがとうございます!
返信ありがとうございます。
ブログに記載大丈夫です。むしろ掲載していただけたら嬉しいです!
今のところ、とりあえずやってみた的な簡単なスクリプトなので、自分が使ってて不便な事や、要望があれば拡張していこうかなと思っています。
何かあればお知らせいただけましたら幸いです。
よしお様
記事に追加してみました。とってもシンプルで簡単で、非常に良いスクリプトですね。タスクスケジューラからの呼び出しでも難なく実行できました。
VBAや他のプログラムからも単純にEXEと引数だけで行けるので、VBAからの流れで呼び出したり、Pythonで処理した後にPADで処理させるみたいなこともできそうですね。
こんばんは 無償版Power Automateで毎月1回などをトリガーにして発火したいと、検索してたどり着きました。
> UWSCを使ってフローを実行
> https://bit.ly/3CSj63m
>例えば、テキストエディタに貼り付けて、フロー名だけを自分のPADのフロー名に書き換えて、拡張子BATで保存する
で、フロー名が漢字を含む場合、フロー名を書いたbatファイル自体をSHIFT-JISで保存しないと「見つかりません」と出て実行できません。
ミズグチといいます。社内事務処理が簡素化できないかと勉強中です。
上で説明されている都道府県別の振り分け等とっても参考になります。
初歩的で申し訳ないんですが、ご存じでしたら、と思いコメントします。
先日作成したフローを実行しようとPowerAutomateDesktopを起動し、
保存済のフローを編集しようとすると、準備しています、のメッセージ後、
「通信エラー:コンソールとデザイナー間の接続が確立されませんでした。
Power Automate Desktop を再起動して、もう一度実行してください。
関連付けID:cca90c78-a8c3-4445-adb7-c10c9e86ac3c (”クリップ
ボードへコピー”マークとOKボタン」と出てから編集画面が開きます。
開きますが、フローを実行させると「ステータス:解析中」
のまま、何も始まらないし、延々解析したままです。
当初保存したのと異なるマイクロソフトアカウントで操作しようとしていた
ので一旦ログアウトし、再度ログインしなおしても同様でした。
なかなか素人には難しいです、お知恵を貸していただければ幸いです。
みずぐち様
officeの杜管理人です。
アカウントが個人アカウントなのか?Microsoft365アカウントなのかわからないので、なんとも言えないのですが、もし最近アップデートした後ということならば、このエントリーの途中にある
「再インストール後にエラー頻発」を参考に、一旦、アンインストールをして残ってるゴミファイルを削除し、再度最新版を入れ直してから、同様の作業をやってみてください。
Power Automate Desktopはまだまだバギーな面があり、特にアプデ直後はこのような不可解なエラーが出ています。また、コードはテキストファイルにコピペで取っておけるので、万が一の為にも、せっかく作ったコードが保存されず終わることのないように、取っておくと良いでしょう。
こちらでも同様の質問が出ていますね。
個人のMicrosoftアカウントで今確かめてみましたが、最新版では特にエラーが出ていないので、ありえるとしたら古いバージョン使用による問題、もしくはOneDriveがいっぱいになってるなどの問題のどちらかではないかと。
ご連絡遅くなりましてすみません、回答ありがとうございます。
あれからpowerautomatedesktop再インストールして問題なく使えています。
何がどうだめだったのかよくわかりませんが動いたのでヨシとしています。
(PC はローカルアカウントでログオンしていて、PAD使用時に都度マイクロソフトアカウントにログオンしています)
powerautomateの無償版(desktop)は、フローの共用ができない、ということで、2台のPC(ともにローカルアカウントで起動)で
①PC_マイクロソフトアカウント:mizu、で通常使用
②PC_マイクロソフトアカウント:naji、で通常使用
としているところに、
①のPCで②のnajiアカウントでPADのフロー:a)を作成・保存し、
②のPCで②のnajiアカウントでログオンしてフロー:a)を使う、
ですとかは、してはダメなんでしょうか?
なんだか説明わかりづらいですね、別パソコンで動作確認して実稼働は別PCで、ということです
PADそのものが起動するときにエラー(サインイン中にエラーが発生しました、管理者にお問合せ下さい)が②で出ます。これは一体???
都度ログインしたらいいんでしょう~、なんていう、適当な処理ではダメみたいですね
なかなか奥深いです。
みずぐちさん
おはようございます。
PADは未だ進化中故、特に初期から使ってる人の場合、アプデ時にトラブルが出がちなので、その際は再インストールが一番効果があります。
さて、フロー共有ですが、そもそもフローはアカウントに紐付けされて、実行時にダウンロード(OneDriveやDatavarseから)されて実行されるので、みずぐちさんの使い方で問題ないです。
共有は上位プランになりますが、エントリーにもあるように、フローをコピペで渡す事はできるので、手間ではありますが、完成品ならば違うアカウントにフローをテキストかなにかで渡して、構築
してあげればOKです。
起動する時のエラーもPC②側のPADを一度再インストールしてみると良いと思います(通常のMSアカウントと企業アカウントの切り替えも本来はできるはずですが)
みずぐちです
コメント返信ありがとうございます。上記の不具合ですが現段階での最新バージョン(2.121.7121216)を再インストールして解消されました。
PowerAutomateCommunityですとか見ていても「バージョンアップ待ちますか~」みたいな書き込みがありました、やっぱりな!です。
ご相談いただきましてありがとうございます。今後も参考にさせてもらいます。
みずぐち様
無事になんとかなったようで良かったです。
まだまだβ版的な立ち位置ですが、続々と新機能と独特な機能が追加されてきてるので、これまでのRPAとはまた違ったものにブラッシュアップされていくのではないかと思いますが、
同時に変な挙動もあると思うので、アップデートは慎重に ですね。