Power AutomateなしでExcelをPower Appsで操りたい
Office Scriptsやら何やらExcel操作自動化の手段は複数あります。
しかしPower Apps単体でとなると・・・。
そう思いながらGraph Explorerをポチポチしていると、下記のようなGraph API
があるではありませんか👀
コネクタを経由したHTTP要求
を実行すれば案外Excel操作自動化もできるのでは!ということでチャレンジしてみました。
Office 365 Usersコネクタ
今回使用するのはOffice 365 Usersコネクタです。
Power Appsで
- [データ]から[データの追加]
- [Office 365 ユーザー]を検索しクリック
上記の設定をすると、Office 365 Usersコネクタのメソッドを使うことができます。
HTTP要求もその対象です。
Office365ユーザー.HttpRequest(
"{Uri}",
"{Method}",
"{file - bodyの要素}"
// その他のプロパティ
)
上記のような式で、HTTP要求が実行できます。
まずはExcelを一覧化する
今回は下記のエンドポイントを使用して、まずExcelファイルを取得します。
https://graph.microsoft.com/v1.0/me/drive/root/search(q='.xlsx')?select=name,id,webUrl
Microsoft Graph REST API リクエストを作成し呼び出します。 次のセグメントがサポートされています: 第 1 セグメント: /me、/users/ 第 2 セグメント: messages、mailFolders、events、calendar、calendars、outlook、inferenceClassification。
/me
セグメントから、サインインしているユーザーのOneDrive
の情報を取得します。
.xlsx
のファイルを対象にして
- name
- id
- webUrl
上記のプロパティが返されます。
Graph Explorerで試すことができるので気になる方は検証してみてください!
こちらをもとにSet 関数
を使ってグローバル変数
にHTTP要求
の結果を取得してみます。
Set(
GraphXlsxFiles,
Office365ユーザー.HttpRequest(
"https://graph.microsoft.com/v1.0/me/drive/root/search(q='.xlsx')?select=name,id,webUrl",
"GET",
""
)
)
こちらを実行すると、GraphXlsxFiles
はUntypedObject 型とチョットよくわからない単語で表示されます。
ビュー 変数
で見てみると、値は取得できているには取得できていそうです。
型指定されていないオブジェクトは、直接使用することはできないため、明示的に型を変換する必要があります。
例えばテーブル コントロール
のItems
に設定する場合は、
戻り値.value
が配列なので、コチラをForAll 関数で明示的に型を指定します。
ForAll(
GraphXlsxFiles.value,
{
id: Text(ThisRecord.id),
name: Text(ThisRecord.name),
webUrl: Text(ThisRecord.webUrl)
}
)
これにより、Excelファイルの一覧を取得すること
ができました。
ブック内のワークシートを取得する
Graph Explorerに沿って、今度はExcelブックのワークシート
の取得を試してみます。
https://graph.microsoft.com/v1.0/me/drive/root/search(q='.xlsx')?select=name,id,webUrl
で取得したdrive-item-id
を使用すると、ブック内のワークシートを取得できるようです。
https://graph.microsoft.com/v1.0/me/drive/items/{drive-item-id}/workbook/worksheets
下記のサンプルを使ってみます。
ID
は01FGLN35TPWLZOHFXXOBB3KTBB73KAARUY
です。こちらがdrive-item-id
に該当します。
Set(
GraphResponse,
Office365ユーザー.HttpRequest(
"https://graph.microsoft.com/v1.0/me/drive/items/01FGLN35TPWLZOHFXXOBB3KTBB73KAARUY/workbook/worksheets",
"GET",
""
)
)
下記が返ってきました。
value
を分解すると下記が取得できます。
キー | データ型 | 内容 |
---|---|---|
name | 文字列 | シート名 |
position | 整数 | ブック内のシート番号 |
visibility | 文字列 | 可視性 |
上記が取得できました。
ワークシートの使用範囲を取得する
上記と同様にワークシートの使用範囲も取得できます。
非常に雑なダミーデータですが、シート名
を引数に、値を取得することができます。
ForAll(
GraphRange.text,
{
employeeId: Text(First(ThisRecord)),
name: Text(
Last(
FirstN(
ThisRecord,
2
)
)
),
department: Text(
Last(
FirstN(
ThisRecord,
3
)
)
),
position: Text(
Last(
FirstN(
ThisRecord,
4
)
)
),
hireDate: Text(
Last(
FirstN(
ThisRecord,
5
)
)
),
salary: Text(
Last(
FirstN(
ThisRecord,
6
)
)
),
email: Text(
Last(
FirstN(
ThisRecord,
7
)
)
),
phone: Text(
Last(
FirstN(
ThisRecord,
8
)
)
)
}
)
GraphRange.text
が二次元配列のため値の取得が手間ですね💦
特にテーブル
にしていなくてもデータ参照ができるので、ちょっと利用できるシーンはあるかな🧐
グラフ チャートを取得する
比較的目玉になる機能はグラフ チャート
だと思います。
Graph Explorerに下記のエンドポイントが紹介されていますが、こちらで取得できるのは、グラフの高さや幅、名前などです。
本命はグラフ チャートを取得することな気もするので、下記のエンドポイントを使って、グラフの画像を取得してみます。
シート名chart
のグラフmyCharts
の画像を取得してみます。
Set(
GraphCharts,
Office365ユーザー.HttpRequest(
"https://graph.microsoft.com/v1.0/me/drive/items/01FGLN35TPWLZOHFXXOBB3KTBB73KAARUY/workbook/worksheets('chart')/charts/myCharts/image",
"GET",
""
)
)
実行するとbase64文字列
で値が返って来ます。
画像コントロールのImage
プロパティに、データ型の指定も含めて
$"data:image/png;base64,{Text(GraphCharts.value)}"
と指定するとグラフが表示されました📊
値のコントロールは!?
さて、ここまで実行してきたことは、ほとんどGET
です。
値の更新やワークシートの追加は
- POST
- PATCH
上記の領域になります。
こちらの手間なところは引数がfile
型なのです・・・。
ファイルコントロールにjson
をアップしたりなど、Power Apps単体でやることが無駄では🧐と思い割愛しました。
やってみようと思ったらもう既にやられているのですよね。さすがです。