【UiPath】スニペットをMarketPlaceに登録してみよう

## 皆もすなるQiitaといふものを、儂もしてみむとてするなり。

と言う訳で、こん＊＊は！はなっち！です。

この記事はUiPathブログ発信チャレンジ2023サマーの14日目の記事です。

【初めに】
ロボット実行が終了したら、 **メッセージボックス** を表示させたり、 **メールを送信** したり、様々な方法で通知したりしますね。
リモートワークで業務を実行させて、その間にトイレに行ったり、洗い物をしたり、洗濯物を干したりと、家爺をしている訳で。そのような時は、 **システムサウンドを鳴らして** あげると、音で終了を判断できます。
UiPath標準の **「警告音」アクティビティ** は、名前の通り、「警告音」であって、正常終了しても「警告音」、異常終了しても「警告音」と終了の状態は判断できません。
そこで、Windowsシステムにある、 **「Windows サウンド設定」** の中にある、「警告音」以外の音を鳴らしてみようと思いました。それを更に自分用のスニペットとして登録する。自分用にとどまらず、 **MarketPlace** にも登録してみようと思いました。

今回は、 **スニペット作成** から、 **MarketPlaceへの登録申請** までをまとめてみました。
- - - 
## １）スニペットを理解する
スニペットとは、よく使う複数/単体アクティビティを登録しておき、すぐに呼び出すための機能です。以下のような特徴があります。
- 「INVOKE WorkFlowFiles」アクティビティで呼び出すのではなく、使用する.xamlファイルに、ドラッグアンドドロップして、そのまま使用できます(パラメタの見直し、再設定もできます)。
- スニペットは、.xamlファイルそのものを使用するので、他の方が作成したスニペットの.xamlファイル中のアクティビティの設定方法なども見る事が出来、後学のためになります。
- UiPathのLIBRARYを利用してカスタムアクティビティとして登録するのとは違って、スニペットは.xamlファイルそのものを登録していきます。無論試験をして、品質は高い方がいいですね。

## ２）スニペットを作ってみる
スニペットにする.xamlファイルは、1機能1ファイルにしていきます。この考えは、「INVOKE WorkFlowFiles」アクティビティで使う.xamlファイルと同じ考えでいいと思います。
下図は、「Invoke Method」アクティビティで、システムサウンドの「.Hand」を鳴らすメソッドを呼び出しているシーケンス.xamlを作成したところです。
![SNIPPET_001.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/669015/feb29760-c0f6-e37b-8854-8f8f89038b55.png)
ただ、シーケンス.xamlファイルですと、何をするスニペット用の.xamlファイルなのかが分からないので、その機能を端的に表現するような名前に、改名します。その際、物理的なファイル名だけでなく、ファイル名タブの直下のアクティビティビルダ名とか、「Invoke Method」アクティビティの上位の「シーケンス」アクティビティの表示名、「Invoke Method」アクティビティの表示名を変えておきましょう。
![SNIPPET_002.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/669015/4cb72f20-82cd-9810-d16c-8b50293b7395.png)
中には、ファイル名だけでは端的に表現できないスニペットもあるかもしれません。そのようなときは、注釈機能を使って、補記していきましょう。
![SNIPPET_004.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/669015/14005ca8-1d1d-c84c-4420-375f64cd1bd1.png)

## ３）スニペットを試験する
#### ３－１ スニペットを試験する準備
スニペットとして作成した.xamlであっても、スニペット区画に格納されていなければ、普通の.xamlと同じです。例えば対象とする.xamlファイルを、「Main.xaml」ファイルなどにドラッグアンドドロップしても、「INVOKE WorkFlowFiles」アクティビティ経由でその.xamlが使われるようになるだけです。
ですので、スニペットとして作成した.xamlは、UiPath Studioに対して、スニペットである.xamlファイルであることを教えてあげなければなりません。そのためには、スニペットである.xamlファイルを格納するフォルダを作成し、そのフォルダを、スニペットタグ上部の「フォルダーを追加」から指定します。
<img width="300" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/669015/c2ecbd6d-74d5-67aa-c2fc-227adee717e7.png">
下図の場合は、マイドキュメント中のUiPathフォルダ中に、「HANACCHI'S SNIPPETS」フォルダを作成し、それを指定しています。
<img width="250" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/669015/1fe3e3c5-ad66-e4ce-dc20-0a53d3036bac.png">
そのフォルダに、試験する.xamlファイルをコピーします。
<img width="250" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/669015/fa82ac89-118d-299b-4280-54065306c86d.png">
#### ３－２ スニペットを使ってみる
スニペットとして作成した.xamlファイルは、ロボットを構成するシーケンスの一つです。ですので、ドラッグアンドドロップした時にエラーがなければＯＫです。
例えば、スニペットとして作成した.xaml単体でエラーがなくても、使用している変数のスコープはその範囲ですので、見直しは必要です。この点に気が付かないと、設定している筈なのにログで確認すると空白になっているなど、なかなかデバッグに苦労してしまいます。
こう言った事が想定されたら、開発フェーズに立ち返って、注釈として注意すべき事を残すといいですね。

