AppSheetとPower Automate Premiumを組み合わせる

Microsoft365にはPower AutomateやPower Automate for Desktopの使用ライセンスがあると言えど、プランによってはPremiumコネクタが使えないであったり、Power Automate側からPower Automate for Desktopを呼び出し動かすといった高度な自動化は使えません(E3などの大企業向けはPremiumライセンスがついています)。

そこで、今回Power Automate Premiumの体験版ライセンスを使ってこれらの機能を試してみようと思います。

今回利用するツール等

今回これを試そうと思った理由は、AppSheetでOneDrive上のExcelを読み書きし、その後の処理をPower Automateで自動化したかったためです。しかし、これを行うにはプレミアムコネクタを利用する必要があった為。これが無いとAppSheet側からWebhookでPower Automateを発火させることが出来ません。

尚、Power Automate Premiumは1ユーザあたり月額2,248円となります。体験版は30日間使用でき、1回だけ延長が可能です。

ExcelをデータソースにAppSheetでアプリを作成する

体験版を入手する手順

ライセンスを購入する

ライセンスを購入するにはMicrosoft365のテナントの管理者である必要があります。以下の手順でMicrosoft365管理センターから購入することが可能です。

  1. Microsoft365管理センターを開く
  2. 左サイドバーより、課金情報→サービスを購入するをクリックする
  3. 右パネルのフィルターにてPower Automateを検索する
  4. Power Automate Premiumがいるので、詳細をクリックする
  5. プランを選択ではPower Automate Premium(体験版)を選択する
  6. 右サイドパネルが開かれるので、登録カードを選択し、数量を入れ、0円請求であることを確認して注文をクリックします
  7. 完了したらライセンス割当に移ります

これで体験版を手に入れることが出来ました。30日を経過すると自動的に課金が始まってしまいますので、期限前にお使いの製品ページからPower Automate Premiumに入り、サブスクリプションのキャンセルを実行する必要があります。

図:管理センターから購入が必要です

図:注文をして手に入れます

ユーザに割り当てる

購入してもユーザに割り当てなければ利用できません。以下の手順でこのライセンスをユーザに割り当てましょう。体験版は25ライセンスついてくるので、短い期間ですが検証用には十分使えるハズです。

  1. Microsoft365管理センターのページを開く
  2. 左サイドバーから課金情報→ライセンスをクリックする
  3. Power Automate Premiumをクリックする
  4. ライセンスの割当をクリックする
  5. 右サイドバーが出てくるので、対象者のテナント内のメアドを入れて選択する
  6. 割り当てをクリックする

これで対象者はPower Automateのプレミアムコネクタが利用可能になり、またPower Automate for DesktopをPower Automate for Desktopから呼び出すトリガー機能が利用可能になります。

図:ライセンス割り当て画面

Power Automateで使ってみる

今回はAppSheet側からのリクエストをPower Automate側で受け取って、Teamsの特定チャンネルに完了通知のメッセージでも送ってみようかと思います。

過去に同様の処理を以下のエントリーで作成しています。

図:フローの全体図

Power AutomateのTeams投稿でAdaptive Cardを使ってみた

Boxファイル監視をPower AutomateでExcelに書込み - Webhook v2編

Power Automate側

まずはPower Automate側にAppSheetからの受け口を作っておきます。2023年に新UIに切り替わってるので新UIで説明をいたします。

  1. Power Automateにログインする
  2. 左サイドバーより作成をクリックして、インスタントクラウドフローをクリックする
  3. フロー名は適当にAppSheet受信とでもいれる
  4. 下のトリガーする方法は、HTTP要求の受信時を選択し、作成をクリックします。
  5. フローをトリガーできるユーザーはとりあえず認証無しで実行できる「誰でも」を選択しておきます。
  6. manualというフローのみが表示されてるのでクリックして要求本文の JSON スキーマに以下の内容を記述します。
  7. 下部にある詳細パラメータをクリックし、メソッドをクリックする
  8. 次の行にメソッドが出てくるので「POST」を選択します。
  9. まだ受信用URLは出ないので、manualのコネクタ下の+をクリックします。
  10. 検索まどで「変数」を検索し、「変数を初期化する」を追加する
  11. Nameは適当、TypeはString、Valueをクリックして⚡️アイコンをクリックしmanualのmessageを選択する
  12. 画面右上の保存ボタンをクリックする
  13. 再度、manualのコネクタをクリックすると受信用のURLが出てるのでこれを控えておく
  14. 変数を初期化の下の+ボタンをクリックしてアクションを追加します。
  15. 検索ワードとして「Teams」と入れてコネクタごとにグループ化するのチェックを外し、「チャットまたはチャンネルでメッセージを投稿する」をクリックします。
  16. 投稿者はフローボットのままで良いです。投稿先をクリックしてチャネルをクリックします
  17. チームでは既存のチームを選び、チャネルでも同様に既存のチャネルを選びます
  18. message項目をそのまま投稿しようと思うので、メッセージにカーソルを合わせて⚡️のアイコンをクリック
  19. 10.で取得しておいた変数の値を格納という項目をメッセージ欄に入力する
  20. 右上の保存ボタンをクリックする

