Power Automate Desktop のフローの部品化について考える

# はじめに
2021年6月のPower Automate Desktop のアップデートにてデスクトップフローから他のデスクトップフローを呼び出すことが可能となりました。
**※「Desktop フローを実行」アクションの追加**
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1064310/0e937bae-b4be-9109-c9bd-afc0e8819e4c.png)


個人的にはPower Automate Desktop の前身である WinAutomation で多用してきた機能ですので、待望の機能実装です!!
また、従来からPower Automate の有償ライセンス「アテンド型 RPA のユーザーごとのプラン」を保有しているアカウントではクラウドフロー(Power Automate)とデスクトップフロー（Power Automate Desktop）を連携できていました。
今回はデスクトップフロー連携のみについて触れます。

# 本記事について
2021年7月1日時点の内容を基に作成しております

# 目的
デスクトップフロー間の呼び出しができるようになったことで、フローを部品化して活用することが可能になりました。
フローを連携する際は、入出力変数を使うことで簡単に値の受け渡しをすることができますが、2021年6月時点では入出力変数のデータ型は限られた型でしか扱うことができません。
そこで、限られたデータ型の中でいかにフローを部品化して活用できるか検証した結果を備忘録としてまとめます。
※共通してやり取りするファイルを事前に用意し、それぞれ読取りや書き出しすることでもデータのやり取りは可能ですが、排他制御など考慮する必要がでてくるのでなるべくフロー内で完結するやり方をまとめます

# 前提条件・テストデータ
今回検証で使うデータは山形市の推計人口データです。
[引用]
[山形市の現在の推計人口 — 山形市役所 (https://www.city.yamagata-yamagata.lg.jp/shiseijoho/sub13/tokei/87500suikei.html)](https://www.city.yamagata-yamagata.lg.jp/shiseijoho/sub13/tokei/87500suikei.html)

対象となるExcelは以下の通りです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1064310/cf89dd00-e427-d13e-b4df-bd3188dc9fc5.png)

部品化するフローとして、上記の山形市の推計人口データを扱います。
※本来部品化する際には、フロー内に以下の処理を盛り込む必要があります。
①：推移人口データを特定のページからダウンロードする
②：ダウンロードしたExcelを起動する
③：Excelを読込、データテーブルとして変数に設定する
今回はあくまでも検証が目的なので、ダウンロード処理～Excelからデータの読み取り部分は割愛しています。
（「変数の設定」アクションで上記処理から得られるデータを想定して事前に生成しています。）

```r:PAD(変数の設定アクションを用いたデータテーブルの生成)
SET PopulationData TO { ^['時点', '世帯数', '人口', '男', '女', '出生', '死亡', '自然動態増減', '転入', '転出', '社会動態増減', '人口総増減', '推計の基準となる国勢調査時点'], ['令和3年5月1日', '103238', '246644', '118426', '128218', '123', '262', '△ 139', '1804', '1442', '362', '223', '令和2年国勢調査速報値'], ['令和3年4月1日', '102611', '246421', '118325', '128096', '134', '265', '△ 131', '1764', '2206', '△ 442', '△ 573', '令和2年国勢調査速報値'], ['令和3年3月1日', '102463', '246994', '118631', '128363', '110', '241', '△ 131', '400', '458', '△ 58', '△ 189', '令和2年国勢調査速報値'], ['令和3年2月1日', '102526', '247183', '118709', '128474', '132', '276', '△ 144', '305', '351', '△ 46', '△ 190', '令和2年国勢調査速報値'], ['令和3年1月1日', '102563', '247373', '118799', '128574', '125', '237', '△ 112', '374', '390', '△ 16', '△ 128', '令和2年国勢調査速報値'], ['令和2年12月1日', '102593', '247501', '118880', '128621', '113', '273', '△ 160', '401', '391', '10', '△ 150', '令和2年国勢調査速報値'], ['令和2年11月1日', '102576', '247651', '118967', '128684', '138', '245', '△ 107', '467', '456', '11', '△ 96', '令和2年国勢調査速報値'], ['令和2年10月1日', '102531', '247747', '119022', '128725', '164', '247', '△ 83', '444', '455', '△ 11', '△ 94', '令和2年国勢調査速報値'], ['令和2年10月1日', '103922', '247987', '119324', '128663', '164', '247', '△ 83', '444', '455', '△ 11', '△ 94', '平成27年国勢調査確定値'], ['令和2年9月1日', '103897', '248081', '119359', '128722', '160', '236', '△ 76', '408', '420', '△ 12', '△ 88', '平成27年国勢調査確定値'], ['令和2年8月1日', '103915', '248169', '119373', '128796', '137', '224', '△ 87', '450', '429', '21', '△ 66', '平成27年国勢調査確定値'], ['令和2年7月1日', '103868', '248235', '119379', '128856', '141', '211', '△ 70', '373', '358', '15', '△ 55', '平成27年国勢調査確定値'], ['令和2年6月1日', '103831', '248290', '119387', '128903', '135', '236', '△ 101', '377', '288', '89', '△ 12', '平成27年国勢調査確定値'], ['令和2年5月1日', '103786', '248302', '119388', '128914', '137', '223', '△ 86', '1835', '1376', '459', '373', '平成27年国勢調査確定値'], ['令和2年4月1日', '103136', '247929', '119143', '128786', '133', '248', '△ 115', '1679', '2283', '△ 604', '△ 719', '平成27年国勢調査確定値'], ['令和2年3月1日', '103090', '248648', '119518', '129130', '126', '224', '△ 98', '425', '451', '△ 26', '△ 124', '平成27年国勢調査確定値'], ['令和2年2月1日', '103165', '248772', '119566', '129206', '147', '314', '△ 167', '387', '383', '4', '△ 163', '平成27年国勢調査確定値'], ['令和2年1月1日', '103179', '248935', '119644', '129291', '146', '252', '△ 106', '411', '390', '21', '△ 85', '平成27年国勢調査確定値'], ['令和元年12月1日', '103191', '249020', '119665', '129355', '134', '265', '△ 131', '386', '429', '△ 43', '△ 174', '平成27年国勢調査確定値'], ['令和元年11月1日', '103227', '249194', '119727', '129467', '155', '230', '△ 75', '446', '504', '△ 58', '△ 133', '平成27年国勢調査確定値'], ['令和元年10月1日', '103243', '249327', '119787', '129540', '140', '217', '△ 77', '544', '504', '40', '△ 37', '平成27年国勢調査確定値'], ['令和元年9月1日', '103187', '249364', '119811', '129553', '144', '255', '△ 111', '463', '545', '△ 82', '△ 193', '平成27年国勢調査確定値'], ['令和元年8月1日', '103244', '249557', '119924', '129633', '165', '228', '△ 63', '545', '607', '△ 62', '△ 125', '平成27年国勢調査確定値'], ['令和元年7月1日', '103278', '249682', '120003', '129679', '139', '192', '△ 53', '397', '405', '△ 8', '△ 61', '平成27年国勢調査確定値'], ['令和元年6月1日', '103242', '249743', '120029', '129714', '137', '262', '△ 125', '543', '495', '48', '△ 77', '平成27年国勢調査確定値'], ['令和元年5月1日', '103201', '249820', '120078', '129742', '137', '215', '△ 78', '1778', '1500', '278', '200', '平成27年国勢調査確定値'], ['平成31年4月1日', '102578', '249620', '119929', '129691', '126', '250', '△ 124', '1753', '2344', '△ 591', '△ 715', '平成27年国勢調査確定値'], ['平成31年3月1日', '102592', '250335', '120268', '130067', '115', '263', '△ 148', '435', '533', '△ 98', '△ 246', '平成27年国勢調査確定値'], ['平成31年2月1日', '102641', '250581', '120391', '130190', '123', '311', '△ 188', '355', '414', '△ 59', '△ 247', '平成27年国勢調査確定値'], ['平成31年1月1日', '102720', '250828', '120525', '130303', '155', '248', '△ 93', '434', '410', '24', '△ 69', '平成27年国勢調査確定値'], ['平成30年12月1日', '102694', '250897', '120557', '130340', '153', '231', '△ 78', '416', '415', '1', '△ 77', '平成27年国勢調査確定値'], ['平成30年11月1日', '102668', '250974', '120580', '130394', '148', '239', '△ 91', '586', '519', '67', '△ 24', '平成27年国勢調査確定値'], ['平成30年10月1日', '102623', '250998', '120586', '130412', '155', '225', '△ 70', '512', '470', '42', '△ 28', '平成27年国勢調査確定値'], ['平成30年9月1日', '102560', '251026', '120584', '130442', '189', '216', '△ 27', '512', '526', '△ 14', '△ 41', '平成27年国勢調査確定値'], ['平成30年8月1日', '102553', '251067', '120528', '130539', '176', '246', '△ 70', '584', '542', '42', '△ 28', '平成27年国勢調査確定値'], ['平成30年7月1日', '102536', '251095', '120562', '130533', '145', '197', '△ 52', '396', '455', '△ 59', '△ 111', '平成27年国勢調査確定値'], ['平成30年6月1日', '102537', '251206', '120596', '130610', '154', '241', '△ 87', '499', '477', '22', '△ 65', '平成27年国勢調査確定値'], ['平成30年5月1日', '102442', '251271', '120626', '130645', '151', '233', '△ 82', '1953', '1621', '332', '250', '平成27年国勢調査確定値'], ['平成30年4月1日', '101784', '251021', '120500', '130521', '138', '244', '△ 106', '1634', '2121', '△ 487', '△ 593', '平成27年国勢調査確定値'], ['平成30年3月1日', '101830', '251614', '120814', '130800', '129', '248', '△ 119', '368', '459', '△ 91', '△ 210', '平成27年国勢調査確定値'], ['平成30年2月1日', '101924', '251824', '120917', '130907', '147', '293', '△ 146', '373', '358', '15', '△ 131', '平成27年国勢調査確定値'], ['平成30年1月1日', '101912', '251955', '120953', '131002', '160', '219', '△ 59', '379', '344', '35', '△ 24', '平成27年国勢調査確定値'] }
```

# 本題
本題に入ります。
以下の記述より、各フローを「親フロー」、「子フロー」と明記します。

- 「親フロー」：呼び出し元のフロー（親フローは子フローを呼び出す）
- 「子フロー」：部品として扱う、呼び出し先のフロー（親フローから呼び出されるフロー）

## 入出力変数 について
フロー間（デスクトップフロー同士の連携、クラウドフローとデスクトップフローの連携）で値をやり取りするために利用する変数です。

- 入力変数：テキスト型のみ入力可能
- 出力変数：
    - クラウドフロー：テキスト型のみ出力可能
    - デスクトップフロー：テキスト型、数値型、日付型を出力可能
        - **リスト型、データテーブル型を出力変数に設定すると、テキスト値として出力される**

上記に記載した通り、リスト型、データテーブル型の値をやり取りする場合には、親フローまたは子フロー側で扱いやすいように工夫する必要があります。(2021年7月1日時点の情報ですので、今後のアップデートで変更される可能性があります)
以下より、単一の値（テキスト型、数値型、日付型）、リスト型、データテーブル型の受け渡しについて解説していきます。


## 【ケース1】：単一の値の受け渡し
<概要>
・一番シンプルな値の連携方法
・子フローの処理結果を、「テキスト型」、「数値型」、「日付型」で呼び出し元に返却

### ■サンプル：指定した年月（時点）の人口の「値」を返却する子フロー

#### サンプルの仕様
- 親フロー
    - 子フローを呼び出す
        - 指定した年月日（yyyy/MM/dd）のテキスト値を子フローへ渡す
        - 子フローから人口の「値」を受け取る
    - 子フローから受け取った値を「メッセージを表示」アクションに表示する

- 子フロー
    - 受け取った年月日(yyyy/MM/dd) を和暦に変換する（検索対象の「時点」が和暦のため）
    - 推移人口データから指定された年月の人口数を取得する
    - 取得した人口数を数値に変換する
    
入出力変数の仕様
 
|  No.  |  変数名  |  値  |  入出力変数  |  備考  |
| ---- | ---- | ---- |  ----  |  ----  |
|  1  | %InputDate% |  年月日  |  入力変数  |  yyyy/MM/dd 形式  |
|  2  | %OutputPopulation% |  人口  |  出力変数  |  人口数[数値型]を返却  |

<br>

親フロー「親フロー」（子フロー_Case1呼び出し部分）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1064310/1e592a11-7d36-536a-a6f9-1aa2220082e6.png)

