Tips #020 リストから取得したアイテムを1つずつCSVファイルにしてSharePointに作成したいゾ

https://qiita.com/Novskiiiiiiiiii/items/85b581926590dc5e4e39

SharePointリストから複数のアイテムを取得して、1アイテムごとにCSVファイルを作成して別のSharePointに格納するという処理がしたくて頑張ってみたよ！

完成したフローはこんな感じ！

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3891071/46df89f8-7749-e262-bdd5-5e3c113d4186.png)

じゃあ順番に説明していくね！

まずはこれ！
「変数を初期化する」アクションで配列変数を作っちゃおう！

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3891071/0dd162eb-ab70-590f-5135-967c0d464391.png)

お次はこれ！
「複数の項目の取得」アクションを設定しよう！

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3891071/ec67829e-d7c5-070d-357c-49bbeda90c70.png)

それからApply to each処理に入るよ！
「それぞれに適用する」アクションだね！
相変わらずわかりづらい名前だよね！

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3891071/086fd084-fba6-ba84-32dc-7dd24010f3b2.png)

パラメータには直前で取得したbody/valueを設定しよう！
ここまではみんな大丈夫だよね？

今日はIVEのAfter LIKEを聴きながらお仕事をしているよ！
推しはガウルだけど、みんなかわいいよね！

さてここからが大事なポイントだよ！

さっき初期化した配列変数にパラメータを設定しよう！
ここではとりあえず３つのフィールドを設定しているけど、
実際のCSVファイルにはもっとたくさんのフィールドが必要だと思うからよしなにやってね！

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3891071/c21dfbb5-583c-6a7c-bb38-46086e3878d0.png)

そのあとは「CSVテーブルの作成」アクションを設定しよう！
パラメータのFromには直前の配列変数をセットするよ！

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3891071/401817e4-1d5c-5a69-3152-1f5f6dabedd3.png)

これで取得したアイテムの全フィールドの中から、配列に設定したフィールドだけがCSVテーブルに格納されるんだ！

お次はCSVテーブルに追加した内容をファイル作成で出力するよ！

「ファイルの作成」アクションを次のように設定しよう！

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3891071/b633fc2a-ccfa-8afd-2a81-864b6aa98603.png)

ファイル名はここでは「ID」.csvにしているけど、もっとおしゃれな名前にしてね！

で、ファイルコンテンツなんだけど、ここは関数になっているからCode viewを見せるね！

    {
      "type": "OpenApiConnection",
      "inputs": {
        "parameters": {
          "dataset": "https://hogehoge.sharepoint.com/sites/kpop-TWICE-very-cute",
          "folderPath": "/Shared Documents/20.個人フォルダ/田中",
          "name": "@{item()?['ID']}.csv",
          "body": "@concat(decodeUriComponent('%EF%BB%BF'),body('CSV_テーブルの作成'))"
        },
        "host": {
          "apiId": "/providers/Microsoft.PowerApps/apis/shared_sharepointonline",
          "connection": "shared_sharepointonline",
          "operationId": "CreateFile"
        }
      },
      "runAfter": {
        "CSV_テーブルの作成": [
          "Succeeded"
        ]
      },
      "runtimeConfiguration": {
        "contentTransfer": {
          "transferMode": "Chunked"
        }
      }
    }

ここで大事なのはここだね！

    "body": "@concat(decodeUriComponent('%EF%BB%BF'),body('CSV_テーブルの作成'))"
　
CSVテーブルの内容の出力がここだよ！

    body('CSV_テーブルの作成')

もうひとつの関数がわけわかめだよね！

    decodeUriComponent('%EF%BB%BF')

Power Automateは文字コードがUTF-8で処理されるからExcelでひらくと文字化けしちゃうんだ！
出力されるのはCSVファイルだからぶっちゃけ問題ないっちゃないけど、なんか気持ちがわるいよね！

そこでファイル保存時にBOMを追加することで文字化けを回避しちゃおうって作戦なわけ！

その２つの関数をconcat関数で連結すれば完成だよ！

なんだけど、、、

ここまでの状態でフローを実行するとある問題が起きるんだ。

実際にやってみてもらうとわかるんだけど、２つ目以降に作成されるCSVファイルに
直前までのアイテムまでが一緒に出力されちゃうんだ！

言葉で説明しにくいからなんとなく図解するね！

１ループ目
---------------------------
    ID Title Record_kbn
    1  aaaaa AAA

2ループ目
---------------------------
    ID Title Record_kbn
    1  aaaaa AAA
    2  bbbbb BBB

最後のループ（ここでは7ループ目）
---------------------------
    ID Title Record_kbn
    1  aaaaa AAA
    2  bbbbb BBB
    3  ccccc CCC
    4  ddddd DDD
    5  eeeee EEE
    6  fffff FFF
    7  ggggg GGG

あらあらこれじゃ困っちゃうね！

これはなんでかというと、Apply to eachの頭で配列変数にデータをする際に蓄積されてしまうからなんだ！

探求心の旺盛な人は実際にフローを実行して配列の中を確認してみてね！

で、これを回避するのは実はチョー簡単！
Apply to eachの最後で配列変数を初期化すればいいんだ！

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3891071/51c51aba-6075-56b0-edb3-904025a7469b.png)

ここで注意なのは、「変数の初期化」アクションではなくて、
「変数の設定」アクションを使う事！
Valueに[]をセットする事で変数の中身が初期化されるんだ！

配列変数って難しいけど、理解できるととっても便利だよね！

それじゃまた次回！

https://qiita.com/Novskiiiiiiiiii/items/f5f330dd26da5c8a5ddd