Power Automate で2つの列をキーにして Excel ファイルの行を更新する

この記事の内容

  • Microsoft Forms の回答をトリガーに、Power Automate で Excel の行を更新する方法を紹介します
  • Power Automate の「行の取得」アクションではキー列を1つしか指定できないという制約があります
  • その制約を回避するため、Excel 側に「検索用列」を追加してメールアドレスと日付を結合する方法を解説します
  • Excel の TEXT 関数と Power Automate の formatDateTime 関数を組み合わせて、同じ形式の文字列を生成します
  • 2つの列を実質的に1つのキーとして扱うことで、複合キーによる行の特定を実現します

シナリオの概要

今回対応するシナリオは以下のようなものです。

  • Microsoft Forms でユーザーが回答を送信する
  • そのフォーム回答をトリガーに Power Automate が起動する
  • 回答したユーザーの メールアドレス回答日付 の2つの値をキーにして、Excel の該当行を特定する
  • 該当行の「回答」列に「〇」を記入する

たとえば、日付ごとの出席確認テーブルのように、誰がいつ回答したかを記録したい場合に活用できるシナリオです。


問題:Power Automate は複合キーに対応していない

Power Automate の「行の取得」や「行の更新」などの Excel アクションでは、キー列を1つしか指定できません

そのため、「メールアドレス」と「日付」の2列を同時にキーとして行を特定しようとしても、標準のアクションではうまくいきません。これが「2つの列をキーにしたい」という要件でつまずくポイントです。


解決策:検索用列を1つ作って複合キーにする

この制約を回避するために、Excel 側に「検索用」の列を追加します。この列には、メールアドレスと日付を結合した文字列を格納します。これにより、2つの値を実質的に1つのキーとして扱えるようになります。


Excel 側の準備

Excel のテーブルに「検索用」という名前の列を追加します。この列には、TEXT 関数を使って日付を文字列に変換し、メールアドレスと結合した値を入れます。

=A2&TEXT(B2,"YYYY-MM-DD")
  • A2 はメールアドレスの列
  • B2 は日付の列
  • TEXT(B2, "YYYY-MM-DD") で日付を 2024-02-10 のような文字列に変換する
  • & 演算子で文字列を結合する

これにより、検索用列には masahiko.ebisu@example.com2024-02-10 のような一意の文字列が格納されます。

注意: 検索用列は見た目がよくないため、非表示にするか、必要であれば ID 列として別途管理テーブルを用意する方法もあります。


Power Automate 側の実装

ステップ1:トリガーの設定

「新しい応答が送信されたとき」(Microsoft Forms)をトリガーに設定します。

ステップ2:応答の詳細を取得

「応答の詳細を取得する」アクションを追加し、フォームの ID と応答 ID を指定します。これにより、回答者のメールアドレスや送信日時などの情報が取得できます。

ステップ3:検索用変数を初期化する

Excel の検索用列と同じ形式の文字列を Power Automate 側でも生成します。

まず、日付のフォーマット変換には formatDateTime 関数を使います。

formatDateTime(triggerOutputs()?['body/submissionTime'],'yyyy-MM-dd')

注意: Excel の TEXT 関数では YYYY-MM-DD(大文字の MM)を使いますが、Power Automate の formatDateTime では yyyy-MM-dd(小文字の yyyy、大文字の MM、小文字の dd)を使います。大文字・小文字が異なる点に注意してください。

次に、メールアドレスと整形した日付を結合した変数を作成します。

concat(outputs('')?['body/responder'],formatDateTime(triggerOutputs()?['body/submissionTime'],'yyyy-MM-dd'))

この変数が、Excel の検索用列と同じ形式の文字列になります。

ステップ4:Excel の行を取得する

「行の取得」アクションを追加し、以下のように設定します。

  • ファイル: 対象の Excel ファイルを指定
  • テーブル: 対象のテーブルを指定
  • キー列: 検索用(先ほど追加した列)
  • キー値: ステップ3で作成した変数

ステップ5:該当行を更新する

「行の更新」アクションを追加し、取得した行の「回答」列に「〇」を書き込みます。ファイルやテーブルは「行の取得」と同じものを指定し、キーの列・値も同様に設定します。


動作確認

Forms でフォームを回答送信すると、Power Automate が起動し、以下の処理が順番に実行されます。

  1. フォームの応答 ID を取得
  2. 回答者のメールアドレスと送信日時を取得
  3. 検索用の文字列を生成(例:masahiko.ebisu@example.com2024-02-10
  4. Excel の検索用列からその文字列と一致する行を特定
  5. 該当行の回答列に「〇」を記入

まとめ

Power Automate の Excel アクションでは、複数の列を組み合わせたキー指定が標準ではサポートされていません。この制約を回避するには、Excel 側に検索用の結合列を追加し、Power Automate 側でも同じ形式の文字列を生成してキーとして使うというアプローチが有効です。

ポイントをまとめると以下のとおりです。

  • Excel では TEXT 関数と & 演算子で日付とメールアドレスを結合した検索用列を作成する
  • Power Automate では formatDateTime 関数と concat 関数で同じ文字列を生成する
  • 日付フォーマットの大文字・小文字は Excel と Power Automate で異なるため注意が必要
  • 検索用列は非表示にするか、ID 管理テーブルで別途整理することも検討できる

今回紹介したのはあくまで一つのアプローチです。要件に応じてさまざまな実装方法が考えられますので、ぜひ応用してみてください。