```r:PAD(親フロー：子フロー_Case1呼び出し部分)
/# ############################################
# ケース1の呼び出し
#############################################/
Display.SelectDate DateDialogFormat: Display.DateDialogFormat.DateOnly IsTopMost: False SelectedDate=> SelectedDate ButtonPressed=> ButtonPressed
Text.FromCustomDateTime DateTime: SelectedDate CustomFormat: $'''yyyy/MM/dd''' Result=> FormattedDateTime
@@flowname: '子フロー_Case1'
External.RunFlow FlowId: '7b69bc0a-4ac3-4b5d-817b-0be65c8c40ef' @InputDate: FormattedDateTime @OutputPopulation=> OutputPopulation
IF IsNotEmpty(OutputPopulation) THEN
    Display.ShowMessage Title: $'''%FormattedDateTime% の人口''' Message: $'''%OutputPopulation% 人です！！''' Icon: Display.Icon.None Buttons: Display.Buttons.OK DefaultButton: Display.DefaultButton.Button1 IsTopMost: False ButtonPressed=> ButtonPressed
END
```


子フロー全体「子フロー_Case1」
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1064310/f9498f4f-18bf-6840-e500-c8473da20a6e.png)

```r:PAD(子フロー_Case1)
/# #############################################################
# ケース1　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　#
##############################################################/
/# #############################################################
# 人口データ
# ※本来URLからExcelダウンロード > Excel起動 > データ読み取りによって取得可能なデータ
##############################################################/
SET PopulationData TO { ^['時点', '世帯数', '人口', '男', '女', '出生', '死亡', '自然動態増減', '転入', '転出', '社会動態増減', '人口総増減', '推計の基準となる国勢調査時点'], ['令和3年5月1日', '103238', '246644', '118426', '128218', '123', '262', '△ 139', '1804', '1442', '362', '223', '令和2年国勢調査速報値'], ['令和3年4月1日', '102611', '246421', '118325', '128096', '134', '265', '△ 131', '1764', '2206', '△ 442', '△ 573', '令和2年国勢調査速報値'], ['令和3年3月1日', '102463', '246994', '118631', '128363', '110', '241', '△ 131', '400', '458', '△ 58', '△ 189', '令和2年国勢調査速報値'], ['令和3年2月1日', '102526', '247183', '118709', '128474', '132', '276', '△ 144', '305', '351', '△ 46', '△ 190', '令和2年国勢調査速報値'], ['令和3年1月1日', '102563', '247373', '118799', '128574', '125', '237', '△ 112', '374', '390', '△ 16', '△ 128', '令和2年国勢調査速報値'], ['令和2年12月1日', '102593', '247501', '118880', '128621', '113', '273', '△ 160', '401', '391', '10', '△ 150', '令和2年国勢調査速報値'], ['令和2年11月1日', '102576', '247651', '118967', '128684', '138', '245', '△ 107', '467', '456', '11', '△ 96', '令和2年国勢調査速報値'], ['令和2年10月1日', '102531', '247747', '119022', '128725', '164', '247', '△ 83', '444', '455', '△ 11', '△ 94', '令和2年国勢調査速報値'], ['令和2年10月1日', '103922', '247987', '119324', '128663', '164', '247', '△ 83', '444', '455', '△ 11', '△ 94', '平成27年国勢調査確定値'], ['令和2年9月1日', '103897', '248081', '119359', '128722', '160', '236', '△ 76', '408', '420', '△ 12', '△ 88', '平成27年国勢調査確定値'], ['令和2年8月1日', '103915', '248169', '119373', '128796', '137', '224', '△ 87', '450', '429', '21', '△ 66', '平成27年国勢調査確定値'], ['令和2年7月1日', '103868', '248235', '119379', '128856', '141', '211', '△ 70', '373', '358', '15', '△ 55', '平成27年国勢調査確定値'], ['令和2年6月1日', '103831', '248290', '119387', '128903', '135', '236', '△ 101', '377', '288', '89', '△ 12', '平成27年国勢調査確定値'], ['令和2年5月1日', '103786', '248302', '119388', '128914', '137', '223', '△ 86', '1835', '1376', '459', '373', '平成27年国勢調査確定値'], ['令和2年4月1日', '103136', '247929', '119143', '128786', '133', '248', '△ 115', '1679', '2283', '△ 604', '△ 719', '平成27年国勢調査確定値'], ['令和2年3月1日', '103090', '248648', '119518', '129130', '126', '224', '△ 98', '425', '451', '△ 26', '△ 124', '平成27年国勢調査確定値'], ['令和2年2月1日', '103165', '248772', '119566', '129206', '147', '314', '△ 167', '387', '383', '4', '△ 163', '平成27年国勢調査確定値'], ['令和2年1月1日', '103179', '248935', '119644', '129291', '146', '252', '△ 106', '411', '390', '21', '△ 85', '平成27年国勢調査確定値'], ['令和元年12月1日', '103191', '249020', '119665', '129355', '134', '265', '△ 131', '386', '429', '△ 43', '△ 174', '平成27年国勢調査確定値'], ['令和元年11月1日', '103227', '249194', '119727', '129467', '155', '230', '△ 75', '446', '504', '△ 58', '△ 133', '平成27年国勢調査確定値'], ['令和元年10月1日', '103243', '249327', '119787', '129540', '140', '217', '△ 77', '544', '504', '40', '△ 37', '平成27年国勢調査確定値'], ['令和元年9月1日', '103187', '249364', '119811', '129553', '144', '255', '△ 111', '463', '545', '△ 82', '△ 193', '平成27年国勢調査確定値'], ['令和元年8月1日', '103244', '249557', '119924', '129633', '165', '228', '△ 63', '545', '607', '△ 62', '△ 125', '平成27年国勢調査確定値'], ['令和元年7月1日', '103278', '249682', '120003', '129679', '139', '192', '△ 53', '397', '405', '△ 8', '△ 61', '平成27年国勢調査確定値'], ['令和元年6月1日', '103242', '249743', '120029', '129714', '137', '262', '△ 125', '543', '495', '48', '△ 77', '平成27年国勢調査確定値'], ['令和元年5月1日', '103201', '249820', '120078', '129742', '137', '215', '△ 78', '1778', '1500', '278', '200', '平成27年国勢調査確定値'], ['平成31年4月1日', '102578', '249620', '119929', '129691', '126', '250', '△ 124', '1753', '2344', '△ 591', '△ 715', '平成27年国勢調査確定値'], ['平成31年3月1日', '102592', '250335', '120268', '130067', '115', '263', '△ 148', '435', '533', '△ 98', '△ 246', '平成27年国勢調査確定値'], ['平成31年2月1日', '102641', '250581', '120391', '130190', '123', '311', '△ 188', '355', '414', '△ 59', '△ 247', '平成27年国勢調査確定値'], ['平成31年1月1日', '102720', '250828', '120525', '130303', '155', '248', '△ 93', '434', '410', '24', '△ 69', '平成27年国勢調査確定値'], ['平成30年12月1日', '102694', '250897', '120557', '130340', '153', '231', '△ 78', '416', '415', '1', '△ 77', '平成27年国勢調査確定値'], ['平成30年11月1日', '102668', '250974', '120580', '130394', '148', '239', '△ 91', '586', '519', '67', '△ 24', '平成27年国勢調査確定値'], ['平成30年10月1日', '102623', '250998', '120586', '130412', '155', '225', '△ 70', '512', '470', '42', '△ 28', '平成27年国勢調査確定値'], ['平成30年9月1日', '102560', '251026', '120584', '130442', '189', '216', '△ 27', '512', '526', '△ 14', '△ 41', '平成27年国勢調査確定値'], ['平成30年8月1日', '102553', '251067', '120528', '130539', '176', '246', '△ 70', '584', '542', '42', '△ 28', '平成27年国勢調査確定値'], ['平成30年7月1日', '102536', '251095', '120562', '130533', '145', '197', '△ 52', '396', '455', '△ 59', '△ 111', '平成27年国勢調査確定値'], ['平成30年6月1日', '102537', '251206', '120596', '130610', '154', '241', '△ 87', '499', '477', '22', '△ 65', '平成27年国勢調査確定値'], ['平成30年5月1日', '102442', '251271', '120626', '130645', '151', '233', '△ 82', '1953', '1621', '332', '250', '平成27年国勢調査確定値'], ['平成30年4月1日', '101784', '251021', '120500', '130521', '138', '244', '△ 106', '1634', '2121', '△ 487', '△ 593', '平成27年国勢調査確定値'], ['平成30年3月1日', '101830', '251614', '120814', '130800', '129', '248', '△ 119', '368', '459', '△ 91', '△ 210', '平成27年国勢調査確定値'], ['平成30年2月1日', '101924', '251824', '120917', '130907', '147', '293', '△ 146', '373', '358', '15', '△ 131', '平成27年国勢調査確定値'], ['平成30年1月1日', '101912', '251955', '120953', '131002', '160', '219', '△ 59', '379', '344', '35', '△ 24', '平成27年国勢調査確定値'] }
IF IsEmpty(InputDate) THEN
    Display.ShowMessage Message: $'''入力された年月日の情報が不正''' Icon: Display.Icon.Warning Buttons: Display.Buttons.OK DefaultButton: Display.DefaultButton.Button1 IsTopMost: False ButtonPressed=> ButtonPressed
    EXIT Code: 0
ELSE
    System.RunPowershellScript Script: $'''$CInfo = New-Object cultureinfo(\"ja-jp\");
$Jpn = New-Object System.Globalization.JapaneseCalendar;
$CInfo.DateTimeFormat.Calendar = $Jpn;
Write-Host -NoNewline ([datetime]\'%InputDate%\').ToString(\"ggy年M月\", $CInfo)''' ScriptOutput=> Wareki ScriptError=> ScriptError
END
# 対象年月の人口を取得する
LOOP FOREACH CurrentItem IN PopulationData
    IF StartsWith(CurrentItem['時点'], Wareki, False) THEN
        SET OutputPopulation TO CurrentItem['人口']
        Text.ToNumber Text: OutputPopulation Number=> OutputPopulation
        EXIT LOOP
    END
END
```


