下記記事で、“UIフローで任意のアプリケーションやスクリプトを呼び出すハック”を紹介しましたが、具体例が無いと中々便利さが伝わらないと思います。
今回は具体的な例として、“OneDriveに画像ファイルがアップロードされたら、自動的にローカルのPhotoshopを使って画像加工するUIフロー”を紹介します。
処理内容
概要は下記の通りで、今回はフローを2つに分けました。
- トリガー(フロー1):OneDriveに画像ファイルをアップロードします。
- 1.のファイルをローカルフォルダに保存します。
- UIフロー:Photoshopを操作するスクリプトを実行し、2.の画像ファイルを加工します。
- トリガー(フロー2):加工が終わったファイルをローカルフォルダに保存します。
- 4.のファイルをOneDriveにアップロードします。
フロー1
最初のフローは、OneDriveへのファイルのアップロードをトリガーとするフローです。
前回の記事で紹介している、“UIフローで任意のスクリプトやコマンドを実行するスクリプト”(run.vbs)を経由して、下記のPhotoshopを操作して画像加工を行うスクリプトを呼び出します。
Option Explicit Dim f Const InputFolderPath = "C:\OneDrive\in" Const OutputFolderPath = "C:\OneDrive\out" With CreateObject("Scripting.FileSystemObject") If .GetFolder(InputFolderPath).Files.Count > 0 Then For Each f In .GetFolder(InputFolderPath).Files Select Case LCase(.GetExtensionName(f.Path)) Case "png" ApplyPhotoshopFilter f.Path, .BuildPath(OutputFolderPath, f.Name) Exit For End Select Next End If End With Private Sub ApplyPhotoshopFilter(ByVal InputFilePath, ByVal OutputFilePath) Dim optPng Const psDoNotSaveChanges = 2 Const psLowercase = 2 Set optPng = CreateObject("Photoshop.PNGSaveOptions") optPng.Interlaced = True With CreateObject("Photoshop.Application") .Visible = True With .Open(InputFilePath) .ArtLayers.Item(1).ApplyOceanRipple 10, 20 .SaveAs OutputFilePath, optPng, , psLowercase .Close psDoNotSaveChanges End With .Quit End With End Sub
フロー2
2番目のフローは、スクリプトによって出力されたファイルをトリガーにして、OneDriveにファイルをアップロードするフローです。
ファイルパスからファイルコンテンツを取得する処理を挟むのがポイントですね。
今回は安定して処理を実行させるため、また、動作確認を簡単にするためにフローを分けましたが、内容を工夫すれば一つにまとめられるかもしれません。
実行結果
上記フローの実行結果が下記動画になります。
OneDriveをトリガーにしているので、折角なのでスマートフォン(エミュレーター)からファイルをアップして、動作確認を行っています。
#OneDrive にアップした画像ファイルを自動的に #Photoshop で加工する #UIフロー の活用例です。スクリプトを活用することで複雑な処理を安定して行うことができます。 https://t.co/ziuW2ZOruK #PowerAutomate pic.twitter.com/P8Cxa8IGDq
— きぬあさ (@kinuasa) December 27, 2019
イベントを起点とするフローは即時実行できないのが難点ですね。
処理が開始されるまで、しばらく待つ必要があります。
なぜスクリプトを使うのか?
上記フローでは、UIフローで「Photoshopを操作して画像加工するスクリプト」を実行しています。
何故わざわざスクリプトで処理を行っているかというと、それはずばり、“安定して処理できるから”です。
たしかにUIフローでは、レコーダーによってキーボードやマウスによる操作を記録・再生できますが、それらの動作は不安定で、複雑な処理を行えば行うほど失敗する確率は高まってしまいます。
VBAやVBSを触ったことがある人であれば、“SendKeysでアプリケーションを操作するのと似た感じ”、そう思っていただければイメージしやすいかもしれません。
そこで活用するのがスクリプト(あるいは類するマクロやプログラム)です。
例えばPhotoshopやIllustratorでは、外部から自動処理を行うためのスクリプト機能がサポートされています。
形式変換、リサイズ、回転、色調補正等々、スクリプトによって様々な処理を自動化できる上、アクションの呼び出しも行えます。
簡単な処理であればキーボードやマウスの操作だけでも大きな問題はありませんが、複雑な処理を安定して行いたいときは、スクリプトは非常に有効な手段だと言えます。
@nori790822さんは下記記事で“現状のUIフローの限界”について言及されていますが、スクリプトはUIフローの限界を突破する手段です。
おわりに
今回紹介したフローは、Power Automateで行わずに自力で実装することもできます。
OneDriveのフォルダを見に行って、ファイルがあればダウンロードしてPhotoshopで処理、終わったらOneDriveにファイルをアップロード、こんな処理をタスクを組んで定期的に実行すれば良いだけです。
ただし面倒くさい!!特にOneDrive周りの処理。
認証やファイル・フォルダ操作等、APIでゴリゴリ書くのは実に面倒くさいです。
これがさらに、結果をSlackに通知、加工後のファイルをGmailで送信等の処理が追加されると、ウザさ倍増です。
この面倒なクラウド周りの処理を担ってくれるのがPower Automateです。
ちょちょいと必要事項を入力するだけですぐに完成、通知先が増えようがOneDriveがGoogle ドライブに変わろうが、何の問題もありません。
それにUIフロー+スクリプトを組み合わせることで、クラウド・ローカル間の連携は自由自在、最小限のコーディングで思うがままに処理できます。
これこそがUIフローの真価、強みだと個人的には思っているのですが、何故にUIフローが注目されないのかが疑問です。単にRPA製品の一つとしてしか捉えられていないのは実にもったいない!
いずれUIフローが注目されることを願いつつ、今回の記事は終了です。
Photoshop APIがリリースされるってよ
現在、Adobe I/OでPhotoshop APIのβ版テスターを募集中らしいです。
#PowerAutomate 🤖で #Photoshop 👩🎨の作業を自動化できる!
画像のちょっとした加工・編集などバッチ作業には便利そう!そして、あまり知られてませんが、実は #AdobeIO のPhotoshopのAPIは👩💻β版テスター👨💻を募集中です🙌https://t.co/sNT7TZcwMH https://t.co/jebgeoeIqR
— TAKEOKA Yoshiki 竹岡義樹 (@yoshikinoko) 2019年12月20日
なるほど。
下記デモページを見る限り、今回紹介したフロー内のスクリプトでやっているレベルであれば、APIで簡単に処理できそうです。
“じゃあ、UIフロー使わんでもエエやん!”
そう思ったりもしますが、それは早計。
ローカルPhotoshopを操作した方ができることは多いはず!
Illustrator連携もできるし!!(強がり)
まあ、とりあえず、Photoshop APIもそれはそれで気になるので、後で登録しておきます。
この記事へのコメントはありません。