0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

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

Last updated at Posted at 2024-11-15

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

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

image.png

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

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

image.png

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

image.png

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

image.png

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

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

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

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

image.png

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

image.png

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

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

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

image.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を追加することで文字化けを回避しちゃおうって作戦なわけ!

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

なんだけど、、、

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

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

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

1ループ目

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

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

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

それじゃまた次回!

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?