#### フローの実行
**親フローを実行してみる。**
①：日付選択のダイアログが表示される。
・対象の日付を設定する。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1064310/be569abc-3b3f-50f8-e1c4-1c18099ac6b8.png)

②：裏では「子フロー_Case1」が実行される。
・①で指定した日付がフロー呼び出し時に「子フロー_Case1」に渡される。
・子フローの処理結果（人口数）が親フローに返ってくる。
・受け取った処理結果をメッセージに表示する。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1064310/5c3931c6-172a-777c-6c3f-2b530502eef5.png)

・①で「2021年4月1日」を指定しているので、人口は「246421」が取得できた。元データをチェックし、正しいことを確認。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1064310/9d7369ad-162a-218f-c3be-37e391141417.png)

③：子フローからの処理結果 %OutputPopulation% の中身を見てみる。
・数値型として受け取れている。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1064310/2ab41385-12a7-90b2-d1ce-6f08a7ce2c27.png)


#### ケース1のまとめ
部品化した子フローの処理結果を受け取る際、テキスト型や数値型、日付型などの単一の値であれば特に意識せずに結果を受け取ることができるので、1項目を受け取るような部品としてフロー運用する場合は簡単に実現ができる。



## 【ケース2】：リスト型データの受け渡し
<概要>
・子フローの処理結果をリスト型で返却
・リスト型の状態で値を返却できない（テキスト型になる）ので、子フローまたは親フロー側で考慮が必要

### ■サンプル：指定した年月（時点）から遡ってXXか月分の人口の「リスト」を返却する子フロー

