概要
Power Automate Desktopの「Pythonスクリプトの実行」アクションを試してみます。ちょっとした配列の処理は、外部のPythonを呼び出さなくてもこのアクションから実行できると利便性が上がると思い試しました。しかし2021年1月時点ではMicrosoftのDocsやlearnにあまり情報がなくハマりポイントがあったので記録しておきます。
環境など
Windows10 20H2
Power Automate Desktop 2.2.20339.22608
組込みされているPython
2021年1月時点の情報です。
試したこと
PADの配列から最大値、最小値を求めます。
使ってみる
最初に「Pythonスクリプトの実行」アクションにPythonスクリプトを書いて試してみます。
配列も直接スクリプト内に書いてみます。
配列が表示されます。
次に、PADで作成した配列を「Pythonスクリプトの実行」に渡して試します。
アクション1行目に**「変数の設定」**を利用してリストを作成します。
「新しいのリスト作成」アクションを使わなくても1行で配列作成が可能です。
宛先:の内容です。
%[155, 168, 5456, 551, 156, 599, 256, 636, 266, 4894, 282, 522, 266]%
「Pythonスクリプトの実行」の変数listbをPADの変数に変えてみます。
ダメです。ここでハマりました。
TypeError: int is not iterable 数値は反復できません。??
関数maxを外して実行してみると
配列ごとを渡したつもりなのですが単体の値になっているようです。
回避策
配列が単体値になってしまうなら、先に配列ごと単体テキストにしてからpythonに渡すことにしました。
カンマ区切りでテキストの結合を行います。
pythonスクリプトを修正します。
上手くいきそうです。
max関数を追加します。
PADの配列から最大値を取り出すことができました。
SET List TO [155, 168, 5456, 551, 156, 599, 256, 636, 266, 4894, 282, 522, 266]
Text.JoinWithCustomDelimiter List: List CustomDelimiter: $''',''' Result=> JoinedText
System.RunPythonScript PythonCode: $'''listb = [%JoinedText%]
print max(listb)''' ScriptOutput=> PythonScriptOutput ScriptError=> ScriptError
Display.ShowMessage Title: $'''PAD''' Message: $'''%PythonScriptOutput%
%ScriptError%''' Icon: Display.Icon.None Buttons: Display.Buttons.OK DefaultButton: Display.DefaultButton.Button1 IsTopMost: True ButtonPressed=> ButtonPressed
まとめ
現時点では直接配列をPythonスクリプトの実行に渡せませんでした。
配列を渡せることで利便性が上がります。
参考
Microsoft learn :Power Automate Desktop でのスクリプトの作成
https://docs.microsoft.com/ja-jp/learn/modules/pad-scripting/
追記
PythonScriptアクションから出力される%PythonScriptOutput%はテキスト型なのですが「テキストを数値に変換」では数値に戻せません。
調べてみるとpython2のprintでの出力は不可視部分に改行コードを含みます。
そこでpython scriptにprintを使わずに「sys.stdout.write」を使用しました。
import sys
listb = [%JoinedText%]。
m = max(listb)
sys.stdout.write(str(m))
しかし、改行コードを含まない状態で出力しても数値に変換できませんでした。
結局、あまりスマートではありませんが正規表現を使って数値を抽出することにしました。
SET List TO [155, 168, 5456, 551, 156, 599, 256, 636, 266, 4894, 282, 522, 266]
Text.JoinWithCustomDelimiter List: List CustomDelimiter: $''',''' Result=> JoinedText
System.RunPythonScript PythonCode: $'''import sys
listb = [%JoinedText%]
m=max(listb)
sys.stdout.write(str(m))''' ScriptOutput=> PythonScriptOutput ScriptError=> ScriptError
Text.RegexParseForFirstOccurrence Text: PythonScriptOutput TextToFind: $'''[0-9]+''' StartingPosition: 0 IgnoreCase: False OccurrencePosition=> Position Match=> Match
Text.ToNumber Text: Match Number=> TextAsNumber
PythonScriptアクションへの入出力は2021年1月現在では少し手間が掛かる方法しか自分は思いつきませんでした。