SharePointリストから複数のアイテムを取得して、1アイテムごとにCSVファイルを作成して別のSharePointに格納するという処理がしたくて頑張ってみたよ!
完成したフローはこんな感じ!
じゃあ順番に説明していくね!
まずはこれ!
「変数を初期化する」アクションで配列変数を作っちゃおう!
お次はこれ!
「複数の項目の取得」アクションを設定しよう!
それからApply to each処理に入るよ!
「それぞれに適用する」アクションだね!
相変わらずわかりづらい名前だよね!
パラメータには直前で取得したbody/valueを設定しよう!
ここまではみんな大丈夫だよね?
今日はIVEのAfter LIKEを聴きながらお仕事をしているよ!
推しはガウルだけど、みんなかわいいよね!
さてここからが大事なポイントだよ!
さっき初期化した配列変数にパラメータを設定しよう!
ここではとりあえず3つのフィールドを設定しているけど、
実際のCSVファイルにはもっとたくさんのフィールドが必要だと思うからよしなにやってね!
そのあとは「CSVテーブルの作成」アクションを設定しよう!
パラメータのFromには直前の配列変数をセットするよ!
これで取得したアイテムの全フィールドの中から、配列に設定したフィールドだけがCSVテーブルに格納されるんだ!
お次はCSVテーブルに追加した内容をファイル作成で出力するよ!
「ファイルの作成」アクションを次のように設定しよう!
ファイル名はここでは「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の最後で配列変数を初期化すればいいんだ!
ここで注意なのは、「変数の初期化」アクションではなくて、
「変数の設定」アクションを使う事!
Valueに[]をセットする事で変数の中身が初期化されるんだ!
配列変数って難しいけど、理解できるととっても便利だよね!
それじゃまた次回!