#### サンプルの仕様
- 親フロー
    - 子フローを呼び出す
        - 指定した年月日（yyyy/MM/dd）のテキスト値、取得対象の月数のテキスト値を子フローへ渡す
        - 子フローの処理結果：人口の「リスト型」値を受け取る（値を受け取ると、テキスト型になっているのでリスト型に変換する）
    - 子フローから受け取った値を1件ずつ「メッセージを表示」アクションに表示する

- 子フロー
    - 受け取った年月日(yyyy/MM/dd) を和暦に変換する（検索対象の「時点」が和暦のため）
    - 推移人口データから指定された年月の人口数を取得月数分遡って取得する
    - 取得した人口数をリストに格納する

入出力変数の仕様
 
|  No.  |  変数名  |  値  |  入出力変数  |  備考  |
| ---- | ---- | ---- |  ----  |  ----  |
|  1  | %InputDate% |  年月日  |  入力変数  |  yyyy/MM/dd 形式  |
|  2  | %InputMonth% |  対象月数  |  入力変数  |  何か月分を取得するか指定  |
|  3  | %OutputPopulation% |  人口のリスト  |  出力変数  |  人口数のリストを返却  |

<br>

親フロー「親フロー」（子フロー_Case2呼び出し部分）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1064310/08885c5d-22da-9ef7-3387-91377a22ea8e.png)

```r:PAD(親フロー：子フロー_Case2呼び出し部分)
/# ############################################
# ケース2の呼び出し
#############################################/
Display.SelectDate DateDialogFormat: Display.DateDialogFormat.DateOnly IsTopMost: False SelectedDate=> SelectedDate ButtonPressed=> ButtonPressed
Text.FromCustomDateTime DateTime: SelectedDate CustomFormat: $'''yyyy/MM/dd''' Result=> FormattedDateTime
Display.InputDialog Title: $'''対象月数の入力''' Message: $'''取得したい月数を入力してください''' DefaultValue: 1 InputType: Display.InputType.SingleLine IsTopMost: False UserInput=> UserInput ButtonPressed=> ButtonPressed
@@flowname: '子フロー_Case2'
External.RunFlow FlowId: '2b575b4b-bf63-4cb3-812e-023b5a1ccb49' @InputDate: FormattedDateTime @InputMonth: UserInput @OutputPopulation=> OutputPopulation
Text.Split Text: OutputPopulation StandardDelimiter: Text.StandardDelimiter.NewLine DelimiterTimes: 1 Result=> TextList
SET LoopCount TO 1
LOOP FOREACH CurrentItem IN TextList
    Display.ShowMessage Title: $'''%FormattedDateTime%から %LoopCount% ヵ月前の人口''' Message: $'''%CurrentItem% 人''' Icon: Display.Icon.None Buttons: Display.Buttons.OK DefaultButton: Display.DefaultButton.Button1 IsTopMost: False ButtonPressed=> ButtonPressed
    Variables.IncreaseVariable Value: LoopCount IncrementValue: 1 IncreasedValue=> LoopCount
END
```


子フロー全体「子フロー_Case2」
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1064310/3712eb96-72a7-5262-2a91-3637183c1359.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1064310/a0f5cb5a-8fce-7a75-b08d-988f65fb6c16.png)

```r:PAD(子フロー_Case2)
/# #############################################################
# ケース2　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　#
##############################################################/
/# #############################################################
# 人口データ
# ※本来URLからExcelダウンロード > Excel起動 > データ読み取りによって取得可能なデータ
##############################################################/
SET PopulationData TO { ^['時点', '世帯数', '人口', '男', '女', '出生', '死亡', '自然動態増減', '転入', '転出', '社会動態増減', '人口総増減', '推計の基準となる国勢調査時点'], ['令和3年5月1日', '103238', '246644', '118426', '128218', '123', '262', '△ 139', '1804', '1442', '362', '223', '令和2年国勢調査速報値'], ['令和3年4月1日', '102611', '246421', '118325', '128096', '134', '265', '△ 131', '1764', '2206', '△ 442', '△ 573', '令和2年国勢調査速報値'], ['令和3年3月1日', '102463', '246994', '118631', '128363', '110', '241', '△ 131', '400', '458', '△ 58', '△ 189', '令和2年国勢調査速報値'], ['令和3年2月1日', '102526', '247183', '118709', '128474', '132', '276', '△ 144', '305', '351', '△ 46', '△ 190', '令和2年国勢調査速報値'], ['令和3年1月1日', '102563', '247373', '118799', '128574', '125', '237', '△ 112', '374', '390', '△ 16', '△ 128', '令和2年国勢調査速報値'], ['令和2年12月1日', '102593', '247501', '118880', '128621', '113', '273', '△ 160', '401', '391', '10', '△ 150', '令和2年国勢調査速報値'], ['令和2年11月1日', '102576', '247651', '118967', '128684', '138', '245', '△ 107', '467', '456', '11', '△ 96', '令和2年国勢調査速報値'], ['令和2年10月1日', '102531', '247747', '119022', '128725', '164', '247', '△ 83', '444', '455', '△ 11', '△ 94', '令和2年国勢調査速報値'], ['令和2年10月1日', '103922', '247987', '119324', '128663', '164', '247', '△ 83', '444', '455', '△ 11', '△ 94', '平成27年国勢調査確定値'], ['令和2年9月1日', '103897', '248081', '119359', '128722', '160', '236', '△ 76', '408', '420', '△ 12', '△ 88', '平成27年国勢調査確定値'], ['令和2年8月1日', '103915', '248169', '119373', '128796', '137', '224', '△ 87', '450', '429', '21', '△ 66', '平成27年国勢調査確定値'], ['令和2年7月1日', '103868', '248235', '119379', '128856', '141', '211', '△ 70', '373', '358', '15', '△ 55', '平成27年国勢調査確定値'], ['令和2年6月1日', '103831', '248290', '119387', '128903', '135', '236', '△ 101', '377', '288', '89', '△ 12', '平成27年国勢調査確定値'], ['令和2年5月1日', '103786', '248302', '119388', '128914', '137', '223', '△ 86', '1835', '1376', '459', '373', '平成27年国勢調査確定値'], ['令和2年4月1日', '103136', '247929', '119143', '128786', '133', '248', '△ 115', '1679', '2283', '△ 604', '△ 719', '平成27年国勢調査確定値'], ['令和2年3月1日', '103090', '248648', '119518', '129130', '126', '224', '△ 98', '425', '451', '△ 26', '△ 124', '平成27年国勢調査確定値'], ['令和2年2月1日', '103165', '248772', '119566', '129206', '147', '314', '△ 167', '387', '383', '4', '△ 163', '平成27年国勢調査確定値'], ['令和2年1月1日', '103179', '248935', '119644', '129291', '146', '252', '△ 106', '411', '390', '21', '△ 85', '平成27年国勢調査確定値'], ['令和元年12月1日', '103191', '249020', '119665', '129355', '134', '265', '△ 131', '386', '429', '△ 43', '△ 174', '平成27年国勢調査確定値'], ['令和元年11月1日', '103227', '249194', '119727', '129467', '155', '230', '△ 75', '446', '504', '△ 58', '△ 133', '平成27年国勢調査確定値'], ['令和元年10月1日', '103243', '249327', '119787', '129540', '140', '217', '△ 77', '544', '504', '40', '△ 37', '平成27年国勢調査確定値'], ['令和元年9月1日', '103187', '249364', '119811', '129553', '144', '255', '△ 111', '463', '545', '△ 82', '△ 193', '平成27年国勢調査確定値'], ['令和元年8月1日', '103244', '249557', '119924', '129633', '165', '228', '△ 63', '545', '607', '△ 62', '△ 125', '平成27年国勢調査確定値'], ['令和元年7月1日', '103278', '249682', '120003', '129679', '139', '192', '△ 53', '397', '405', '△ 8', '△ 61', '平成27年国勢調査確定値'], ['令和元年6月1日', '103242', '249743', '120029', '129714', '137', '262', '△ 125', '543', '495', '48', '△ 77', '平成27年国勢調査確定値'], ['令和元年5月1日', '103201', '249820', '120078', '129742', '137', '215', '△ 78', '1778', '1500', '278', '200', '平成27年国勢調査確定値'], ['平成31年4月1日', '102578', '249620', '119929', '129691', '126', '250', '△ 124', '1753', '2344', '△ 591', '△ 715', '平成27年国勢調査確定値'], ['平成31年3月1日', '102592', '250335', '120268', '130067', '115', '263', '△ 148', '435', '533', '△ 98', '△ 246', '平成27年国勢調査確定値'], ['平成31年2月1日', '102641', '250581', '120391', '130190', '123', '311', '△ 188', '355', '414', '△ 59', '△ 247', '平成27年国勢調査確定値'], ['平成31年1月1日', '102720', '250828', '120525', '130303', '155', '248', '△ 93', '434', '410', '24', '△ 69', '平成27年国勢調査確定値'], ['平成30年12月1日', '102694', '250897', '120557', '130340', '153', '231', '△ 78', '416', '415', '1', '△ 77', '平成27年国勢調査確定値'], ['平成30年11月1日', '102668', '250974', '120580', '130394', '148', '239', '△ 91', '586', '519', '67', '△ 24', '平成27年国勢調査確定値'], ['平成30年10月1日', '102623', '250998', '120586', '130412', '155', '225', '△ 70', '512', '470', '42', '△ 28', '平成27年国勢調査確定値'], ['平成30年9月1日', '102560', '251026', '120584', '130442', '189', '216', '△ 27', '512', '526', '△ 14', '△ 41', '平成27年国勢調査確定値'], ['平成30年8月1日', '102553', '251067', '120528', '130539', '176', '246', '△ 70', '584', '542', '42', '△ 28', '平成27年国勢調査確定値'], ['平成30年7月1日', '102536', '251095', '120562', '130533', '145', '197', '△ 52', '396', '455', '△ 59', '△ 111', '平成27年国勢調査確定値'], ['平成30年6月1日', '102537', '251206', '120596', '130610', '154', '241', '△ 87', '499', '477', '22', '△ 65', '平成27年国勢調査確定値'], ['平成30年5月1日', '102442', '251271', '120626', '130645', '151', '233', '△ 82', '1953', '1621', '332', '250', '平成27年国勢調査確定値'], ['平成30年4月1日', '101784', '251021', '120500', '130521', '138', '244', '△ 106', '1634', '2121', '△ 487', '△ 593', '平成27年国勢調査確定値'], ['平成30年3月1日', '101830', '251614', '120814', '130800', '129', '248', '△ 119', '368', '459', '△ 91', '△ 210', '平成27年国勢調査確定値'], ['平成30年2月1日', '101924', '251824', '120917', '130907', '147', '293', '△ 146', '373', '358', '15', '△ 131', '平成27年国勢調査確定値'], ['平成30年1月1日', '101912', '251955', '120953', '131002', '160', '219', '△ 59', '379', '344', '35', '△ 24', '平成27年国勢調査確定値'] }
Variables.CreateNewList List=> PopulationList
Text.ToNumber Text: InputMonth Number=> InputMonth
IF IsEmpty(InputDate) THEN
    Display.ShowMessage Message: $'''入力された年月日の情報が不正''' Icon: Display.Icon.Warning Buttons: Display.Buttons.OK DefaultButton: Display.DefaultButton.Button1 IsTopMost: False ButtonPressed=> ButtonPressed
    EXIT Code: 0
ELSE
    # 和暦の算出
    System.RunPowershellScript Script: $'''$CInfo = New-Object cultureinfo(\"ja-jp\");
$Jpn = New-Object System.Globalization.JapaneseCalendar;
$CInfo.DateTimeFormat.Calendar = $Jpn;
Write-Host -NoNewline ([datetime]\'%InputDate%\').ToString(\"ggy年M月\", $CInfo)''' ScriptOutput=> Wareki ScriptError=> ScriptError
END
# 対象年月の人口を取得する
LOOP LoopIndex FROM 0 TO PopulationData.RowsCount - 1 STEP 1
    IF StartsWith(PopulationData[LoopIndex]['時点'], Wareki, False) THEN
        LOOP ManthCount FROM 0 TO InputMonth - 1 STEP 1
            # 指定された月数分の人口を取得
            Variables.AddItemToList Item: PopulationData[LoopIndex + ManthCount]['人口'] List: PopulationList NewList=> PopulationList
        END
        EXIT LOOP
    END
END
SET OutputPopulation TO PopulationList
# リストデータを文字列として返却するように加工
Text.JoinWithDelimiter List: PopulationList StandardDelimiter: Text.StandardDelimiter.NewLine DelimiterTimes: 1 Result=> OutputPopulation
```