これでPower Automate側のフローは構築完了しました。14.のURLを元に今度はAppSheet側でWebhookリクエストを構築します。

図:HTTP要求の受信時を利用します

図:受信用のURLをコピーする

図:チャット投稿アクション

AppSheet側

AppSheet側でAutomationを作成します。今回は請求というテーブルに対してのアクションを作ります

  1. 適当なテーブルに対してのAutomationを適当に作る
  2. プロセスのステップを追加し、Call a webhookを選択する(PAリクエストという名前にしました)
  3. URLに前述の14.で取得したPower Automate側のURLを入力する
  4. HTTP Verbは「POST」を選択する
  5. Bodyには以下のようなJSONを入力します。AppSheetの列の値を入れたい場合は、"<<[field_name]>>"といった値をJSONの値としてセットします

    IDだけはAppSheet側のID列の値を入れて、メッセージは適当に入力しておきます。
  6. 右上のSAVEボタンをクリックして保存する

図:Automationを作成する

実行してみる

この状態でAppSheet側でレコードの追加や更新を行うとAutomationが作動し、Power AutomateのPOSTのURLが叩かれます。するとPower Automate側でメッセージを受け取ってTeamsに投稿してくれます。

但し現在は誰でもPower AutomateのURLを叩ける状態であるため、実際の業務で使用する場合は特定のユーザのみが叩けるようにするべきでしょう。その場合、OAuth2.0認証をAzure Portalで用意しておいてAccess Tokenを利用して叩く必要があります。もし、トリガーできるユーザを「テナントのすべてのユーザ」とした状態で何もせずAppSheetで叩くとPOSTリクエストが届きません(AppSheet側では成功と出ますが、実際は401エラーで以下のようなエラーが出ています。

図:無事にTeams側に投稿することが出来ました

OAuth認証をして実行させる

先にGAS側から構築してコールバックURLを取得。これをPA側で使います。その後全部整備できたら、GAS側で初回認証を実行します。ドライブにスタンドアローンスクリプトを作成し作業を開始します。

今回説明の為に便宜的にGoogleのGASを使っていますが、Azure側でOAuth2.0認証する手段が別に用意しHTTPリクエストでAppSheetで取得できるのであれば、Google Drive等利用せずにAzure側で完結できますのでAccess TokenをAppSheet側へ渡せればGoogleレスで運用が可能です。

GAS側の実装

次にGAS側で前述の値を元にOAuth2.0認証を行わせてAccess Tokenを取得する仕組みを装備し、認証を実行します。AppSheet側からはAccess Tokenのリクエストに対する返却する関数のみを実行する形にしておく。

ライブラリの追加

以下の手順でOAuth2 for Apps Scriptライブラリを追加しましょう。

  1. スクリプトエディタを開きます。
  2. メニューより「リソース」⇒「ライブラリ」を開きます。
  3. ライブラリを追加欄に「1B7FSrk5Zi6L1rSxxTDgDEUsPzlukDsi4KGuTMorsTQHhGBzBkMun4iDF」を追加します。
  4. 今回はバージョンは43を選択してみます。
  5. 保存ボタンを押して完了

これで、OAuth2.0認証にまつわる様々な関数を手軽に利用できるようになります。

図:ライブラリを追加した様子

コールバックURLを取得する

コールバックURLとは、認証を完了しAccess Tokenを取得したら戻るべきURLを指定するものです。これは、スクリプトIDをもとに作られているので、スクリプトIDを取得して組み立てます。

  1. スクリプトエディタのメニューより「ファイル」⇒「プロジェクトのプロパティ」を開く
  2. 情報の中にある「スクリプトID」を控えておく。
  3. https://script.google.com/macros/d/スクリプトID/usercallback として組み立てる。これがコールバックURLとなる。
  4. この値をAzure PortalのアプリのリダイレクトURLとして指定する

図:スクリプトIDはファイル毎に異なるのです。

スクリプトプロパティに値を格納

ここで一旦次項のAzure側の作業を行っておきます。全て完了したら、この項目に戻ってきてスクリプトプロパティに3つの値を格納しておきます。

  • appid : クライアントIDの値
  • tenant : テナントIDの値
  • secret : クライアントシークレットの値

図:スクリプトプロパティに値を格納する

ソースコード

Power AutomateのOAuth2.0認証を行うための一連のソースコードです。認証後はAppSheet側からgetAccessToken関数を叩いてトークンを返すところが重要なポイントです。

認証用template.html

認証用ページとして表示するためのHTMLファイルです

ウェブアプリケーションとしてデプロイ

次に「ウェブアプリケーションとしてデプロイ」をしなければOAuth認証が出来ません。また、このウェブアプリケーションとしてデプロイはいくつかのハマりポイントがありますので注意が必要です。公開の仕方は以下の手順。

  1. スクリプトエディタを開く
  2. 右上のデプロイをクリック
  3. 新しいデプロイをクリック
  4. 種類の選択ではウェブアプリを選択し、次のユーザとしてアプリケーションを実行で誰の権限で動かすかを指定する。自分か?アクセスしてるユーザの二択。
  5. アプリケーションにアクセスできるユーザを指定する。今回は自分だけ十分ですのでアクセスできるユーザは「自分」である必要性があります。
  6. 最後に導入すると、ウェブアプリケーションのURLが取得できます。このURLでアクセスをします。URLの最後がexecが認証用URLになります。
  7. 次回以降コードを編集して再デプロイ時はデプロイを管理から同じURLにて、新しいバージョンを指定して発行することが出来ます。

図:ウェブアプリとして出力します

初回認証を実行する

GASの認証およびOAuth2.0認証を実行します。

  • 適当な関数をまずスクリプトエディタ上で実行してGASの実行の認証を行います。
  • 次に前述でデプロイしたexecで終わるURLにアクセスし、アクセス承認をクリックします。
  • 認証に成功しました。ページを閉じてください。」と出たらOAuth2.0認証完了ですので、認証用ページはすべて閉じてOK.

これでスクリプトプロパティに、oauth2.Power Automateという名称でトークンやRefresh Tokenが格納されました。

図:初回認証を実行する

図:OAuth認証を実行する

Azure側の作業

前述まででとりあえずAppSheet側からPower Automateを叩けました。しかし誰でも叩ける問題のある状態です。そこで、OAuth2.0認証をしてセキュアに実行する必要があるのですがAppSheetではOAuth2.0認証は出来ません。そこでGAS側で認証をさせて、Access Tokenを受取りこれをもって、リクエストを投げてみたいと思います。

Azure Portalでアプリを作る

以下の手順でPower Automateへアクセスするためのアプリを作成します。この段階でClient IDとTenant IDを取得することが可能です。

  1. Azure Portalを開きアプリの登録をクリックする
  2. 左上の新規登録をクリックする
  3. アプリの名前を適当に入力し、プラットフォームはWebを選択し、リダイレクトURLは前述で取得したコールバックURLを指定します。
  4. 登録をクリックする
  5. 概要画面が出ますが、ここでクライアントIDとテナントIDを取得可能なので控えておく。
  6. 左サイドバーからAPIのアクセス許可をクリックする
  7. Graph APIがすでに1個ありますがこれは削除しておき、アクセス許可の追加をクリックする
  8. Microsoft APIの中に「Power Automate」がいるのでクリックする
  9. 委任されたアクセス許可をクリックし、アクセス許可はUser(Access Microsoft Flow as signed in user)をチェックし、アクセス許可の追加をクリック
  10. xxxxに管理者の同意を与えますをクリックする(管理者権限が必要です)
  11. 左サイドバーの認証をクリックする
  12. 暗黙的な許可およびハイブリッド フローの項目で、「アクセストークン」にチェックを入れて保存をクリックする。

これでアプリの基本部分は用意できましたが、まだ認証に必要な要素が足りないので次の項目を実行します。

図:アプリの登録から始まる

図:クライアントIDとテナントID

図:APIアクセス許可

図:管理者の許可を与える

トークン構成

左サイドバーのトークン構成を開き、オプションの要求の追加を追加する必要性があります。

  1. トークンの種類ではアクセスを選択
  2. 要求は「aud」をチェックする
  3. 追加をクリックする

図:オプション要求を追加する

シークレットの作成

次にClient Secretを作成します。以下の手順でシークレットを作成し値をコピーしておきます。

  1. 左サイドバーの証明書とシークレットをクリックする
  2. 新しいクライアントシークレットをクリックする
  3. 右サイドバーが出てくるので有効期限をセットして追加をクリックする
  4. 値が今回必要なClient Secretなのでコピーする(この時にしか表示されない)

図:シークレットを作成する

Power Automate側の変更

前回の段階で誰でも叩けるタイプのURLとなってしまっています。これを変更するためにPower AutomateのHTTP要求の受信時の内容を変更して、改めてPOST用のURLを取得します。

  1. フローをトリガーできるユーザを「自分のテナントの全てのユーザ」に変更します(特定ユーザでもOK)
  2. 一旦閉じて、右上の保存をクリックする
  3. ページを一旦リロードしましょう。これでHTTP要求受信時のURLが変わります。
  4. 再度、HTTP要求の受信時であるmanualのコネクタを開く
  5. HTTP URLが変わってるのでこのURLをコピーしておく(最期がapi-version=2016-06-01みたいなURLです)

図:新URLを取得しておく

AppSheet側の実装

アクセストークンを取得するプロセス

前述までのAppSheetのAutomationはトリガーとPAリクエストのプロセスのみです。この間にAccess TokenをGAS側から取得するプロセスを一個追加します。

  1. トリガーとPAリクエストの間の+ボタンをクリックしてステップを追加する
  2. 名前はAccessTokenとして、Call a scriptとして指定し、Apps Script Projectにて前述のスタンドアローンスクリプトを指定する
  3. Function Nameは「getAccessToken」を選択する
  4. Return Valueにチェックを入れて、Stringのままでオッケーとする

これでAccessTokenはこのステップで[AccessToken].[Output]とすれば取得ができるので、次のPAリクエストにてAccessTokenを指定してPOSTリクエストをすることが可能です。

リクエストのプロセスの変更

PAリクエスト側は2箇所変更を必要とします。

  1. URLには改めてPower Automate側でHTTP要求の受信時コネクタで取得したURLに置き換える
  2. HTTP HeadersにてAddをクリックし、以下の値を入力する
  3. 右上のSAVEボタンを保存する

これでAppSheetでレコード追加や修正を行うとAccess Tokenを使ってPower Automateにリクエストをし、Teamsにメッセージが無事に投稿されました。

図:URL修正とHeader追加する

デスクトップフローを呼び出す

Power AutomateからローカルPCのPower Automate for Desktopを呼び出してデスクトップフローを実行し、作業をの続きをやらせて戻り値を受け取るといったことが実現可能です。昔はオンプレミスデータゲートウェイというのが必要でしたが、現在その手法は非推奨となっており、より簡単にクラウド側からローカルPC側のPower Automate for Desktopを呼び出せるようになっています。

今回自分はmacOSなのでParallelsのWindows11仮想環境内でPower Automate Desktopを動かしており、Power Automate側からこのVM内にリクエストを送って返り値を返すという仕組みになっています。

事前準備

ローカルPC側の設定

Power Automate側からデスクトップフローを呼び出す場合、有人実行と無人実行の2種類があり、今回は有人実行で構築しますが、無人実行の場合はPCからサインアウト状態でも実行が可能です。この場合、PC側に事前に設定が必要となります。また無人の場合フローの数だけ無人RPAアドオンライセンスが必要とのこと。

  1. 設定アプリを開く
  2. システム→バージョン情報を開く
  3. システムの詳細設定を開く
  4. リモートタブを開く
  5. このコンピューターへのリモート接続を許可する」にチェックを入れる
  6. ネットワークレベル認証でのリモート デスクトップを実行しているコンピューターからのみ接続を許可する」のチェックを外す
  7. 適用をクリックして閉じる

図:システムのプロパティから設定をする

ドメイン\ユーザ名を取得する

Power Automate側で利用するドメイン\ユーザ名の値を取得しておきます。

  1. コマンドプロンプトを開く
  2. whoamiを入力して実行
  3. 出力された値をコピーしておく

PC名\ユーザ名という形で値が出ているハズなのでこれを控えておいてPower Automate側での設定で利用します。

図:whoamiの実行結果

Power Automate for Desktop側

Power Automate for Desktop側(以下PAD)からPower Automateへの接続を確立しておく必要があります(でないと、Power Automate側からリストに出てこない)。以下の手順で設定をしておきましょう。

  1. PADを起動して、右上の設定をクリックする
  2. コンピュータの設定の中にあるコンピュータの設定を開くをクリックする
  3. コンピュータランタイムというウィンドウが出るので、環境のプルダウンで自分のテナントを選択する。指示にしたがってログイン等があればしておく。
  4. 上部に「接続済み」と出ればとりあえず成功です。
  5. 左サイドバーのコンピュータグループをクリックする
  6. 新しいコンピュータグループをクリックする
  7. 適当な名前をつけて作成をクリックする
  8. この時パスワードが出る
  9. コンピュータの追加をクリックする

これで参加したコンピュータグループとパスワードを入手することができました。特にグループパスワードは使わないので、今回はこのままでオッケーです。

図:まずは設定に入る

図:テナントを選択

図:接続成功

Power Automate側

PAD側は設定が完了したので、今度はPower Automate側でローカルに対しての接続を作成します。

  1. Power Automateのトップ画面を開く
  2. 左サイドバーの詳細→接続をクリックする
  3. 新しい接続をクリックする
  4. 接続名は適当に入れておく。
  5. 検索で「デスクトップ」を入力し検索するとプレミアムのデスクトップフローが出てくるのでクリックする
  6. ユーザ名とパスワードで接続する」を選択しておく
  7. コンピュータまたはコンピュータグループをクリックすると前述で作成しておいたコンピュータグループが出てくるので選択する
  8. ドメインとユーザ名は、前述で取得しておいた「ドメイン\ユーザ名」の値を入れておく
  9. パスワードはそのPCのローカルアカウントのログインパスワードを入れる(前述のグループパスワードでは無いので注意)
  10. 作成をクリックする

図:接続を先に作成しておく

呼び出すフローを作成する

ここまでで、ローカルPC上のPADとの接続ができる状態になりました。Power Automateでフローを追加してこの接続を利用して呼び出し、呼び出し結果を返して受け取るというものを作成します。

Power Automate Desktop側

呼び出されるPAD側でのフローは既存のフローの一番最後に、Power Automate側に戻り値を返す仕組みを用意しておく必要があります。そうすることで、Power Automate側で無事に終わって返ってきてることを確認することが可能になります。

  1. 対象のフローを開く
  2. フロー一覧の右サイドパネル上部にある入出力変数に+ボタンがあるのでクリックする
  3. 出力をクリックする
  4. 変数名、データの種類(返り値の型)、外部名(Power Automate側で受け取る際の名前)を入れて保存をクリックする
  5. デスクトップフローの一番下に変数フローを一個追加する
  6. 変数に対して4.で指定した格納先変数名を指定する。
  7. 値は今回はテキスト直ですが、既存のフローの別の変数の値を入れることも可能。
  8. 保存をクリックする
  9. 上部メニューの保存アイコンをクリックしてフローを保存します。(忘れがちなので注意)

これでPAD側から作業が終わったらPower Automate側に結果を返すことが可能になります。

図:入出力変数を用意しておく

図:入出力変数に値を格納する処理

Power Automate側

PAD側は準備がすべて完了したので、次にPower Automate側でいよいよ呼び出すフローを追加します。

  1. 既存のフローを開く
  2. +ボタンをクリックし、左サイドバーから「power automate」と検索して、デスクトップフローをクリックします
  3. 下の方にある接続を変更するをクリックして、あらかじめ作成しておいた接続に変更しておきます。
  4. DesktopフローにはPAD側のフロー一覧が出てくるので前述で設定しておいたフローを選択する
  5. 実行モードは今回はアテンド型を選択します。
  6. 保存をクリックして上部にフローを開始する準備ができましたと出たら成功です。

これで、Power Automate側からPADのフローを呼び出し、返り値を受け取る準備が完了しました。

図:デスクトップフローを追加する

図:フローの設定を構築する

実行結果

テストで実行してみます。PC側はPADが起動してる状態で、Power Automate側もしくはAppSheet側から呼び出しを実行して実際にテストをしてみます。

特にPAD側はなんの動きもしません。バックグラウンドでひっそりと今回は動いています。Power Automate側は実行履歴で実行中となり、これが完了になったら無事に成功です。対象の履歴を開いてみます

  1. 実行履歴を開いてみる
  2. PAD呼び出しフローをクリックする
  3. 左サイドバーのパラメータの中の出力をみてみる
  4. statusCodeが200であれば無事に実行が完了しています。
  5. bodyの中にPAD側の入出力変数の名前と値がきちんと入っていれば無事に実行完了したということがわかります。

図:無事に実行されて返ってきた

関連リンク

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

日本語が含まれない投稿は無視されますのでご注意ください。(スパム対策)