🧙

Power Automate で Onedrive 又は SharePoint の共有リンクから Excel ファイルを読み取る方法

に公開

はじめに

ユーザーが入力ダイアログで指定した Onedrive 又は SharePoint にある Excel ファイルについて、Power Automate で読み取る方法を調査したので記録します。
この方法は、不特定多数の者に配布するフローなど、前もってコネクタでファイルの保存場所を指定できない場面での利用を想定しています。

フローの作成方針

このフローでは、OneDrive と SharePoint の共有リンクを使用します。

共有リンクの取得画像

ファイルパスではなく、共有リンクを使用するのは、URLの構造が一定で使いやすいためです。
このフローでは、以下のリファレンスで説明されている「短い共有リンク」を使用します。
https://learn.microsoft.com/ja-jp/sharepoint/dev/spfx/shorter-share-link-format

Microsoft Graph API によって、共有リンクを使って、共有アイテムにアクセスできます。
https://learn.microsoft.com/ja-jp/graph/api/shares-get?view=graph-rest-1.0&tabs=http

SharePointコネクタのアクション「SharePoint に HTTP 要求を送信します」から、SharePoint REST API v2.0 によって、Microsoft Graph API を実行します。
https://learn.microsoft.com/ja-jp/sharepoint/dev/apis/sharepoint-rest-graph

フローの作成手順

手順 内容
入力ダイアログで共有リンクを取得
共有リンクからサイトURLを作成
共有リンクをエンコード
HTTP要求でGraph APIを実行
Excelテーブルを読み取る

1. 入力ダイアログで共有リンクを取得

まずは、ユーザーからの入力を受け取ります。
今回は、手動トリガーを使用します。

手動トリガーの画像

2. 共有リンクからサイトURLを作成

入力された共有リンクから、SharePoint(又は OneDrive)のサイトURLを作成します。

(1)変数を初期化します

変数初期化の画像

(2)共有リンクを分解します

共有リンクの分解に関する画像
split(replace(triggerBody()?['text'],'https://',''),'/') 

(3)OneDrive と SharePoint で条件分岐します

条件分岐の画像
#左辺
contains(outputs('作成:共有リンク分解')[0],'my.sharepoint.com')

(4)条件が真の場合:OneDrive のサイトURLを作成します

OneDriveの場合の画像
concat('https://',outputs('作成:共有リンク分解')[0],'/personal/',outputs('作成:共有リンク分解')[sub(length(outputs('作成:共有リンク分解')),2)])

ユーザーの OneDrive の URL は通常、次の形式になります: https://<tenant name>-my.sharepoint.com/personal/<user principal name>。

https://learn.microsoft.com/ja-jp/sharepoint/list-onedrive-urls#about-onedrive-urls

(5)条件が偽の場合:SharePoint のサイトURLを作成します

SharePointの場合の画像
concat('https://',outputs('作成:共有リンク分解')[0],'/sites/',outputs('作成:共有リンク分解')[sub(length(outputs('作成:共有リンク分解')),2)])

3. 共有リンクをエンコード

HTTP要求を作成するため、ユーザーが入力した共有リンクをエンコードします。
エンコードの方法は、以下のリファレンスのとおりです。

共有 URL をエンコードするには、次のロジックを使用します。
まず、base64 を使用して URL をエンコードします。
base64 でエンコードされた結果を unpadded base64url 形式に変換します (値の末尾から = 文字を削除し、/ を _、+ を - に置き換える)。
文字列の先頭に u! を追加します。

https://learn.microsoft.com/ja-jp/graph/api/shares-get?view=graph-rest-1.0&tabs=http#encoding-sharing-urls

「変数を初期化する」アクションにより、エンコードした値を変数に設定します。

エンコードに関する画像
concat('u!',replace(replace(replace(base64(triggerBody()?['text']),'/','_'),'+','-'),'=',''))

4. HTTP要求でGraph APIを実行

SharePointコネクタのアクション「SharePoint に HTTP 要求を送信します」を使います。
SharePoint REST API v2.0 によって、共有リンク先のファイルの情報を取得します。

HTTP 要求の画像
項目 内容
サイトのアドレス @{variables('サイトURL')}
方法 GET
URI _api/v2.0/shares/@{variables('エンコード共有リンク')}/driveitem
ヘッダー "Accept": "application/json"

URIについては、以下の2つのリファレンスに基づいて、これを組み合わせて作成します。

SharePoint URL:https://{tenant-name}.sharepoint.com/_api/v2.0/*

https://learn.microsoft.com/ja-jp/sharepoint/dev/apis/sharepoint-rest-graph

driveItem リレーションシップを要求することで、共有されている DriveItem が返されます。
GET /shares/{shareIdOrUrl}/driveItem

https://learn.microsoft.com/ja-jp/graph/api/shares-get?view=graph-rest-1.0&tabs=http#example-single-file

ヘッダーについては、SharePoint REST API v1.0 のリファレンスを参考にしました。
Acceptについては、「application/json;odata=verbose」と例示されているところ、これではエラーになったため、「application/json」としています。

https://learn.microsoft.com/ja-jp/sharepoint/dev/sp-add-ins/complete-basic-operations-using-sharepoint-rest-endpoints

5. Excelテーブルを読み取る

Excel Online (Business) コネクタの「表内に存在する行を一覧表示」を使用して、テーブルを読み取ります。パラメーターには、HTTP 要求で取得した各種IDを使用します。

Excelのアクションの画像
項目 内容
場所 @body('SharePoint_に_HTTP_要求を送信します:ファイル情報取得')?['parentReference']?['siteId']
ドキュメントライブラリ @body('SharePoint_に_HTTP_要求を送信します:ファイル情報取得')?['parentReference']?['driveId']
ファイル @body('SharePoint_に_HTTP_要求を送信します:ファイル情報取得')?['id']
テーブル名 任意のテーブル名

https://learn.microsoft.com/ja-jp/connectors/excelonlinebusiness/#テーブル内に存在する行を一覧表示する

以上でフローの作成は完了です。

Discussion