Power AutomateとPower Automate Desktop(PAD)を連携する場合、通常は先日書いた記事の通り有償プランで利用可能な「デスクトップフロー」を使う必要がありますが、PADに用意された「SQL 接続を開く」、「SQL ステートメントの実行」、「SQL 接続を閉じる」といったデータベース関連のアクションを活用すれば、下記のようにPADからクラウドフローが実行できるのではないかと思い、さっそく試してみることにしました。
- 「SQL 接続を開く」アクションでSharePointリストに接続する。
- 「SQL ステートメントの実行」で項目を追加する。
- Power Automate側でSharePointの「項目が作成されたとき」をトリガーとしてフローを実行する。
SharePointリストの準備
まずはPADから項目を追加するSharePointリストを準備します。
今回は下図のように「FileName」列(1行テキスト)とBase64エンコードした文字列を保存するための「Base64」列(複数行テキスト)を追加し、名前を「PADTrigger」としました。
SQL接続でSharePointリストに項目を追加するPower Automate Desktopフロー
次はPADでフローを作成します。
フロー全体
/# 1. 選択したファイルをBase64エンコードしてSharePointリストに追加 2. SharePointの「項目が作成されたとき」をトリガーにしてPower Automateのフロー実行 3. エンコードされた文字列からファイルをデコードして以降の処理続行#/ Display.SelectFile InitialDirectory: $'''C:\\Test\\PDF''' IsTopMost: False CheckIfFileExists: False SelectedFile=> SelectedFile ButtonPressed=> ButtonPressed IF ButtonPressed = $'''Open''' THEN System.RunPowershellScript Script: $'''[System.Convert]::ToBase64String([System.IO.File]::ReadAllBytes(\"%SelectedFile%\"))''' ScriptOutput=> PowershellOutput ScriptError=> ScriptError Text.Trim Text: PowershellOutput TrimOption: Text.TrimOption.Both TrimmedText=> Base64 SET SharePointUrl TO $'''https://xxxxxxxxxxx.sharepoint.com/''' SET ListId TO $'''PADTrigger''' SET ConnectionStrings TO $'''Provider=Microsoft.ACE.OLEDB.16.0;WSS;IMEX=0;RetrieveIds=Yes;DATABASE=%SharePointUrl%;LIST=%ListId%''' Database.Connect ConnectionString: ConnectionStrings Connection=> SQLConnection Database.Execute Connection: SQLConnection Statement: $'''INSERT INTO list (FileName, Base64) VALUES (\"%SelectedFile.Name%\", \"%Base64%\")''' Timeout: 30 Result=> QueryResult Database.Close Connection: SQLConnection END
1. ファイルの選択ダイアログを表示
「ファイルの選択ダイアログを表示」アクションでBase64エンコードするファイルを選択します。
2. If
「If」アクションでファイルが選択されたかどうかを判定します。
3. PowerShell スクリプトの実行
下記PowerShellスクリプトを実行し、選択したファイルをBase64エンコードします。
[System.Convert]::ToBase64String([System.IO.File]::ReadAllBytes("%SelectedFile%"))
4. テキストのトリミング
エンコードした文字列から不要な文字を削除し、変数「%Base64%」として設定します。
5. 変数の設定
接続先SharePointのURLを変数「%SharePointUrl%」として設定します。
6. 変数の設定
接続先リスト名(今回はPADTrigger)を変数「%ListId%」として設定します。
7. 変数の設定
下記接続文字列を変数「%ConnectionStrings%」として設定します。
Provider=Microsoft.ACE.OLEDB.16.0;WSS;IMEX=0;RetrieveIds=Yes;DATABASE=%SharePointUrl%;LIST=%ListId%
8. SQL 接続を開く
接続文字列を「%ConnectionStrings%」として「SQL 接続を開く」アクションでSQL接続を開きます。
9. SQL ステートメントの実行
「SQL ステートメントの実行」アクションでSQL文を実行して、指定したSharePointリストに項目を追加します(INSERT)。
・接続の取得方法:SQL 接続変数
・SQL 接続:%SQLConnection%
・SQL ステートメント:
INSERT INTO list (FileName, Base64) VALUES ("%SelectedFile.Name%", "%Base64%")
10. SQL 接続を閉じる
SQL接続を閉じます。
以上でPADのフロー作成は完了です。
PADからのSharePoint接続、SQL実行に関しては下記サイトが参考になります。
上手くSharePointに接続できない場合は、一度下記記事のマクロで認証含めて動作確認を行うと良いでしょう。
PADから受け取ったBase64文字列をデコードしてOneDriveに保存するPower Automateフロー
最後にPower Automateのクラウドフローです。
フロー全体
1. 項目が作成されたとき
自動化したクラウドフローを作成し、SharePointの「項目が作成されたとき」をトリガーにします。
対象リストは事前に準備した「PADTrigger」を指定します。
2. 作成
base64ToBinary関数でPADで追加されたBase64列の値をバイナリに変換します。
@{base64ToBinary(triggerOutputs()?['body/base64'])}
3. ファイルの作成
バイナリ変換したファイルをOneDrive上のフォルダに保存します。
・フォルダーのパス:/fromPAD
・ファイル名:
@{triggerOutputs()?['body/Title']}
・ファイル コンテンツ:
@{outputs('作成')}
4. 項目の削除
ファイル保存が終われば、トリガーとなったSharePointリストの項目は不要になるので削除します。
実行画面
上記の通り、SharePointリストを活用することでPADからPower Automateのクラウドフローを実行してみましたが、Power Automate側でパラメーターも受け取りやすく、思っていたよりも使いやすかったです。
とはいえ半ば無理やり実行するものなので、本来的には最初に書いた通り、「デスクトップフロー」を使った方が良いでしょう。
この記事へのコメントはありません。