Power Automate で Onedrive 又は SharePoint の共有リンクから Excel ファイルを読み取る方法
はじめに
ユーザーが入力ダイアログで指定した Onedrive 又は SharePoint にある Excel ファイルについて、Power Automate で読み取る方法を調査したので記録します。
この方法は、不特定多数の者に配布するフローなど、前もってコネクタでファイルの保存場所を指定できない場面での利用を想定しています。
フローの作成方針
このフローでは、OneDrive と SharePoint の共有リンクを使用します。
![]() |
---|
ファイルパスではなく、共有リンクを使用するのは、URLの構造が一定で使いやすいためです。
このフローでは、以下のリファレンスで説明されている「短い共有リンク」を使用します。
Microsoft Graph API によって、共有リンクを使って、共有アイテムにアクセスできます。
SharePointコネクタのアクション「SharePoint に HTTP 要求を送信します」から、SharePoint REST API v2.0 によって、Microsoft Graph API を実行します。
フローの作成手順
手順 | 内容 |
---|---|
1 | 入力ダイアログで共有リンクを取得 |
2 | 共有リンクからサイトURLを作成 |
3 | 共有リンクをエンコード |
4 | HTTP要求でGraph APIを実行 |
5 | 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を作成します
![]() |
---|
concat('https://',outputs('作成:共有リンク分解')[0],'/personal/',outputs('作成:共有リンク分解')[sub(length(outputs('作成:共有リンク分解')),2)])
ユーザーの OneDrive の URL は通常、次の形式になります: https://<tenant name>-my.sharepoint.com/personal/<user principal name>。
(5)条件が偽の場合:SharePoint のサイトURLを作成します
![]() |
---|
concat('https://',outputs('作成:共有リンク分解')[0],'/sites/',outputs('作成:共有リンク分解')[sub(length(outputs('作成:共有リンク分解')),2)])
3. 共有リンクをエンコード
HTTP要求を作成するため、ユーザーが入力した共有リンクをエンコードします。
エンコードの方法は、以下のリファレンスのとおりです。
共有 URL をエンコードするには、次のロジックを使用します。
まず、base64 を使用して URL をエンコードします。
base64 でエンコードされた結果を unpadded base64url 形式に変換します (値の末尾から = 文字を削除し、/ を _、+ を - に置き換える)。
文字列の先頭に u! を追加します。
「変数を初期化する」アクションにより、エンコードした値を変数に設定します。
![]() |
---|
concat('u!',replace(replace(replace(base64(triggerBody()?['text']),'/','_'),'+','-'),'=',''))
4. HTTP要求でGraph APIを実行
SharePointコネクタのアクション「SharePoint に HTTP 要求を送信します」を使います。
SharePoint REST API v2.0 によって、共有リンク先のファイルの情報を取得します。
![]() |
---|
項目 | 内容 |
---|---|
サイトのアドレス | @{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/*
driveItem リレーションシップを要求することで、共有されている DriveItem が返されます。
GET /shares/{shareIdOrUrl}/driveItem
ヘッダーについては、SharePoint REST API v1.0 のリファレンスを参考にしました。
Acceptについては、「application/json;odata=verbose」と例示されているところ、これではエラーになったため、「application/json」としています。
5. Excelテーブルを読み取る
Excel Online (Business) コネクタの「表内に存在する行を一覧表示」を使用して、テーブルを読み取ります。パラメーターには、HTTP 要求で取得した各種IDを使用します。
![]() |
---|
項目 | 内容 |
---|---|
場所 | @body('SharePoint_に_HTTP_要求を送信します:ファイル情報取得')?['parentReference']?['siteId'] |
ドキュメントライブラリ | @body('SharePoint_に_HTTP_要求を送信します:ファイル情報取得')?['parentReference']?['driveId'] |
ファイル | @body('SharePoint_に_HTTP_要求を送信します:ファイル情報取得')?['id'] |
テーブル名 | 任意のテーブル名 |
以上でフローの作成は完了です。
Discussion