🐨

Power Automateを使ってShare Pointにあるドキュメントを取得してAzure Blobにアップロードする方法

に公開

社内のドキュメントをナレッジデータとして生成AIに活用しようと思ってます。
そのためにSharePointにあるドキュメントをAzure環境にアップしたいです。
どうやったら連携できるのか調べてみました。

方法一覧

1. Microsoft Graph APIを使う

M365のアプリ一覧の情報にアクセスすることができるAPIで、Microsoftが公式にサポートしています。
今回やりたいSharePointのファイル操作以外にも、Teamsにメッセージ投稿やOutlookメール送信などOfficeアプリの操作をコードベースで行うことができます。

https://learn.microsoft.com/ja-jp/graph/use-the-api

2. SharePoint REST APIを使う

こちらは2023年7月から非推奨になっていて、代わりにGraph APIを使うことを勧められてるようです。

3. Office365-REST-Python-Client(OSS)を使う

こちらは一般の方がオープンソースで公開しているライブラリで、SharePointやOnedriveの情報を取得することができます。
Graph APIに比べて、認証が厳しくないので手をつけやすいですが、その分できることも限られています。

https://github.com/vgrem/Office365-REST-Python-Client

4. Power Automateを使う

「SharePointのファイルコンテンツを取得する」というアクションがあります。
他にもファイルのメタデータやフォルダ内のファイル一覧取得など、SharePoint周りの操作は一通りできます。
また、ノーコードで仕組みを作ることができるため、今回はPower Automateを使って実装します。

5. 手作業で頑張る

Blobにアップさえ出来ればいいんで、正直手作業もありかと思います。
ただドキュメントが多かったり頻繁に更新が必要な場合は現実的ではありません..

Power Automateを使った方法

Power Automateにアクセスして、新しいフローを作成
https://make.powerautomate.com/


今回はユーザーにフォルダ名を指定してもらって、そのフォルダ内のすべてのファイルをBlob Storageの所定のコンテナにアップロードするようにします。
そのためフォルダ名は仮で変数定義しておきます。

1. フォルダ内のファイル一覧を取得

アクションから「フォルダーの一覧」を選択


サイトのアドレスは自分が所属するSharePointのチーム一覧が表示されるので、対象のアドレスを選択。
参照するフォルダ名は変数を使うので、以下のように定義します。

uriComponent(concat('/Shared Documents/<your folder name>/', variables('フォルダ名')))


あらかじめ所定のフォルダにしかアクセスしない場合は右にあるフォルダアイコンからGUIで選択もできる。

2. フォルダ内にあるファイルの情報を取得

ファイル一覧を取得するので、配列が返ってきます。
ですのでループ処理を使います。
アクションから「それぞれに適用する」を選択


ループ内で、アクションの「ファイル コンテンツの取得」を選択。
ファイルの中身をencode形式で取得することができます。


サイトのアドレスはフォルダ一覧を取得した時と同様のものを選択。
ファイル拡張子は変数で以下のように設定

uriComponent(items('それぞれに適用する')?['Path'])


次にアクションの「ファイル メタデータの取得」を選択。
ファイル名やファイル作成者などの情報を取得することができます。


こちらもファイルコンテンツと同様に同じアドレスとファイル拡張子を選択

3. Blobにアップロード

アクションから「Blobを作成する(V2)」を選択。


認証の設定をします。
Azure PortalでBlob Storageにアクセスして、ストレージアカウント名アクセスキーをコピーします。

接続名は適当に入力。
認証の種類は「Access Key」を選択。
Azure Storage アカウント名または BLOB エンドポイントは先ほどコピーした「ストレージアカウント名」。
Azure Storage アカウントのアクセス キーにコピーした「アクセスキー」を入力。


フォルダーのパスは以下のように設定

concat('/docs', variables('フォルダ名'))

Blob名は「ファイル メタデータの取得」で取得できたbody/DisplayNameを選択。

Blobコンテンツは「ファイル コンテンツの取得」で取得できたファイル コンテンツを選択。

検証

上手くできた。
Power AutomateはフローをAPI化することもできる(最近知った)ので、Pythonとかで1からロジック作るより簡単かも。

ヘッドウォータース

Discussion