#### フローの実行：その１
- 子フローの出力変数に設定する値をリスト型のまま処理してみる

上記に記載したサンプルの子フロー（子フロー_Case2）の25行目の「テキストの結合」アクションを無効化する
・リスト型のまま呼び出し元のフローに値が返却される
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1064310/98508601-3827-304e-a874-afd708839f12.png)

①：子フロー単体で実行する
・入力変数は以下の通り設定
　%InputDate%：2021/04/01 、%InputMonth%：3
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1064310/7e76e8ed-b7b8-bf39-d1d4-a722d635ad52.png)

・子フロー単体で実行した際の出力変数に設定される値
　%PopulationList% の値を %OutputPopulation%　に設定
　リストに3つの値が格納されていることがわかる。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1064310/48589f46-326d-18d0-fcba-2286b4c14579.png)

②：入力変数は①と同じ条件で親フローを実行する
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1064310/31af1f03-4f01-1482-f8ce-333207114db1.png)

③：子フローの処理結果として変数 %OutputPopulation% に下記の図の通り値が設定された
・子フローではリスト型だった値が処理結果としてテキスト型の値で結果が返却されている
・3行のリスト ⇒ 4行のテキスト値に変換されている（4行目は空）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1064310/99fec8c4-06e6-734e-98b1-d1080cd1b8cd.png)

④：子フローからの処理結果 %OutputPopulation% をリスト型に変換する
・「テキストの分割」アクションを利用
・設定内容は以下の図
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1064310/b233c208-cb5d-19e6-9d1d-db96aa4bdaf2.png)

・処理結果
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1064310/127365bb-2b19-d10d-7714-45855528fe12.png)


** その１：まとめ **
子フローを呼び出した結果、親フロー側でテキスト値となった処理結果を状況に応じて再度リストに戻す処理が必要になる
また、余計な空行が生成されてしまうため、親フロー側で考慮が必要になることが分かった


#### フローの実行：その２
- 子フローの出力変数に設定する値をテキスト型に変換して処理してみる

①：子フロー単体で実行する
・入力変数は以下の通り設定
　%InputDate%：2021/04/01 、%InputMonth%：3

・その１で無効化した子フローの「テキストの結合」アクションを有効化する
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1064310/2765248d-12c2-feda-88ce-44a8e06443f6.png)

・アクション設定：リストを改行で区切ったテキスト値に変換するように設定した
　※カンマ区切りやスペース区切りなど、子フロー（部品化するフローの要件に合わせて変更可能）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1064310/119fe1d6-e7d6-a032-109e-394d12b63a9d.png)


・子フロー単体で実行した際の出力変数に設定される値
リスト型がテキスト型として出力変数に設定されていることがわかる
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1064310/e9f72e4d-281e-2049-0fc0-dab5843c9431.png)


②：入力変数は①と同じ条件で親フローを実行する
・年月日を設定
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1064310/53cad2f7-b1f3-3a38-ddb5-a123e190a98f.png)
・対象月数を指定
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1064310/05162596-71e9-b95a-8bb6-c6ed2269957b.png)


③：子フローの処理結果として変数 %OutputPopulation% に下記の図の通り値が設定された
・テキスト型の値で結果が返却されている
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1064310/20fe5050-a092-df7d-6870-ad4d13330b80.png)


④：子フローからの処理結果 %OutputPopulation% をリスト型に変換する
・「テキストの分割」アクションを利用
・子フロー側は改行のテキストが渡されるため以下の設定になっているが、カンマ区切りやスペースなど子フロー側の仕様に合わせて設定が必要
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1064310/f06a891c-a1f2-d6e9-d61f-22b31a6195b6.png)

