1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

Power AutomateなしでExcelPower Appsで操りたい

Office Scriptsやら何やらExcel操作自動化の手段は複数あります。
しかしPower Apps単体でとなると・・・。

そう思いながらGraph Explorerをポチポチしていると、下記のようなGraph APIがあるではありませんか👀

image.png

コネクタを経由したHTTP要求を実行すれば案外Excel操作自動化もできるのでは!ということでチャレンジしてみました。

Office 365 Usersコネクタ

今回使用するのはOffice 365 Usersコネクタです。
Power Apps

  1. [データ]から[データの追加]
  2. [Office 365 ユーザー]を検索しクリック

image.png

上記の設定をすると、Office 365 Usersコネクタのメソッドを使うことができます。

HTTP要求もその対象です。

Office365ユーザー.HttpRequest
Office365ユーザー.HttpRequest(
    "{Uri}",
    "{Method}",
    "{file - bodyの要素}"
    // その他のプロパティ
)

上記のような式で、HTTP要求が実行できます。

まずはExcelを一覧化する

今回は下記のエンドポイントを使用して、まずExcelファイルを取得します。

URI - OneDriveのxlsxファイルを取得する
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。

Office 365 Users - HTTP要求

/meセグメントから、サインインしているユーザーのOneDriveの情報を取得します。
.xlsxのファイルを対象にして

  • name
  • id
  • webUrl

上記のプロパティが返されます。

Graph Explorerで試すことができるので気になる方は検証してみてください!

こちらをもとにSet 関数を使ってグローバル変数HTTP要求の結果を取得してみます。

OnSelect
Set(
    GraphXlsxFiles,
    Office365ユーザー.HttpRequest(
        "https://graph.microsoft.com/v1.0/me/drive/root/search(q='.xlsx')?select=name,id,webUrl",
        "GET",
        ""
    )
)

こちらを実行すると、GraphXlsxFilesUntypedObject 型とチョットよくわからない単語で表示されます。

image.png

ビュー 変数で見てみると、値は取得できているには取得できていそうです。

image.png

型指定されていないオブジェクトは、直接使用することはできないため、明示的に型を変換する必要があります。

例えばテーブル コントロールItemsに設定する場合は、
戻り値.valueが配列なので、コチラをForAll 関数で明示的に型を指定します。

Items
ForAll(
    GraphXlsxFiles.value,
    {
        id: Text(ThisRecord.id),
        name: Text(ThisRecord.name),
        webUrl: Text(ThisRecord.webUrl)
    }
)

image.png

これにより、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

下記のサンプルを使ってみます。

image.png

ID01FGLN35TPWLZOHFXXOBB3KTBB73KAARUYです。こちらがdrive-item-idに該当します。

OnSelect
Set(
    GraphResponse,
    Office365ユーザー.HttpRequest(
        "https://graph.microsoft.com/v1.0/me/drive/items/01FGLN35TPWLZOHFXXOBB3KTBB73KAARUY/workbook/worksheets",
        "GET",
        ""
    )
)

下記が返ってきました。

image.png

valueを分解すると下記が取得できます。

キー データ型 内容
name 文字列 シート名
position 整数 ブック内のシート番号
visibility 文字列 可視性

上記が取得できました。

ワークシートの使用範囲を取得する

上記と同様にワークシートの使用範囲も取得できます。
非常に雑なダミーデータですが、シート名を引数に、値を取得することができます。

Items
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が二次元配列のため値の取得が手間ですね💦

image.png

特にテーブルにしていなくてもデータ参照ができるので、ちょっと利用できるシーンはあるかな🧐

image.png

グラフ チャートを取得する

比較的目玉になる機能はグラフ チャートだと思います。

Graph Explorerに下記のエンドポイントが紹介されていますが、こちらで取得できるのは、グラフの高さや幅、名前などです。

本命はグラフ チャートを取得することな気もするので、下記のエンドポイントを使って、グラフの画像を取得してみます。
シート名chartのグラフmyChartsの画像を取得してみます。

OnSelect
Set(
    GraphCharts,
    Office365ユーザー.HttpRequest(
        "https://graph.microsoft.com/v1.0/me/drive/items/01FGLN35TPWLZOHFXXOBB3KTBB73KAARUY/workbook/worksheets('chart')/charts/myCharts/image",
        "GET",
        ""
    )
)

実行するとbase64文字列で値が返って来ます。
画像コントロールのImageプロパティに、データ型の指定も含めて

Image
$"data:image/png;base64,{Text(GraphCharts.value)}"

と指定するとグラフが表示されました📊

image.png

値のコントロールは!?

さて、ここまで実行してきたことは、ほとんどGETです。
値の更新やワークシートの追加は

  • POST
  • PATCH

上記の領域になります。
こちらの手間なところは引数がfile型なのです・・・。

ファイルコントロールにjsonをアップしたりなど、Power Apps単体でやることが無駄では🧐と思い割愛しました。

やってみようと思ったらもう既にやられているのですよね。さすがです。

1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?