さて、作ったスニペット用.xamlをドラッグアンドドロップすると、突然エラーとなる場合があります。これは今回作成したスニペット用の.xamlファイルが「Invoke Method」アクティビティを使用しており、その「Invoke Method」アクティビティ中のTargetObjectが使用する参照関係が解決されていない事に起因するものです。
![SNIPPET_005.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/669015/d97bf2d0-54ad-9424-54c0-fc7be276f4ae.png)
そのような場合は、【TargetObject】中の文字列をカットし、一度保存（エラーは取れていない）。
![SNIPPET_008.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/669015/7cb61f9b-615e-b78a-81ef-ad9a053a8def.png)
その後、「Invoke Method」アクティビティを開き、【TargetObject】へ、ペーストします。
![SNIPPET_009.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/669015/be2d0711-9146-0308-5e0d-ffe49c66f0df.png)

本来、オートコンプリート機能を利用した際に、UiPath Studioが最適な参照関係を解決してくれるのですが、スニペットからだとその解決するキッカケがないようです（Legacyモードの時は、そんな事なかった記憶があるのですが...）。

## ４）MarketPlaceへの申請準備
さて、ここからが本番です。
ご存じのように、 **MarketPlace** は、自身が作った作品などを誰もが公開できる場所です。無論、品質を満たすため、UiPath社の審査に合格しなければなりません。
その審査のために必要な資材を揃えます。
#### 4-1 ロボット作品
スニペットの場合は、.xamlファイルもしくは、その.xamlファイルをzip圧縮したファイルが必要です。
#### 4-2 ロボットソース
スニペットを開発した時のプロセスをzip圧縮したファイルが必要です。
その際圧縮するのは、プロセスフォルダとしますが、不要なフォルダは削除しておきます。無論、必ず削除するものでもないので、気が向いたらでいいと思います。
削除しておきたいフォルダは以下のようなものです。
.entities
.local
.objects
.project
.settings
.templates
.tmh

#### 4-3 スニペット使用手引書
スニペットとして作成した.xamlファイルの持つ機能、設定を見直すパラメタ、注意事項などを使用手引書としてまとめます。これの.PDFファイルにしたものを用意します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/669015/a0025e2b-607c-ca71-09ee-e8d544cdde81.png)

#### 4-4 スニペット使用時の参考図
実際に使用する際のスニペットの構成、使用しているロボットの図などをショットしておきます。
<img width="250" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/669015/aec629d3-477a-8af3-1985-91bd84651c7e.png">