・正しくリスト型に変換された
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1064310/dba6059a-30ab-8eb5-af16-2f5c840d0499.png)

以下は処理結果のメッセージ
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1064310/e6e3954b-6a0d-52e0-d739-b401041d68bc.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1064310/a353f720-925c-44fa-2dcd-d4aa6c52ecbb.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1064310/446971d8-9dad-023e-ca02-64251921c040.png)

**その２：まとめ**
子フロー側でリスト型の値を事前に加工（テキスト化）することによって、処理結果を親フロー側でも扱いやすくなることが分かった


#### ケース2のまとめ
現時点では、出力変数に設定したリスト型の値は受け取り側（親フロー）でテキスト値として変換された状態で設定されてしまう。
受け取り側（親フロー）でテキスト値に変換されていることを事前に把握していれば、特に問題なく親フロー側で再度リスト型に変換することで柔軟に処理することが可能。
ただし、「フローの部品化」という点においては、子フロー側でとれる考慮を入れるべきだと思うため、事前に子フロー側で以下の処理を入れると、親フロー側でも扱いやすくなる。
・リスト型で出力変数に設定する場合は、事前に「テキストの結合」アクションを使ってテキスト値に変換する
　⇒パラメーターの「リスト項目を区切る区切り記号」は標準またはカスタムに設定し、区切り記号は「新しい行」や「カンマ」など状況に合わせて設定する
・そもそもリスト型の値を設定する必要がない場合は、必要な文字列を子フロー側で生成してテキスト値を出力変数に設定する


## 【ケース3】：データテーブル型の受け渡し
<概要>
・Excelから取得したデータや、スクレイピングしたテーブル型のデータを連携するのに一番？応用が利く方法
・デスクトップフロー間だけではなく、クラウドフロー間の連携でも活用できる

### ■サンプル：呼び出すと推移人口データの「データテーブル」を返却する子フロー

#### サンプルの仕様
- 親フロー
    - 子フローを呼び出す
        - 子フローから推移人口を受け取る

- 子フロー
    - 推移人口データをJSON形式に変換する

入出力変数の仕様
 
|  No.  |  値  |  入出力変数  |  備考  |
| ---- | ---- |  ----  |  ----  |
|  1  | 推移人口のデータテーブル  |  出力変数  |  推移人口データのデータテーブル型を返却  |

<br>

親フロー「親フロー」（子フロー_Case3呼び出し部分）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1064310/1c483ff2-1105-cec9-94c1-6c4b89f23644.png)

```r:PAD(親フロー：子フロー_Case3呼び出し部分)
/# ############################################
# ケース3の呼び出し
#############################################/
@@flowname: '子フロー_Case3'
External.RunFlow FlowId: '3bf0122a-4719-4994-a576-cd40ef00e0e2' @OutputPopulation=> OutputPopulation
```

子フロー全体「子フロー_Case3」
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1064310/465ebd44-6db9-c2a5-e5cd-80e96d3c816d.png)

```r:PAD(子フロー_Case3)
/# #############################################################
# ケース3　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　#
##############################################################/
/# #############################################################
# 人口データ
# ※本来URLからExcelダウンロード > Excel起動 > データ読み取りによって取得可能なデータ
##############################################################/
SET PopulationData TO { ^['時点', '世帯数', '人口', '男', '女', '出生', '死亡', '自然動態増減', '転入', '転出', '社会動態増減', '人口総増減', '推計の基準となる国勢調査時点'], ['令和3年5月1日', '103238', '246644', '118426', '128218', '123', '262', '△ 139', '1804', '1442', '362', '223', '令和2年国勢調査速報値'], ['令和3年4月1日', '102611', '246421', '118325', '128096', '134', '265', '△ 131', '1764', '2206', '△ 442', '△ 573', '令和2年国勢調査速報値'], ['令和3年3月1日', '102463', '246994', '118631', '128363', '110', '241', '△ 131', '400', '458', '△ 58', '△ 189', '令和2年国勢調査速報値'], ['令和3年2月1日', '102526', '247183', '118709', '128474', '132', '276', '△ 144', '305', '351', '△ 46', '△ 190', '令和2年国勢調査速報値'], ['令和3年1月1日', '102563', '247373', '118799', '128574', '125', '237', '△ 112', '374', '390', '△ 16', '△ 128', '令和2年国勢調査速報値'], ['令和2年12月1日', '102593', '247501', '118880', '128621', '113', '273', '△ 160', '401', '391', '10', '△ 150', '令和2年国勢調査速報値'], ['令和2年11月1日', '102576', '247651', '118967', '128684', '138', '245', '△ 107', '467', '456', '11', '△ 96', '令和2年国勢調査速報値'], ['令和2年10月1日', '102531', '247747', '119022', '128725', '164', '247', '△ 83', '444', '455', '△ 11', '△ 94', '令和2年国勢調査速報値'], ['令和2年10月1日', '103922', '247987', '119324', '128663', '164', '247', '△ 83', '444', '455', '△ 11', '△ 94', '平成27年国勢調査確定値'], ['令和2年9月1日', '103897', '248081', '119359', '128722', '160', '236', '△ 76', '408', '420', '△ 12', '△ 88', '平成27年国勢調査確定値'], ['令和2年8月1日', '103915', '248169', '119373', '128796', '137', '224', '△ 87', '450', '429', '21', '△ 66', '平成27年国勢調査確定値'], ['令和2年7月1日', '103868', '248235', '119379', '128856', '141', '211', '△ 70', '373', '358', '15', '△ 55', '平成27年国勢調査確定値'], ['令和2年6月1日', '103831', '248290', '119387', '128903', '135', '236', '△ 101', '377', '288', '89', '△ 12', '平成27年国勢調査確定値'], ['令和2年5月1日', '103786', '248302', '119388', '128914', '137', '223', '△ 86', '1835', '1376', '459', '373', '平成27年国勢調査確定値'], ['令和2年4月1日', '103136', '247929', '119143', '128786', '133', '248', '△ 115', '1679', '2283', '△ 604', '△ 719', '平成27年国勢調査確定値'], ['令和2年3月1日', '103090', '248648', '119518', '129130', '126', '224', '△ 98', '425', '451', '△ 26', '△ 124', '平成27年国勢調査確定値'], ['令和2年2月1日', '103165', '248772', '119566', '129206', '147', '314', '△ 167', '387', '383', '4', '△ 163', '平成27年国勢調査確定値'], ['令和2年1月1日', '103179', '248935', '119644', '129291', '146', '252', '△ 106', '411', '390', '21', '△ 85', '平成27年国勢調査確定値'], ['令和元年12月1日', '103191', '249020', '119665', '129355', '134', '265', '△ 131', '386', '429', '△ 43', '△ 174', '平成27年国勢調査確定値'], ['令和元年11月1日', '103227', '249194', '119727', '129467', '155', '230', '△ 75', '446', '504', '△ 58', '△ 133', '平成27年国勢調査確定値'], ['令和元年10月1日', '103243', '249327', '119787', '129540', '140', '217', '△ 77', '544', '504', '40', '△ 37', '平成27年国勢調査確定値'], ['令和元年9月1日', '103187', '249364', '119811', '129553', '144', '255', '△ 111', '463', '545', '△ 82', '△ 193', '平成27年国勢調査確定値'], ['令和元年8月1日', '103244', '249557', '119924', '129633', '165', '228', '△ 63', '545', '607', '△ 62', '△ 125', '平成27年国勢調査確定値'], ['令和元年7月1日', '103278', '249682', '120003', '129679', '139', '192', '△ 53', '397', '405', '△ 8', '△ 61', '平成27年国勢調査確定値'], ['令和元年6月1日', '103242', '249743', '120029', '129714', '137', '262', '△ 125', '543', '495', '48', '△ 77', '平成27年国勢調査確定値'], ['令和元年5月1日', '103201', '249820', '120078', '129742', '137', '215', '△ 78', '1778', '1500', '278', '200', '平成27年国勢調査確定値'], ['平成31年4月1日', '102578', '249620', '119929', '129691', '126', '250', '△ 124', '1753', '2344', '△ 591', '△ 715', '平成27年国勢調査確定値'], ['平成31年3月1日', '102592', '250335', '120268', '130067', '115', '263', '△ 148', '435', '533', '△ 98', '△ 246', '平成27年国勢調査確定値'], ['平成31年2月1日', '102641', '250581', '120391', '130190', '123', '311', '△ 188', '355', '414', '△ 59', '△ 247', '平成27年国勢調査確定値'], ['平成31年1月1日', '102720', '250828', '120525', '130303', '155', '248', '△ 93', '434', '410', '24', '△ 69', '平成27年国勢調査確定値'], ['平成30年12月1日', '102694', '250897', '120557', '130340', '153', '231', '△ 78', '416', '415', '1', '△ 77', '平成27年国勢調査確定値'], ['平成30年11月1日', '102668', '250974', '120580', '130394', '148', '239', '△ 91', '586', '519', '67', '△ 24', '平成27年国勢調査確定値'], ['平成30年10月1日', '102623', '250998', '120586', '130412', '155', '225', '△ 70', '512', '470', '42', '△ 28', '平成27年国勢調査確定値'], ['平成30年9月1日', '102560', '251026', '120584', '130442', '189', '216', '△ 27', '512', '526', '△ 14', '△ 41', '平成27年国勢調査確定値'], ['平成30年8月1日', '102553', '251067', '120528', '130539', '176', '246', '△ 70', '584', '542', '42', '△ 28', '平成27年国勢調査確定値'], ['平成30年7月1日', '102536', '251095', '120562', '130533', '145', '197', '△ 52', '396', '455', '△ 59', '△ 111', '平成27年国勢調査確定値'], ['平成30年6月1日', '102537', '251206', '120596', '130610', '154', '241', '△ 87', '499', '477', '22', '△ 65', '平成27年国勢調査確定値'], ['平成30年5月1日', '102442', '251271', '120626', '130645', '151', '233', '△ 82', '1953', '1621', '332', '250', '平成27年国勢調査確定値'], ['平成30年4月1日', '101784', '251021', '120500', '130521', '138', '244', '△ 106', '1634', '2121', '△ 487', '△ 593', '平成27年国勢調査確定値'], ['平成30年3月1日', '101830', '251614', '120814', '130800', '129', '248', '△ 119', '368', '459', '△ 91', '△ 210', '平成27年国勢調査確定値'], ['平成30年2月1日', '101924', '251824', '120917', '130907', '147', '293', '△ 146', '373', '358', '15', '△ 131', '平成27年国勢調査確定値'], ['平成30年1月1日', '101912', '251955', '120953', '131002', '160', '219', '△ 59', '379', '344', '35', '△ 24', '平成27年国勢調査確定値'] }
SET OutputPopulation TO PopulationData
SET PopulationHeader TO PopulationData.Columns
Text.Split Text: PopulationData StandardDelimiter: Text.StandardDelimiter.NewLine DelimiterTimes: 1 Result=> DataTableList
Text.JoinWithCustomDelimiter List: PopulationHeader CustomDelimiter: $''',''' Result=> DataTableHeader
System.RunPowershellScript Script: $'''$TmpDataTable = ConvertFrom-CSV @( \'%DataTableList%\') -Header %DataTableHeader%;
ConvertTo-Json $TmpDataTable ;''' ScriptOutput=> PowershellOutput ScriptError=> ScriptError
SET OutputPopulation TO PowershellOutput
```


