マイクロソフトの無償RPA(自動化ツール)である「Power Automate Desktop(PAD)」で使用されているRPA言語「Robin Language(ロビン言語)」について解説しています。
このコンテンツはプログラミングやローコード開発の経験がある方向けの内容となっていますので、もしこれからPower Automate Desktopでの自動化にチャレンジしてみたい、という方は「はじめてのPower Automate Desktop – 使い方・解説記事まとめ」をご覧になってみてください。
本ページは通常Power Automate Desktopで直接編集することのない(本来する必要が無い)ソースコードについての解説となっています。
私的なマニュアルとして整理し始めたもののため、もしご興味があれば読んでみてください。サンプルやテンプレートなどを交えた自動化フロー作成の解説についてはこちらでも複数ご紹介しています。
また、仕様が明らかになっていない部分などについては、実環境での挙動などを基に内容を記述しているものもあります。当方の検証による理解の誤りや、その後のアップデートなどにより古い情報などが混ざっている可能性もある点をご了承ください。
Robin Language(ロビン言語)について
Power Automate DesktopではRobin(ロビン)と呼ばれる言語が内部的に使用されています。
そもそものお話ですが、Power Automate Desktopでは視覚化された編集画面で自動化フローの作成を行うことができるため、通常、このRobin言語を使って作業を行うことはほぼ(全く)ありません。
Robinのソースコードを確認・編集するには
このRobin言語で記述されたコードは、Power Automate Desktop編集画面からフローをコピーし、メモ帳などに張り付けを行うことで確認することができます。
また、このRobin言語のコードは他の環境でのPower Automate Desktop編集画面に張り付けすることで、作成したフローをテキストデータを経由して複製することができるため、異なる環境へのコピーやネットワークを通じたフローの共有などにも利用できます。
逆に、Power Automate Desktop編集画面ではこのRobinコード自体を編集する手段が用意されていないため、コードを直接編集しながらデバッグを行う、などということはそもそもできません。
メモ帳などに取り出したコードの内容を直接修正して貼り付けることなどは可能です。
Robin(コーディング)に対しての知識が無くても使えることがPower Automate Desktopの最大の利点でもあるのですが、今回はコピペで読むことができるこのRobinコードをざっくり読み取ってみたいと思います。
普段の自動化フローの構築に使われることはあまり無いと思われますが、Robinの概要だけでも把握しておくとPower Automate Desktopでできることや問題が発生した時の対処などに役立つかもしれません。
文法(シンタックス)
Robinでは構文の大文字、小文字が区別されずに実行されるようです。(then / Then / THEN いずれもOK)
Robinの公式ドキュメントでは構文が小文字で紹介されていますが、Power Automate Desktopでコピーされた構文は大文字で記述されているため、ここではRobinの構文をPower Automate Desktopの仕様に倣って大文字で記述しています。
ブロック
条件、ループ、関数などはEND文を終了としてブロックを作ることができる。またブロックはネストさせることができます。
IF A = 0 THEN
SET B TO 'False'
ELSE IF A = 1 THEN
SET B TO 'True'
ELSE
SET B TO 'empty'
END
関数
Robin言語ではFUNCTION構文により関数の定義、CALL文による関数の呼び出しが行えます。
Power Automate DesktopではこのFUNCTION構文による関数は「サブフロー」と呼ばれています。
Power Automate Desktopの編集画面の上にはタブで構成されたエリアがあり、ここにメインとなるフローとなるほか、複数のサブフローがタブで表示されます。
このひとつひとつのサブフローが内部的にはFUNCTION構文で構成された関数となっているようです。
上図のサブフローで構成されたタブの例の場合、内部的には下記のコードと同じような構成になっていると思われます。
FUNCTION Subflow_1
# サブフロー1
END
FUNCTION Subflow_2
# サブフロー2
END
また、Power Automate Desktopの編集画面ではサブフロー全体をコピーしても、FUNCTION ~ ENDより内側のコードしか取り出すことができません。
(FUNCTION構文に該当する部分はタブのUIで管理されており、編集リストでは関数内のアクションしか表示、選択、コピーできないため)
そのためFUNCTION構文を含めた関数全体のソースコードをテキストで記述して直接貼り付けることなどはできません。
FUNCTION構文を使て関数を作りCALLで呼び出す
# サブフロー1
FUNCTION Subflow_1
# ここにアクションを配置
END
#メインフローからサブフローの呼び出し
CALL Subflow_1
上記の構文はRobin言語としては正しいのですが、Power Automate DesktopではFUNCTION構文を読み取らないため貼り付けることができません。
Power Automate Desktopで使用する場合は関数の内側のコードとメインコードそれぞれを分割して貼り付ける必要があります。
コメント
コメントはハッシュ記号#を使って記述できます。なおRobin言語では#は行の途中に配置することもできますが、Power Automate Desktopで行の途中のコメントを読み取る(コードを貼り付ける)と、自動的にコメントとコメント以前のアクションの2つの項目に分解されて登録されます。
# これはコメントです。
CALL Subflow_1 #サブフローの呼び出し
また複数行のコメントは/# ~ #/を使って記述できます。
/# ここからコメントです。
ここはコメントです。
ここもコメントです。
#/
制御文字のエスケープ
Robin言語で使用される特定の制御文字を変数などで利用する場合にはエスケープが必要です。エスケープはバックスラッシュ(円記号)\を使って記述します。
Power Automate Desktopではエスケープが必要な文字列は自動的にエスケープされます。
SET text TO 'I\'m a onion!.'
下記のコードのようにエスケープが正しくされていないコードはPower Automate Desktopに貼り付けることができません。(エラーも表示されず何も起こりません)
SET text TO 'I'm a onion!.'
アクションの有効化と無効化
Robin言語では記述されたコマンドが1つずつ(コードの上から1行ずつ)順番に実行されます。
あるコマンドを削除せずに実行できないようにしたい場合、DISABLEという構文を使用してコマンドを無効にすることができます。これはPower Automate Desktopでアクションを [無効] にした場合と同じ動作となります。
DISABLE SET text TO '''Hello RPA World!'''
Robin言語ではループや条件などの複数行からなる構文に対して「disable block」という構文を使用することで、ブロック全体を無効にすることができるのですが、Power Automate Desktopではサポートされていないようです。
DISABLE BLOCK LOOP i FROM 1 TO 100
SET x TO i
END
予約語
Robin言語では以下が予約語とされています。Power Automate Desktopではこれらの予約語を変数名などに使用することはできません。
設定画面で指定する際に「無効な値」と表示されます。
action、and、block、call、case、default、disable、else、end、error、exit、false、for、foreach、from、function、goto、if、import、in、label、loop、main、mod、next、no、not、on、or、output、repeat、set、step、switch、then、throw、times、to、true、wait、while、xor、yes
変数のスコープ
Robin言語の仕様では関数(Function構文)内の変数はローカル変数として定義されます。(※Power Automate Desktopの場合の後述あり)
FUNCTION Subflow_1
# ローカル変数
set hoge to '''hogehoge'''
END
# エラーになる
set name to hoge
また、グローバル変数は変数名の前にg:をつけることで定義が可能です。
# グローバル変数
set g:name to '''fugafuga'''
Power Automate Desktopでの変数スコープ
前項でRobinでは通常の変数がローカル変数で作られると書きましたが、Power Automate Desktop環境では少し挙動が異なるようです。
Power Automate Desktopではサブフロー(Functionで構成されていると思われる)に配置した変数がローカル変数の宣言であるにもかかわらず、メインフローや他のサブフローからも参照できてしまいます。
SET NewVar TO $'''hoge'''
この辺りは筆者も厳密な仕様がよくわかっておらず、実際の挙動を参考に解説しています。
Power Automate Desktopでの変数をグローバルっぽくする挙動の正体
恐らくですが、サブフローのための関数は以下のような内部構造になっており、関数内で作った変数をすべて戻り値として返し、変数を共通化しているのではないかと思われます。
# 変数を作る
set 変数A to 値A
set 変数B to 値B
# サブフローはすべての変数を受け取り、サブフロー内で作った変数もすべて返すようにする
FUNCTION Subflow_1 変数A, 変数B OUTPUT 変数A, OUTPUT 変数B, OUTPUT 変数C
# 関数内で値を書き換える
set 変数A to 値X
# 関数内で新たな変数を作る
set 変数C to 値C
...
END
# サブフローを呼ぶときにすべての変数を渡して、サブフロー内の変数も受け取る
CALL Subflow_1 変数A:変数A 変数B:変数B 変数C=>変数C
このサブフローの呼び出しやメインフローの内部構造については明らかになっていないためあくまで想像ですが、変数のスコープなどを意識せずプログラム初心者でも扱いやすくするために、Power Automate Desktopでは関数間のやり取りなどを編集させずに内部コントロールしているのではないかと思われます。
Power Automate Desktopに限った話として、基本的に変数はグローバル参照と考えておけば事故はないと思いますが、、、もし情報がございましたら是非教えてください。
データ型(変数)の種類
テキスト型
文字列変数。SET構文に文字列を使用することで設定できます。テキストの値は常に引用符で囲む必要があります。
SET text TO 'Hello World'
Robin言語ではテキスト変数に3重のシングルクォーテーションを使うことで複数行のテキスト変数を扱うことができます。
SET multilinetext to '''これは
複数行の
テキストです。'''
テキスト型のプロパティ
| 名前 | タイプ | 説明 |
|---|---|---|
| length | 数値 | 変数に格納されているテキストの文字数。 |
数値型
数値変数。SET構文に数値を使用することで設定できます。
SET num TO 6
Robin言語では16進数値や8進数値の設定もサポートされていますが、Power Automate Desktopでは貼り付け時に自動的に10進数値に変換されます。
SET hexnum TO 0x0a00
ブール型
ブール変数は、SET構文にTrue、FalseもしくはNoのほか、比較演算子、論理演算子を使用することで設定できます。
true、falseによる設定
SET boolvar TO false
比較演算子による設定
# falseになる
SET boolvar TO 3 != 3
# 上記と同じ
SET boolvar TO 3 <> 3
論理演算子による設定
# trueになる
SET boolvar TO 3 = 4 OR 10 > 1
SET boolvar3 TO 'a' NOT IN 'abcd'
アクションの戻り値を変数に格納する
アクションにはブール型の変数を戻り値として返すものがあり、これらはカッコ( ~ )を使用することで変数値として使用することができます。
この構文はRobinでは有効ですが、Power Automate Desktopではコードを直接貼り付けることはできません。(エラーも表示されず何も起こりません)
# ファイルが存在する場合 boolvar に true 存在しなければ false
set boolvar to (File.Exists File: "C:\file.txt")
日付時刻(datetime)型
日付時刻(datetime)型の変数はDateTime.Currentなどの日時関連のアクションを使って設定できます。
DateTime.Current DateTimeFormat: DateTime.DateTimeFormat.DateAndTime Offset: $'''Asia/Tokyo''' CurrentDateTime=> CurrentDateTime
また、Robin言語では「d"yyyy-MM-dd HH:mm:ss.fff+zz"」の書式を使うことでも設定可能です。Power Automate Desktopでもこの定義方法が使えるため「日付の選択ダイアログを表示」アクションや「現在の日時を取得します」アクションなどを使わず、特定の日時を手動で指定したい場合などにも利用することができます。
SET birthday TO d"1999-11-22 12:34:56"
# 以下の書式も有効
SET birthday TO D'1999/11/22 12:34:56'
Power Automate Desktopの設定ダイアログで指定する場合は [宛先] ボックスに「%D'yyyy/MM/dd HH:mm:ss'%」の書式で入力します。
日付時刻(datetime)型のプロパティ
| 名前 | タイプ | 説明 |
|---|---|---|
| Year | 数値 | DateTime値の年の部分。 |
| Month | 数値 | DateTime値の月の部分。 |
| Day | 数値 | DateTime値の日の部分。 |
| DayOfWeek | テキスト | その日の名前(例:日曜日、月曜日など) |
| DayOfYear | 数値 | DateTime値の年の日(うるう年の場合は1-365または366) |
| Hour | 数値 | DateTime値の時間部分。 |
| Minute | 数値 | DateTime値の分の部分。 |
| Second | 数値 | DateTime値の秒の部分。 |
リストデータ型
リスト化された値を扱うことができるデータ型。他言語での配列に近い動作をします。
リストが同じ型の要素で構成されている場合、リストはそのタイプのリストとみなされます(数値型のリスト、文字列型のリスト、など)。また、リストには複数の型の要素を含めることもできます(一般的なリスト)。
リストを作成するには各カッコ[ ~ ]を使用します。
# 数値型のリストを作る
SET numlist TO [1,2,3,4]
# テキスト型のリストを作る
SET textlist TO ["Hello","World","This","is","a","list"]
# 一般的なリストを作る
SET generallist TO ["Hello","World","This","is","a","list",1,2,3,4]
また、リストはネスト(階層化)させることができます。
SET nestlist TO [["London","New York","Tokyo"],[1,2,3]]
Power Automate Desktopでは「新しいリストの作成」アクションでリストを作成できますが、上記のコードを応用して「変数の設定」アクションでリスト型の変数を作ることも可能です。
「新しいリストの作成」アクションではVariablesというモジュールを使ってリストが生成されています。
Variables.CreateNewList List=> MyList
リストデータ型のプロパティ
| 名前 | タイプ | 説明 |
|---|---|---|
| Count | 数値 | リスト内のアイテムの数。 |
データテーブル型
データテーブル型は中カッコ{ ~ }を使って設定することができます。
# ユーザー名と年齢のデータテーブルを作る
SET dtvar TO {['John', 24], ['Catherine', 27], ['Mary', 35]}
データテーブルには見出し(ヘッダ)の情報を設定することができます。見出しはサーカムフレックス(キャレット)記号^で指定します。
これは特定の処理で見出しを参照したり、見出しの処理をスキップしたりする場合に利用できます。
SET dtvar TO {^['Name','Age'],['John', 24], ['Catherine', 27], ['Mary', 35]}
このデータテーブル型はFor Eachアクションで各行の繰り返し処理を簡単に行えることが最大のポイントかと思います。
また、前述のデータテーブルに見出しが設定されていた場合、For Eachアクションでは見出しをスキップしてデータ行だけを処理対象とすることができるため非常に便利です。
空のデータテーブルを作成することもできます。
SET x TO {}
データ行
通常、データ型を構成する要素のひとつはデータ行となります。データ行変数に値を割り当てるためにはデータテーブルが必要となります。
データテーブルの行は各カッコ[ ~ ]を使って参照することができ、この値をデータ行変数として設定することができます。
SET drvar TO dtvar[0]
データ型の要素のカウントは1番目の要素をゼロ([0])と数える「ゼロベース」でのカウントとなります。
カスタムオブジェクト
カスタムプロパティなどを使用できるデータ型。
# 国情報を扱うカスタムオブジェクト
SET CustObjectVar TO {'Country': 'France', 'Capital': 'Paris', 'Population': 66998000,'ISO 3166 code': 'FR'}
# 空のカスタムオブジェクト
set x to {{}}
%CustObjectVar.Country%などとすることでプロパティの値を参照することができます。
一般的な値
複数の型を持つ変数は一般的な値とみなされます。
SET genvar TO 10
SET genvar TO 'robin'
モジュールのデータ型
インスタンス
自動化で使用するためのオブジェクトを参照するインスタンス。
自動化を行う際、最初のアクションでインスタンスを出力し、そのインスタンスにバインドされているモジュール(Excel、Webブラウザなど)に対して自動操作となるアクションを実行していきます。
下記はRobin公式より提供されているモジュールの一覧です。
| モジュール | データ型 |
|---|---|
| Active Directory | Active Directory Entry |
| AWS | EC2クライアント |
| Azure | Azureクライアント |
| Capturefast | Capturefast Connection |
| CMD | CMDセッション |
| Database | SQL接続 |
| Email Instance | |
| Excel | Excel Instance |
| Exchange | Exchange Connection |
| FTP | FTP 接続 |
| OCR | OCR Engine |
| Outlook | Outlook Instance |
| Terminal Emulation | Terminal Session |
| UI Automation | ウィンドウインスタンス |
| Web Automation | Web ブラウザインスタンス |
RPAおよびRobinでの特に特徴的な要素となる「自動操作」はこのそれぞれのモジュールがもつアクションによって実現されています。
アクション構文
アクション構文の書式は以下のようになっています。
モジュール名.アクション名 引数1:'値1' 引数2:'値2' 戻り値1=> 代入先変数1 戻り値2=> 代入先変数2
Power Automate Desktopではもちろんこの構文を手書きすることはありませんが、編集画面に配置されたアクションをコピーしてメモ帳などに張り付けることで、このような書式を持ったコードを確認することができます。
「新しいMicrosoft Edgeを起動する」アクションのRobinソースコード
例として、「新しいMicrosoft Edgeを起動する」アクションのRobinソースコードは以下のようになっています
WebAutomation.LaunchEdge Url: $'''https://cravelweb.com/''' WindowState: WebAutomation.BrowserWindowState.Normal ClearCache: False ClearCookies: False BrowserInstance=> Browser
上記はPower Automate Desktopで以下のような設定のアクションをコピーしました。詳細の設定などは行っていません。
この構文を分解していくと以下のようになります。
# モジュール名.アクション名 引数1:'値1' 引数2:'値2' 戻り値1=> 代入先変数1 戻り値2=> 代入先変数2
WebAutomation.LaunchEdge Url: $'''https://cravelweb.com/''' WindowState: WebAutomation.BrowserWindowState.Normal ClearCache: False ClearCookies: False BrowserInstance=> Browser
- モジュール名:
WebAutomation - アクション名:
LaunchEdge - 引数
- Url:
$'''https://cravelweb.com/''' - WindowState:
WebAutomation.BrowserWindowState.Normal - ClearCache:
False - ClearCookies:
False
- Url:
- 戻り値:
BrowserInstance - 代入先変数:
Browser
ぱっと見では見慣れない(かもしれない)記号なども並んでいるためとっつきにくそうですが、分解してみると構造がよくわかります。
このように、基本的にほとんどのアクションはモジュールにより提供されており、モジュールがもつアクションに必要な引数を渡してあげれば何らかの処理が実行され、結果が戻り値として返ってくるようになっています。
列挙型(Enum)
特定の範囲の可能な値を持つデータ型、オプションが制限されている場合に列挙型が使用されます。
列挙型の構文は「引数名:列挙型名.値」で記述します。
MailsToRetrieve:RetrieveMessagesMode.All
変数の演算(数値、文字列)
算術演算
演算記号(+、-、/、*、%、mod)による算術演算が可能です。
# 加算
SET sum TO 2+1
# 減算
SET diff TO 2-1
# 乗算
SET prod TO 2*3
# 除算
SET div TO 3/2
# 剰余演算
SET divident TO 26 mod 5
文字列演算
テキストの連結
プラス記号+を使って文字列を連結することができます。
SET text1 TO 'Monday'
SET text2 TO 'Friday'
SET duration TO TextVar1+' TO '+TextVar2
ドル記号$を使うことで文字列補間式を利用することも可能。変数はパーセント%記号で囲んで指定します。
SET TextVar1 TO 'Monday'
SET TextVar2 TO 'Friday'
SET duration TO $"%TextVar1% to %TextVar2%"
テキストの一部を抽出
マイナス記号-を使うことで、その文字列を差し引いた文字列の一部を抽出することができます。
SET SubtractText TO 'ABCD'-'B'
インデックス・スライス
リストデータ型、データテーブル型、テキスト型の変数には各アイテムや文字にインデックスが設定されます。
インデックスはこれらのデータを分解して処理する場合に利用されます。
インデックスは各カッコ[ ~ ]を使って単一のインデックスもしくは範囲を指定できます。(ゼロベースに注意)
| 表記 | 説明 |
|---|---|
| [4:] | 5番目の要素から最後まで |
| [:6] | 最初から7番目の要素まで |
| [4:6] | 5番目の要素から7番目の要素まで |
SET date TO 'MON15APR'
# 文字列の先頭から3文字を取り出す -> MON
SET dayname to date[:3]
SET date TO ['MON',15,'APR']
# 3番目の要素を取り出す -> APR
SET monthname TO date[2]
リストの演算(結合・除外)
プラス記号+、マイナス記号-を使用してリストの結合、除外を行うことができます。
SET list1 TO ['A','B','D']
SET list2 TO ['A','C','D','E']
SET sumlist TO list1+list2
比較演算子
Robinで使用できる比較演算子は以下。
| 表記 | 操作 |
|---|---|
| = | 等しい |
| != | 等しくない |
| <> | 等しくない |
| < | より少ない |
| <= | 以下 |
| > | より多い |
| >= | 以上 |
| in | 含まれる |
| not in | 含まれない |
テキストの比較
テキスト型変数に比較演算子を利用することで、アルファベットのソート順の比較を行うことができます。
# true を返す
SET Names TO "Adam" < "Bob"
日付の比較
日付時刻(datetime)型変数に比較演算子を使用することで、日時を比較することができる。
SET Dates TO d"2019-11-12" > d"2019-12-14"
リストの比較
比較演算子inを使用することで、特定のリストの中に指定したリスト項目が含まれているかいないかを比較することができます。
SET list1 TO ['A','B','D']
SET list2 TO ['A','C','D','E']
SET listpart TO list1 IN list2
# False
論理演算子
| 表記 | 操作 |
|---|---|
| or | 多くの条件の1つが満たされるとき |
| and | すべての条件が満たされたとき |
| xor | 2つの条件のうち1つだけが満たされる場合 |
| not | 条件を満たさない場合 |
3つ以上のオペランドを含む論理演算は左から右に処理されます。またカッコ ( ~ ) が指定されていた場合、算術演算と同じようにカッコから優先して処理されます。
# or の例
SET A TO True
SET B TO False
SET LogResult TO A OR B
# and の例
SET A TO True
SET B TO False
SET LogResult TO A AND B
# xor の例
SET A TO True
SET B TO False
SET LogResult TO A XOR B
# not の例
SET A TO True
SET B TO False
SET LogResult TO NOT A





コメント