Power AutomateでExcelの特定の行に対していろいろやる

Power AutomateはVBAを地上から一掃するために投入されたMicrosoftの新兵器です(誤)。

Excelで特定の行の特定の列の値を書き換えたいというシチュエーションは、ままあるでしょう。「VBAをぶっ壊す」を標榜(非公式:オレ脳内)するPower Automateでは、もちろんそんなの余裕です。

準備

前回やったメール受信をトリガーにしたフローをベースに、OneDrive上のExcelファイルの特定行の値だけを書き換えるフローを作成します。

OneDriveのルート直下に vote フォルダを作成し、その中にExcelファイルを作成しました。ファイル名は saitama_old_city.xlsx です。

ここまでで、だいたい何をしようとしているか察していただけると思いますが、このファイルを開いて次のようなテーブルを作成しました。テーブル名は vote としました。

ここまできたらもうわかりましたね。そう、さいたま市の旧市人気投票です。

投票者はメールの件名に自分のお気に入りの市名を記載して集計担当のメルアドへ送信します。そこから先はPower Automateが自動処理を行い、該当する市名の票数カウントを増やしていきます。集計担当はお茶でも飲んで待っていればいいわけです。

フロー作成

では、さっそくフローを組んでいきますが、はじめにお断りしておきます。このような処理をPower Automateでやる意義は皆無です。

今回はフローの作成方法を紹介するサンプルとしてピッタリだったので、あえてやっていますがMicrosoft365には投票・集計用途に特化したFormsというアプリがあるので、本気で運用するならそっちを使いましょう。

前回はテンプレートから作成しましたが、今回はまっさらな状態からいきましょう。

Power Automateのサイトへアクセスしたら左ペインのメニューから作成をクリックします。

フローのタイプを選択する画面になります。自動化されたクラウドフローを選択します。

ポップアップしたダイアログでフロー名とトリガーを設定します。

フロー名はvote_saitama_cityにしました。
トリガーは新しいメールが届いたとき Outlook.comにします。

Office365版のOutlookにも同じ名前のトリガーがあるので注意してください。個人アカウントの場合はOutlook.comの方じゃないとダメです。

作成ボタンを押します。

フローの編集画面になります。メールを受信したら処理開始のトリガーはすでに設定された状態です。

新しいステップボタンを押します。アクションの候補がたくさん表示されるので、Excelで検索して絞り込みExcel Online(OneDrive)を選択します。

Excel Online(OneDrive)で実行できる処理が一覧表示されます。行の更新というそれっぽいアクションがあるので、そっちを選んでしまいたいところですが、今回は票数を加算するという処理が必要なので、まず更新対象である行の得票数を取得しなければなりません。そのために1ステップを消費します。

アクション一覧から行の取得を選択します。

パラメーターを設定する画面になります。

ファイル名、テーブルにはOneDriveに保存したExcelファイルのものを指定します。テキストボックスをクリックすると候補が表示されるのでそこから選択します。

キー列旧市名を選択します。これも候補ででるので選びます。

キー値は前のステップ(トリガー)から引き継がれたデータが候補にでます。つまり受信したメールのデータです。件名を選択します。

どういった処理がおこなわれるかというと、指定したファイルのテーブルのキー列からキー値を探し出して一致した行を取得します。

ここまでの設定を終えると次の画像のようになります。

なお、投稿日時点で私の環境では選択肢のフォルダ階層を下りていくときの操作性がもっさりすぎて最悪です。ゆっくり確実にクリックして選択されていることを確認しましょう。

ここまでのステップで メール件名で 旧市名列を検索し 該当する行(以下 対象行) が取得されました。以降の処理では、対象行の中身が選択肢として出てくるようになります。

フローで関数を使う

新しいステップボタンでもう一度Excel Online(OneDrive)を選択して、今度は行の更新を選択します。

行の取得の時と同様にファイル、テーブルの指定と行の選択のパラメーターを指定します。行の取得のときと違い、列名のテキストボックスが出てきます。

この列名テキストボックスはこの列名に何を入れますか?という意味です。今回は投票数を1増やして入れますのでひと工夫します。

票数のテキストボックスの入力候補から式タブを選択します。

式の候補から int(value) を選択します。Excelでいうところのワークシート関数です。前ステップで票数が文字列として取得されているので、計算用に数値として評価するためintで変換します。

fxへ int() が入力されます。

その状態で動的なコンテンツタブへ切り替えます。
行の取得から引き継がれたデータが表示されているので、票数を選択します。

int( ) の中に何やら怪しい文字列が入ります。

これはPower Automateが内部で使用している生のパラメーターみたいです。間違って消したり書き換えたりしないように注意しましょう。

続いて、加算のための関数を追加します。

もう一度、式タブに切り替えてadd(summand_1, summand_2)を選択します。

fxにadd()が入力されます。このaddの第一引数にすでに入っているint(outputs略)を設定します。第二引数加算する数値を指定します。

よってfxのテキストボックスを若干書き換えて、最終的に次の文字列にします。

add(int(outputs(‘行の取得’)?[‘body/票数’]),1)

これで対象行の票数を1足して書き換えるという処理が完成です。

OKボタンで確定して候補を閉じます。

すべての設定が終わると次の画像のようになります。

同じ処理を2回設定しなければならず、少し冗長に感じますが、現状これ以外の方法はなさそうです。そのうちアップデートで取得更新アクションができるかもしれませんね。

保存ボタンで保存します。

フローを実行する

それでは実際にちゃんとうごいているのかやってみましょう。保存した瞬間からフローはトリガーイベントを待ち構えています。

次のようなメールを送ります。

Excelファイルを開いてみると

ばっちり加算されていますね。もし同じ処理をVBAでゴリゴリ書いていくとしたら気が滅入りますよね。

最初にも言いましたが、たとえば複数人が同時に同じ市名に投票したらどうなっちゃうの?といった問題があるので、本気でこういうことをやるならFormsを使いましょう。

フローがうまくいったのか、コケたのかは概要画面の下の方にある実行履歴で確認できます。

失敗している場合、履歴をクリックするとどのステップでコケて、そのときにどのようなパラメーターをわたして、どう出力されたかまで確認できます。エラー解析に関してもVBEよりはるかに優秀ですね。

VBA駆逐まで待ったなし!

つづく。

つづきができました。