#### フローの実行：その１
- 子フローの出力変数に設定する値をデータテーブル型のまま処理してみる

上記に記載したサンプルの子フロー（子フロー_Case3）の5行目処理以降を無効化する
・データテーブル型のまま呼び出し元のフローに値が返却される
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1064310/877074e4-d163-cb0f-3ae3-54c70c18783c.png)


①：子フロー単体で実行する
・処理結果：データテーブルとして値が設定されている
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1064310/885d46b0-2e2c-03fa-d77d-f51e28dcfbee.png)

②：親フローを実行する
・処理結果：データテーブル型の値がテキスト値としてカンマ区切りのデータになっていることがわかる
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1064310/5522d747-cc4e-e206-9bec-4dcd537f3113.png)



**その１：まとめ**
上記の通り、子フローの処理結果として設定される値は、データテーブルの各列がカンマで区切られたテキスト値になることが分かった
親フロー側ではテキスト値に変換された値を再度リスト型に変換し、ループ等で必要な値を取得するなど考慮が必要


#### フローの実行：その２
- 子フローの出力変数に設定する値をテキスト型に変換して処理してみる

①：子フロー単体で実行する
・その１で無効化した子フローのアクションを有効化する
【各アクションの解説】
・データテーブル型の変数 %PopulationData% の列名をリストデータとして変数に設定する
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1064310/d94e73cd-c09d-acc0-7466-37d5e968e672.png)

処理結果は以下の通り
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1064310/90c3538d-a683-0b04-bd53-8ebe0a656f99.png)

・データテーブル型の変数をリストデータに変換する
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1064310/0a147bba-f7a3-48ee-ef4e-a727a5397032.png)

処理結果は以下の通り
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1064310/a3c43e50-8838-9225-8686-54a78ce32288.png)

・データテーブルの列名を格納したリストをカンマ区切りのテキスト値として設定する
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1064310/168b10ae-52c9-dbcc-be33-c5afc53607a5.png)

処理結果は以下の通り
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1064310/32e57d3f-aa69-dfa5-3610-2b99054d0819.png)

・「PowerShell スクリプトの実行」アクションを使って、上記の各アクションから用意した値をJSON形式に変換する
　・変数：%DataTableList% を PSCustomObjectに変換
　　（ヘッダー指定：ヘッダーは「テキストの結合」アクションで生成した、変数：%DataTableHeader%）
　・PSCustomObjectに変換した値をJSON変換

```r:PAD(PowerShell)
System.RunPowershellScript Script: $'''$TmpDataTable = ConvertFrom-CSV @( \'%DataTableList%\') -Header %DataTableHeader%;
ConvertTo-Json $TmpDataTable ;''' ScriptOutput=> PowershellOutput ScriptError=> ScriptError
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1064310/9ff27846-da48-40c7-0a0f-37d6b2468238.png)

・子フロー単体で実行した際の出力変数に設定される値
データテーブル型の値がテキスト型（JSON形式）として出力変数に設定されることがわかる
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1064310/853785f2-f40c-f294-6207-3a819d87cd34.png)


②：親フローを実行する

③：子フローの処理結果として変数 %OutputPopulation% に下記の図の通り値が設定された
・テキスト型の値でJSONの結果が設定された
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1064310/66ae4620-c8d8-5ea2-d981-5aca26413f64.png)

JSON形式で値を受け取ることができたので、後は親フロー側で「JSON をカスタムオブジェクトに変換」アクションでカスタムオブジェクトに変換したうえで必要なデータをループ処理や条件分岐処理によって簡単に取得できるようになる


**その２：まとめ**
子フロー側でデータテーブル型の値を加工（JSON形式に変換）することによって、処理結果を親フロー側でも扱いやすくなることが分かった
デスクトップフロー間だけではなく、クラウドフローとの連携など幅広く活用できる
JSON形式で値を返したい場合は、上記のアクションの組み合わせを使って、必要なパラメータを設定してあげるだけでそのままJSONに変換し、汎用的に使える部品として利用できる！...はず
**※数千行~1万行程度のデータであれば、PAD内で問題なくJSON変換し呼び出し元にも値を返すことができています**

#### ケース3のまとめ
現時点では、出力変数に設定したデータテーブル型の値は受け取り側（親フロー）でテキスト値として変換された状態で設定されてしまう。
リスト型のケース(ケース2）と同様に受け取り側（親フロー）でテキスト値に変換されていることを事前に把握していれば、問題なく親フロー側でリスト型やデータテーブル型に変換し処理可能だが、親フロー側で都度テキスト型を戻す処理を記述するよりも子フロー側で考慮した方が実装が楽。
また、「フローの部品化」として値の受け渡しが必要となる場合には、データテーブル型の値をJSON形式に変換しやり取りすることで、データの型による制限をあまり受けることなく連携が可能。
デスクトップフローの部品としてフローを作成した場合でもそのまま呼び出し元をクラウドフローに置き換えて処理させることも問題ないため、汎用性はかなり高いと思う。


## 親フロー
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1064310/39bc90fd-2ca3-49d2-7ba6-62ecd7706116.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1064310/0929c755-57d0-2403-c4fb-131340a34635.png)

```r:PAD(親フロー全体)
Display.SelectFromList Title: $'''実行するケースを指定''' Message: $'''実行したいケースを①～③で指定してください''' List: $'''1
2
3''' IsTopMost: False AllowEmpty: False SelectedItem=> SelectedItem SelectedIndex=> SelectedIndex ButtonPressed=> ButtonPressed
SWITCH SelectedItem
    CASE = 1
        /# ############################################