## ５）MarketPlaceへの申請
 **MarketPlace** への申請は、[MarketPlace](https://marketplace.uipath.com/ "MarketPlace Home")から行います。

#### 5-1 MarketPlace コンポートネントを作成
MatketPlaceにサインインしたのちに、右上の「コンポートネントを作成」ボタンをクリックします（この画面は時より変更されます）。
![MARKETPLACE_SNIPPET_001.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/669015/6b471d93-0fc3-cd41-e828-97a66b2cc01c.png)

#### 5-2 MarketPlace コンポートネントを作成 Page#1
このページが登録申請の開始です。ここでは、以下の項目を指定／記入します。項目の後ろにある"*"は、必須項目の印です。
- 収益化のオプション　...　●無料（○有料）
- コンポートネントの言語　...　日本語（English）
- カテゴリ　...　Studio（StudioXなど）
- サブカテゴリ　...　スニペット（カスタムアクティビティなど）
- コンポーネントの種類　...　ダウンロード可能（外部リンク）
- 相互運用性　...　オートメーションが対応している製品バージョン、コード言語およびフレームワークを指定します。
　　- 製品　...　上記カテゴリが表示される
　　- 最小バージョン *　...　想定している最小対応バージョン（22.10など）
　　- 最大バージョン　...　想定している最大対応バージョン（未入力）
　　- コード言語 *　...　■Visual Basic（□ C#）
　　- ランタイム *　...　●Windows (.NET 5.0 以上)（○Windows レガシ (.Net Framework 4.6.1)、○クロスプラットフォーム (.NET 5.0 以上)）
- コンポーネント ファイルをアップロード *　...　4-1 ロボット作品のファイル
- ソース コードをアップロード *　...　4-2 ロボットソース

![MARKETPLACE_SNIPPET_002+003.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/669015/bae0fdaf-f9a7-9dfd-e832-c3f1dae19b3c.png)

#### 5-3 MarketPlace コンポートネントを作成 Page#2
このページが登録申請の２ページ目です。ここでは、以下の項目を指定／記入します。項目の後ろにある"*"は、必須項目の印です。
- コンポーネントのタイトル *　...　 **MarketPlace** 中のカードのタイトルです。
- アイコン/ロゴ　...　未指定
- バージョン *　...　スニペットですと、自身で決めたバージョンを指定
- リリース ノート *　...　まずは「新規登録」とでも...
- タグ *　...　検索の際のキーワードを設定します。
- カードに表示する要約 *　...　カードに表示させる要約です。
- アプリケーション *　...　特化したアプリケーション名を選択します。なければ、「Not Applicable」を指定します。
- 概要 *　...　検索した結果からコンポーネントのページを開いた時に表示される概要を記入します。
- 機能 *　...　コンポーネントが保有する機能を紹介する文章を記入します。
- 画像をアップロード *　...　4-4 スニペット使用時の参考図のファイルを指定します。複数指定可能です。
- ビデオの URL を貼り付け　...　未指定
![MARKETPLACE_SNIPPET_004-007.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/669015/c16191f1-190c-3ea3-78d9-20859227c219.png)

#### 5-4 MarketPlace コンポートネントを作成 Page#3
このページが登録申請の３ページ目です。ここでは、以下の項目を指定／記入します。項目の後ろにある"*"は、必須項目の印です。
- 依存関係 *　...　使用しているアクティビティパックの情報です。
- ライセンス　...　● MIT（○カスタム ライセンス、○Apache 2.0、○3 条項 BSD）
- ライセンス URL *　...　●カスタム ライセンスの時必須です。
- プライバシー条項 *　...　● いいえ（○ はい）
※[いいえ] を選択すると、このコンポーネントは個人情報を処理しないということを確認したとみなされます。
- ドキュメント　...　4-3 スニペット使用手引書のファイルを指定します。
- ドキュメント URL　...　未指定
- 利用規約 *　...　■　I confirm that I have read, understood and accept the [Marketplace Partner Agreement](https://www.uipath.com/assets/downloads/marketplace-partner-agreement "Marketplace Partner Agreement").
![MARKETPLACE_SNIPPET_008-009.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/669015/abfbc513-f2fe-640c-74d1-097210b9ec54.png)

#### 5-5 MarketPlace コンポートネントを作成 受領
このページが登録申請受領の画面です。この画面に到達すると、UiPath社から受領しましたメールが、サインイン時のメールアドレスに送信されます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/669015/64c9f396-e4f7-550c-9994-55a28c2d865d.png)


#### 5-6 MarketPlace コンポートネントを作成 公開！！
このページが登録申請受領の画面です。この画面に到達すると、UiPath社から受領しましたメールが、サインイン時のメールアドレスに送信されます。
UiPath側での審査に合格すると、MarketPlaceにて公開されましたメールが、サインイン時のメールアドレスに送信されます（**2023/7/10受領**）。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/669015/48403317-b006-a99e-2a07-6645150f1dd2.png)
メール本文中のリンクへジャンプすると、MarketPlaceに登録されたスニペットのページが開きます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/669015/f7751465-709a-79c2-a4de-df8dda137259.png)

## 【まとめ】
- スニペットの作成は簡単。でも使っていただく人の事を考えて、**注釈**などをいれましょう。
- **MarketPlace** への登録は、意外と簡単。「カードに表示する要約」、「概要」、「機能」、「最小バージョン」、「最大バージョン」の設定が面倒かな。
- 審査は、「これではダメです」ではなく、 **「こうした方がいい」** と言うアドバイスをいただく事もあります。そこから **自身の知見が拡がり** ます。
- **公開されたら、是非SNSなどで発信してまいりましょう！**

- - - 

##おわりに
いかがでした？

今回も読んでいただきありがとうございました！
是非UiPathでのロボ開発の一助になればと思っています。

ありがとうございました！