Excelファイルの中身をSharePoint Online にコピーする

# 本日のやりたいこと
Excelファイルに必要事項を記入してもらいます。それを回収して集計したいときなどに利用できると思います。

なお、今回はテーブル化されたExcelシートを各人に配布し、記入してもらったら指定されたSharePointライブラリに放り込んでもらうという運用を想定しています。

こんなファイルをみんなに配って記入してもらう
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2095776/02a88d23-f6f0-6b09-c8eb-62b861333aae.png)

ライブラリ（ファイル置き場）に入れてもらう
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2095776/a2f9149a-f622-f9b7-fa4e-f38878713837.png)

Power Automateワークフローが起動し、SHarePointリストにデータが入る
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2095776/380a2fa7-3d13-1287-c3e0-f4b42bd6372a.png)

# Excel ファイルを作成する

まずは必要な「列」を作成します。この例だと「名前」「住所」「スコア」「評価」ですね。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2095776/1b2da190-2f57-1c2b-0ea9-b2d013ab0f89.png)
範囲指定してから「テーブル」をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2095776/cd43691c-4656-bab1-86bb-0d4a74d38d2b.png)
先頭行は見出しにします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2095776/7faf5645-7761-cbff-f98b-986b61c457e1.png)

このようにテーブル化ができました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2095776/27603816-787e-5291-865a-c641ab864c5c.png)
ちなみに、Power Automate で Excel データを扱う場合、基本的にはテーブル内のデータを操作することになります。 Office Script を利用するとセルの操作が行えます。

出来上がったExcelファイルはSharePointライブラリにアップロードしておきます。

# SPO リストを作る

次に、リストを作成します。SharePointサイトを開き新規→リストを選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2095776/4127ac8c-123e-d0d1-1505-38370717b164.png)

Excelから を選択し、先ほどアップロードしたExcelファイルを選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2095776/fbfe7d22-a8ba-2333-ee46-52a548d92ce5.png)

各列が認識されますので、「型」を正しいものに変更します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2095776/86ea0b22-80aa-f7a5-f5e3-02357169dbdd.png)
名前を付けて作成します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2095776/c10f39e3-3621-b086-ee6f-01e52253a0e1.png)

これでリストは完成です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2095776/40c57879-b1f3-3f9d-b7a8-6db87aa697cb.png)

# SPO ライブラリを作る

次に、ライブラリを作成します。リストと同様にサイトトップから「新規→ドキュメントライブラリ」を選択し、任意の名前を付けます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2095776/2ce56711-64cd-2951-d1e8-8ed433674eb1.png)

これで準備ができました。

# サンプルデータを作っておく

とりあえずテスト用にデータが入っているExcelファイルを作っておきましょう。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2095776/b434b80e-036d-c316-a50d-96fb33169ba2.png)

# Power Auotomate を作る

さて、いよいよAutomateの作成です。ちなみに、あらかじめExcelファイルが指定できるのであれば以下のようにアクションで項目が認識できるのですが、今回はこの方法は使えません。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2095776/a20e9503-38e7-59f6-a2dc-b741dfaf6679.png)

Power Automateホームを開き、「マイフロー」→「新しいフロー」→「自動化されたクラウドフロー」を選択します。
トリガーはSharePointの「フォルダー内にファイルが作成されたとき」です。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2095776/a232c296-2148-6e68-f225-6a4233b5b56e.png)

トリガーの「サイトのアドレス」はライブラリのアドレス、フォルダーIDは上記で作成したライブラリをファイルアイコンから選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2095776/08cd6afe-a6f3-c822-88de-1cfbbceeb21e.png)
※ライブラリ名を半角にした場合はその名前、全角にした場合はDocLib～になります。

次のアクションは Excel Online (Business)の「テーブルの取得」になります。サイト、ドキュメントライブラリを指定します。ファイルには[x-ms-file-name-encoded]を指定します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2095776/7bee0a5b-42a9-2e2b-6c06-cbc7ebdc35f3.png)

つづいて、Excel Online(Business) の「表内に存在する行を一覧表示」を追加します。これで、表（＝テーブル）に存在しているデータを一気に取得します。場所（サイト）とドキュメントライブラリを選択した後、ファイルを選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2095776/4716916d-fad7-b921-b470-3b70ca34b9f2.png)

テーブルは「テーブルの取得」アクションで取得した値を利用しますが、テーブルを選択した後「カスタム値の入力」をクリックし以下のように選択すると…
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2095776/ab270531-6d7f-2d65-7e09-1a77a470bfbc.png)
以下のようにループ(Apply to Each)が追加されます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2095776/44db6496-6406-e4aa-6542-08b7fab6f239.png)
これは、一つのExcelファイルに複数のテーブルがある可能性を考慮してこのようになっています。