# ケース1の呼び出し
#############################################/
        Display.SelectDate DateDialogFormat: Display.DateDialogFormat.DateOnly IsTopMost: False SelectedDate=> SelectedDate ButtonPressed=> ButtonPressed
        Text.FromCustomDateTime DateTime: SelectedDate CustomFormat: $'''yyyy/MM/dd''' Result=> FormattedDateTime
        @@flowname: '子フロー_Case1'
        External.RunFlow FlowId: '7b69bc0a-4ac3-4b5d-817b-0be65c8c40ef' @InputDate: FormattedDateTime @OutputPopulation=> OutputPopulation
        IF IsNotEmpty(OutputPopulation) THEN
            Display.ShowMessage Title: $'''%FormattedDateTime% の人口''' Message: $'''%OutputPopulation% 人です！！''' Icon: Display.Icon.None Buttons: Display.Buttons.OK DefaultButton: Display.DefaultButton.Button1 IsTopMost: False ButtonPressed=> ButtonPressed
        END
    CASE = 2
        /# ############################################
# ケース2の呼び出し
#############################################/
        Display.SelectDate DateDialogFormat: Display.DateDialogFormat.DateOnly IsTopMost: False SelectedDate=> SelectedDate ButtonPressed=> ButtonPressed
        Text.FromCustomDateTime DateTime: SelectedDate CustomFormat: $'''yyyy/MM/dd''' Result=> FormattedDateTime
        Display.InputDialog Title: $'''対象月数の入力''' Message: $'''取得したい月数を入力してください''' DefaultValue: 1 InputType: Display.InputType.SingleLine IsTopMost: False UserInput=> UserInput ButtonPressed=> ButtonPressed
        @@flowname: '子フロー_Case2'
        External.RunFlow FlowId: '2b575b4b-bf63-4cb3-812e-023b5a1ccb49' @InputDate: FormattedDateTime @InputMonth: UserInput @OutputPopulation=> OutputPopulation
        Text.Split Text: OutputPopulation StandardDelimiter: Text.StandardDelimiter.NewLine DelimiterTimes: 1 Result=> TextList
        SET LoopCount TO 1
        LOOP FOREACH CurrentItem IN TextList
            Display.ShowMessage Title: $'''%FormattedDateTime%から %LoopCount% ヵ月前の人口''' Message: $'''%CurrentItem% 人''' Icon: Display.Icon.None Buttons: Display.Buttons.OK DefaultButton: Display.DefaultButton.Button1 IsTopMost: False ButtonPressed=> ButtonPressed
            Variables.IncreaseVariable Value: LoopCount IncrementValue: 1 IncreasedValue=> LoopCount
        END
    CASE = 3
        /# ############################################
# ケース3の呼び出し
#############################################/
        @@flowname: '子フロー_Case3'
        External.RunFlow FlowId: '3bf0122a-4719-4994-a576-cd40ef00e0e2' @OutputPopulation=> OutputPopulation
    DEFAULT
END
```



# まとめ
- 「Desktop フローを実行」アクション追加によるフローの部品化
「Desktop フローを実行」アクションが追加されたことで、フロー同士の呼び出しやフローを部品化して利用することが可能となりました。各フローの粒度を小さくする、部品化（モジュール化）することによるメリットは共通化できることによる、フローの最適化だと思います。
事前に共通して利用できる処理を1つのフローの中にまとめ、組織内で共有することで他のユーザーは同様の処理を実装することなく、共通した処理を実現できるようになります。
部品化するフローは各ユーザーが毎回テストする必要はなく、共有前に部品化するフローの開発者や組織の管理者がテストを完了させておくことで、余計なテスト作業が削減でき、かつ品質も担保することが可能となります。
どの粒度までの処理を部品化してフローを運用していくかは、フローを運用する状況や処理するシナリオのケースに応じて検討が必要だと思いますが、色々とお試しいただければと思います。

- 部品化したフローの値の受け渡し
フローを部品化するという点において、値の入出力が発生する場合は今回検証した結果をご参考にしていただければと思います。
JSON形式でやり取りする形はかなり汎用的に使うことができ、デスクトップフロー間の連携だけではなく、そのままクラウドフローの連携でも利用することができると思います。

- 最後に
元々安定稼働していたフローを無理やり共通化して不具合が生じる可能性がある場合は、そのまま安定稼働していたフローは何か保守が必要となるタイミングまで様子を見るなど状況に応じて使い分けしていただくのがいいのかなと思います。


※注意点として、「Desktop フローを実行」アクションは現時点では同期処理のみとなります。呼び出したフローの処理が完了するまでは呼び出し元の処理は待機状態となります。（処理を高速化させるためではなく、あくまでも共通化がメイン）
※インスタンスについては、入出力変数を使って受け渡しすることはできないので、各フロー側でインスタンスを取得するように考慮が必要になります。
※備忘録的に色々と検証した結果をひとまずまとめた感じなので、内容に関する誤りやご指摘などございましたらコメントいたただけますと幸です。


# おまけ
## 西暦を和暦に変換する
- 西暦を和暦に変換する「PowerShell スクリプトの実行」アクション
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1064310/74e03ec2-f216-808a-db89-e50b0e84caf1.png)

※ .NET Framework のJapaneseCalendar クラスを使っています
以下のサンプルでは、変数 **%InputDate%** に例として **2021/06/30** を設定して実行すると、
" **令和3年6月** "が出力されます。

```r:PAD(PowerShell)
System.RunPowershellScript Script: $'''$CInfo = New-Object cultureinfo(\"ja-jp\");
$Jpn = New-Object System.Globalization.JapaneseCalendar;
$CInfo.DateTimeFormat.Calendar = $Jpn;
Write-Host -NoNewline ([datetime]\'%InputDate%\').ToString(\"ggy年M月\", $CInfo)''' ScriptOutput=> Wareki ScriptError=> ScriptError
```

## クラウドフロー連携
ケース3で作成したデータテーブル型の値をJSONに変換し、出力変数に設定するデスクトップフローをクラウドフローから呼び出すことで、クラウドフロー側でデスクトップフローの処理結果を柔軟に扱うことができるようになります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1064310/e6b2eb71-3a5e-fd8f-e4e9-d340d6d4edff.png)

例えば、フィルター処理で「時点」列から「平成」のデータだけ抽出することも。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1064310/fa1323e2-9817-e2fd-b19e-84cffec7191a.png)
 ↓↓↓↓
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1064310/c734a8e9-fb0e-135f-5bc2-65fac97179d4.png)

応用することで、デスクトップアプリケーションやAPIが提供されていないWebアプリケーションからデータを取得し、クラウドフローを介して他のクラウドサービスとも気軽に連携ができるようになります。

# 参考
・ConvertFrom-CSV
https://docs.microsoft.com/en-us/powershell/module/microsoft.powershell.utility/convertfrom-csv?view=powershell-7.1

・ConvertTo-Json
https://docs.microsoft.com/en-us/powershell/module/microsoft.powershell.utility/convertto-json?view=powershell-7.1

・.NET JapaneseCalendar クラス
https://docs.microsoft.com/ja-jp/dotnet/api/system.globalization.japanesecalendar?view=net-5.0