# テーブルの中身を取得する

さて、ここまでの動作でテーブルの中身のデータは取得できたのですが、テーブルの構造（どんな列があるのか）はPower Automateとしてはわかっていません。なので、構造を解析する必要があります。試しに、ここで一度テスト実行をしましょう。
右上のテストをクリックし「手動」を選択し「テスト」ボタンをクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2095776/55fa30a1-14fb-9935-cb1c-7e93825f5e4b.png)
この状態で、ライブラリにExcelファイルをコピーします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2095776/e72a26e6-2eca-3e8f-94d2-be4c5a5e0a93.png)
するとフロー（テスト）が正常終了している（はず）です。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2095776/ea85164d-cbcf-ced6-85f3-ef2368afea45.png)

どんなデータが入っているか確認します。Apply to each の中身を開き、「表内に存在する行を一覧表示」を開きます。出力の「未加工出力の表示」をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2095776/55e10595-28bd-b1f0-1589-d81dd8a98de5.png)
右に出力されたデータをメモ帳にコピーしておきます。

さて、続きを作成します。
「編集」をクリックし、Apply to Each内の「アクションの追加」をクリックし、「JSON の解析」を選択します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2095776/4de774e1-ea8f-cd2c-8e7e-9d900acce71c.png)
コンテンツに表内に存在する行を一覧表示の「body」（または本文）を選択し、「サンプルから生成」をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2095776/d390c31d-21ea-eca2-cfc7-e902d1520882.png)
サンプルJSONペイロードの挿入に先ほどメモ帳にコピーしたJSONデータのうち、body 以下を貼り付けます。さらに一番先頭に { を一つ追加します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2095776/b6932b29-2a19-818c-287a-d38c952c0f16.png)

# SPOリストに書き込み

ここまでで、Excelテーブルにあるデータをすべて取得し、解析ができたことになります。あとはSPOリストにデータを追加しましょう。
アクションの追加をクリックし、SharePoint Onlineの「項目の作成」をクリックします。サイトのアドレスとリスト名を選択すると以下のようになります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2095776/e099bf65-f1c7-0da0-0fab-1d44623f3129.png)

各列にJSONに入っている値を入れていきます。まずは名前をクリックしてみましょう。すると、「JSONの解析」から名前を入れることができます。
これを選択すると
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2095776/445d30f8-a0e5-0625-4ee6-cce89562e5fc.png)
以下のようにループが自動作成されます。行が複数あるからですね。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2095776/c94561ca-79cf-e2f8-90d3-b074720098c2.png)
あとは同じように住所、評価等残りの列を設定していきます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2095776/1ddaaa14-36e0-b67d-ccf4-0dca9a2c8094.png)
ただ、スコア（数値）がそのままだと入らないはずです。これは変換が必要になります。

int(items('Apply_to_Each_2')?['スコア'])

のように式を入力しましょう。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2095776/466950fe-68d1-1e4f-15b6-6a18b25293d4.png)

これで完成です。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2095776/a7177911-5c44-49b6-6842-79ac88107473.png)

# 要調整（重要）

では動作確認をします。もう一度手動テストでファイルをアップロードしなおしてもよいですが、先ほどのファイルでテストすることもできます。
右上のテストをクリックし、自動→最近使用したトリガーで→成功　をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2095776/25fe20e6-af05-0b37-6c85-28b09ddb07e0.png)

「保存＆テスト」を実行すると失敗します…。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2095776/e77393b9-5580-473b-7e6f-9c26e5bf9565.png)

見てみると、body('JSON_の解析')?['body]?['value']がNullというエラーです。これはbody('JSON_の解析')?['value']が正しいように思えますので、そのように直してみましょう。
編集でApply to each 2 の「以下の手順から出力を選択」を削除し、「式」で以下を入力します。

body('JSON_の解析')?['value']
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2095776/b6af56ed-4a0c-ae9b-e239-7f2ab2c16f10.png)

保存して再テストします。今度は成功しました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2095776/f0d08ecb-e15e-4b17-3da3-f07b8227e669.png)

SharePointリストを確認すると追加されています。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2095776/f8d1299c-c0a5-c67e-d091-24ac35dfd091.png)


# まとめ

Excel テーブルの読み込みは、ファイルをフローの中で指定していれば、列定義をそのまま読み取ることができます。しかし、今回のように、フローで特定のファイルを指定できない場合は、生データ（？）を読み込みJSON解析をすることで利用することが可能です。

ただ、自動で追加されるループを書き直す必要がある理由は、ちょっと謎でした…考えてみます。