序
SharePoint リストを起点に(請求書ファイルなどの)添付ファイルをアップロードし、必要な相手に作業完了等のメールを送り、最後に二重送信を防ぐためのフラグ更新まで行うようなフローは、実務ではよくある構成であるにもかかわらず、初学者にとっては意外とつまずきやすい題材が要所々々に散りばめられています。
今回取り上げるのは、SharePoint リストに登録されている項目に「添付ファイル」が追加されたことをきっかけに処理を開始し、該当の添付ファイルをメール送信し、送信済みフラグを更新するクラウドフローについてです。
見た目としてはそこまで複雑ではありませんが、この中には次のような Power Automate の躓きポイントがひと通り含まれているように感じます。
- トリガーの実行条件
- 変数の初期化と配列の扱い
- Apply to each による繰り返し処理
- JSON 形式を意識したデータ組み立て
- メール送信
- 項目更新による再実行防止のフラグ管理
このように分解してみると、意外にも多くの操作が必要であることが分かります。
本記事では、完成形をそのまま真似できるように構成しつつ、なぜそのアクションが必要なのか、なぜその順序になるのか、どこでデータの形を意識すべきなのか というロジックも丁寧に追っていきます。読者の皆さまが「とりあえず動いた」から一歩進んで「自分で考えて実装できる」状態を目指したい方に向けた内容です。かなり長丁場ですが、お付き合いいただけますと幸いです。
当記事は、ある程度 Power Automate を触ったことのある人が対象です
1. データを用意する

今回の模擬フローで使用するデータを用意します。作成する列は「担当者」列と「メール送信済」列の2つのみで、残りは「列の表示/非表示」から「表示」するだけのシンプルなもので今回は解説していきます。
リスト名と列名は次のように設定したものを後から日本語名に変更しています。当記事と設定内容が異なる場合、フローが正常に動作しない原因となる場合があります。
- リスト名:fileAttachment → 添付ファイル管理
- User → 担当者(※複数選択を許可に設定)
- Flag → メール送信済(※既定値を「いいえ」に設定)
2. トリガーを設計する
データを用意できたら Power Automate(クラウドフロー)を立ち上げ、上の画像のようにフロー名を好きなように設定し、トリガーを「アイテムが作成または変更されたとき」に設定します。作業完了したら「作成」をクリックします。
1.で作成した SharePoint リスト(添付ファイル管理 / fileAttachment)を紐付けたら次のステップに進みます(※当記事では、旧デザイナーで論を進めます)
3. 添付ファイルを扱う
フローは「トリガー」と「最低1つのアクション」を配置しなければなりません。ここで試しに「作成」アクションを配置し、フローが実行された時にどういったデータを取得できるのかを「動的なコンテンツ」で確認してみます。
調べてみると、添付ファイルの中身を Power Automate に取り込めていないことが分かります。つまり、このままでは添付ファイル付きのメールを送信できないことを意味しています。
3.1. 「添付ファイルの取得」で何が取れるのか
ここで登場するのが「添付ファイルの取得」アクションです。添付ファイル列の情報は、構造上、このアクションを利用しなければ取得できない仕様になっています。
この段階まで設定できたら、一度、フローを保存して「テスト」を実行してみましょう。作成したリストに新しくデータを登録して結果を確認します。
SharePoint リストの添付ファイル列は、一行の保存データに対して複数のファイルが添付されることを想定して設計されているため、アレイ(配列、リスト形式のデータ)の形で返って来ます。分かりやすく図示すると、テーブルデータの中に別のテーブルデータが入れ子になっているイメージです。
しかし、アップロードしたファイルの件数分だけの情報を取得できたものの、ファイル名とその保存場所くらいで、添付ファイルそのもの(ファイルコンテンツ)を取得できていない状態です。
3.2. 「添付ファイルのコンテンツの取得」 を配置する
今度は、添付ファイルのコンテンツそのものを取得するために「添付ファイルのコンテンツの取得」アクションを配置します。
このとき注意しなければならないのが、ID と Id が存在することです。トリガー実行時の行データ番号(ID)に対して、複数の添付ファイルが存在する可能性を考慮して「ファイル識別子(Id)」が存在しています。
ここまで設定できたら、再び「テスト」を実行して動作を確認します。ファイル件数が1件であっても Apply to each が入っていますが正常な動作です(👉️第4章)
正しく添付ファイルのコンテンツを取得できたら、次の設定に進みましょう(※正常にフローが実行されていれば、添付ファイルのコンテンツは取得できています)
2回目以降のテストは「手動」でなく「自動」→「最近使用したトリガーで。」→「成功」を順にクリックして実行すると、わざわざリストを更新してトリガーする必要がなくなるため便利です。
3.3. トリガーの実行条件を設定する
現在は「SharePoint リストに新しくデータが保存されたとき」と「保存データに何かしらの変更があったとき」の両方でフローが反応するように設定されています。ここでは、この設定を「添付ファイルがアップロードされたタイミングのみ」実行されるように変更していきます。
設定をクリックしたら、ウィンドウ最下部の「トリガーの条件」まで進み「+追加」ボタンをクリックします。すると、数式を記入できるボックスが表示されるので、その入力欄に次の数式を書きます。
@equals(triggerBody()?['{HasAttachments}'], true)
Power Automate は、マウス操作で「動的なコンテンツ」を配置することでデータが得られるように設計されています。しかし、その背後では、以下の画像のようなプログラミングコードが流れています。
例えば上のスクリーンショットのように、赤枠で囲った {HasAttachments} は「添付ファイルあり」と和訳され、添付ファイルの有無を「動的なコンテンツ」として選択できるようになっています。
この数式は、トリガー実行時の {HasAttachments} というキーに含まれた値が true と等しい時にフローを実行することを示しています。数式のお作法(文法)については、一旦「そういうもの」と飲み込んでおき、書き方に関しては次の記事をご一読いただければと思います(必死に覚える必要もないと思っています)
3.4. 「アイテムが作成または変更されたとき」 アクションの注意点
「トリガーの実行条件」の設定が完了したら「添付ファイルあり」のパターンと「添付ファイルなし」のパターンとで「新規登録」と「変更」も含めそれぞれテスト実行してみます。
ただし「アイテムが作成または変更されたとき」アクションの動きには注意が必要です。グリッドビューでのデータ登録や更新作業は、セルが移動した(確定された)時点で「作業完了」とみなされ、完全に入力されていなくてもフローが実行されてしまいます。
もちろん、今回はトリガーの実行条件に「添付ファイルの有無」を設定しているため、添付ファイルがデータ行に含まれていないものについてはフローは実行されません。しかし「添付ファイルあり」の行を更新したり、添付ファイルをグリッドビューでいきなり登録してしまうとフローは実行されます。
「グリッドビューで編集」を使ったときのトリガーの動作に注意しておきましょう
余談ながら、SharePoint リストの挙動に社員全員が明るいわけではないはずなので、予期しない動作を未然に防ぎたい場合は Power Apps アプリの導入を検討するのもアリだと思います。
4. Apply to each を理解する
3.2. の作業にて「添付ファイルのコンテンツの取得」を配置した際、繰り返し処理を意味する Apply to each アクションが自動挿入されました。ここでは、この先での作業を分かりやすくするための事前学習を行います(※4. は読み飛ばしていただいてもフロー完成に影響はありません)
4.1. 繰り返しとなる対象
今回、繰り返し処理の対象は「添付ファイル」列内に存在する配列(アレイ)型の値です。アレイ型とは、複数の値を表形式に並べて1つの「かたまり(変数)」として管理するデータ構造を指します。
この出力結果を見慣れた形に整えたものが次の画像です。慣れると、こんな感じで作り変えなくても構造を捉えられるようになっていくと思います(委細はこちらの参考記事をご一読ください)
Apply to each アクションは、この表形式のデータ(=添付ファイルの件数)が3行あれば3回、5行あれば5回、アクション内で設定された同一の処理を繰り返す役割があるということをまず押さえておきましょう。
4.2. 添付ファイル付きメールの送信 (NG例)
つまり、このままメール送信アクションを Apply to each アクション内に配置すると、添付ファイルの件数分だけ同一処理を繰り返すことを意味します。次のような設定の後、テストを実行し、お手元の添付ファイルを2件分登録してみましょう。
処理が成功したら2通のメールが届きます。確認してみると「異なる添付ファイル付きメールが、同一の相手に同一の内容で送信される」という動作になりました。
業務要件として、添付ファイルが1件しかない場合はこのままの設定で差し支えありません。しかし、今回は複数の添付ファイルを1通のメールとして送信する必要があります。
試しに Apply to each アクションの外側に「メールの送信」アクションを配置してみますが、やはり、Apply to each アクションが挿入されてしまいます。また、添付ファイルのコンテンツを取得できなくなってしまいます。
したがって、この「添付ファイルのコンテンツ」を1つのデータに取りまとめていく操作が必要となっていきます。
メールは1通だけ送信したいので、Apply to each アクションの外に「メールの送信(V2)」アクションを配置し、次の処理へと進みましょう。
5. 変数を操作する
ここで登場するのが「変数」です。変数とは、文字通り「(定義によって)変動する数」を示しています。数学の世界では X や Y に数を代入することで解を導き出していたと思います。
ところが、プログラミングにおける変数は、数だけでなく文字データなども含めて広い範囲で「数」と表現しています。例えば「製品名」という変数に対して Automate が代入されるとき、Y は "Power Automate" という語が浮かび上がってきます。
5.1. 変数を初期化する
変数の操作で大切なのは、まず、その変数が何を示すのかを「定義」しなければなりません。Power Automate の場合、その役割を担うのは「変数を初期化する」アクションであるといえます。
変数名は「添付ファイル」とし、種類を「アレイ」と設定します。今回、値には何も設定する必要はありません。このアクションは、あくまでも、①どんな型のデータが、②どんな名前の変数に代入されるのかを予め「定義」するためのものだからです。
5.2. 配列変数に追加する JSON の形
作成(定義)した変数を、Apply to each アクション内で活用します。次の画像を参考に「配列変数に追加」アクションを配置し、前もって定義しておいたアレイ型変数の「添付ファイル」を選択した後で、値である「添付ファイルのコンテンツ」を動的なコンテンツから選択します。
これで添付ファイルが1件であろうとも、5件であろうとも、繰り返し処理が実行される回数分だけ、添付ファイルは配列変数内で取りまとめられるようになりました。
5.3. メール添付で要求されるデータ形式を理解する
あとは、この取りまとめられた「添付ファイル」を「メールの送信(V2)」アクションに配置するだけとなりました。しかし「添付ファイル コンテンツ」内に、先ほど作成した変数を配置しようとしても、動的なコンテンツが見つからない上にファイル名の設定もできません。
少し分かりにくいのですが、上の画像のように小さなアイコンをクリックすることで「添付ファイル」を配置できるようになります。
配置したらテストを実行してみます。しかし「フローの実行に失敗しました」というバナーが現れ、メールは送信されない結果となってしまいました。ここで大切なのは、すぐに編集画面に戻らず 右枠の「エラーメッセージをしっかりと読む」 ことです。
今回のエラー内容を日本語訳すると次のようになります。
- ワークフロー操作「メールの送信 (V2)(種類: OpenApiConnection)の inputs.parameters が正しくありません
- 詳細: API 操作 SendEmailV2 に、必須のプロパティ emailMessage/Attachments/0/Name がありません
つまり、メールに添付しようとしているファイルに「ファイル名」が存在していないことを示しています。現在のファイル形式(変数)は次のようになっています。
[
{
"$content-type": "image/svg+xml",
"$content": "sugokunagaimoji [...]"
}
]
一方で、メールに添付する各要素は次のようになっていなければなりません。
[
{
"Name": "sample.pdf",
"ContentBytes": "sugokunagaimoji [...]"
}
]
出力結果と比較してみると、コンテンツは取得できているのですが、ファイル名が取得できていないことが分かります。ファイル本体を取得しただけでは、ファイル名を自動で補完できないことが分かります。
したがって、ファイル名とコンテンツをそれぞれ正しく枠内に渡す必要があります。エラーメッセージにあるように「ファイル名」と「コンテンツ」に該当するキーを手入力し、それぞれ動的なコンテンツに値として設定します(以下の数式をコピペで問題ありません)
{
"Name": @{item()?['DisplayName']},
"ContentBytes": @{body('添付ファイルのコンテンツの取得')}
}
ここまで設定を終えたら再びフローを実行して結果を確認してみましょう。上手く実装できていれば、添付ファイルの数だけ届いていたメールが1件に減り、ファイルは複数件添付されているはずです。
6. メール本文や送信先のデータを組み立てる
最大のヤマ場である「添付ファイル」が片付いたので、あとは比較的気楽に取り組めるはずです。ここからは、Office 365 Outlook コネクタにおける「メールの送信(V2)」アクションの設定です。
6.1. 「書式設定の方法」 について知る
上の画像のように、まずは SharePoint リストの対象行に飛ぶリンクを、メール本文内に配置してフローを実行してみます。配置する「動的なコンテンツ」は、トリガーである「アイテムが作成または変更されたとき」で得られる「アイテムへのリンク」です。
これで対象の行にジャンプできる…と言いたいところですが、クリックしてジャンプする「ハイパーリンク」としてではなく、平文(プレーンテキスト)で送られてしまいます。
実行履歴を確認すると、入力内容に「段落」を示す <p> タグが付いていることから、配置した動的なコンテンツはテキストとして認識していると判断できそうです。つまり、この「本文」では HTML というプログラミング言語が働いていることが分かります。
6.2. 対象の SharePoint リストに飛ぶリンクを作成する
HTML でハイパーリンクを表すためには、次のように記述する必要があります。
<a href="https://example.com">アンカーテキスト</a>
アンカーテキストとは、リンクとして表示する文字列のことを指しており、上の例であれば、"https://example.com" の Web サイトに飛ぶリンクが「アンカーテキスト」という文字列で表記されます。
色々と方法はありますが、上の画像のように作成アクションを配置してハイパーリンクを設定する方法が最も安定して動作するように感じています。
<a href="@{triggerOutputs()?['body/{Link}']}">アイテムへのリンク</a>
ハイパーリンクを作成したらアクション名を変更しておくと便利です。その後、作成アクションでの実行結果を「動的なコンテンツ」として配置できるようになるので、メール本文にセットして作業完了です。
6.3. 送信先メールアドレスを整える
現在はテスト段階なので自分のメールアドレスを1件入れるだけでOKでした。しかし、実際の業務では宛先が複数件ある場合があります。
実行履歴から「担当者(User)」列を確認してみると、表形式のデータとして Power Automate に取り込まれていることが確認できました。したがって、そのまま「担当者 Email」を配置すると Apply to each が自動挿入されます。
メールの送信先が「個人の宛先」かつ「少人数」であればこの設定でも問題ないと思います。しかし、この宛先にグループアドレスや CC.に自分のアドレスを指定するなどしていた場合、複数件、同一内容のメールが同じ人に届いてしまう可能性を考慮しなければなりません。
そこで「宛先」の法則性を眺めてみると「セミコロン(;)」で区切ることで送信先を取りまとめられることが分かります。このアクションの前で「担当者」列に保存されている Email のデータのみを取り出してこの形式に整えることで解決しそうです。
選択アクションを配置したら「開始」に「アイテムが作成または変更されたとき」アクションで得た「担当者」を配置します(※右側に何も書かれていない「担当者」である点に注意)
マップには、入力モードを切り替えた上で「担当者 Email」を配置します。これによって、以下の出力結果ように、リストの「担当者」列から Email データだけを「アレイ」の形で抽出できるようになります(※ここでアクション名を変更しておくと便利です)
[
"メールアドレスAAA",
"メールアドレスBBB",
"メールアドレスCCC"
]
今度は、この「アレイ」に含まれている値をセミコロン(;)で連結する操作を行います。この連結には「結合」アクションを利用します(※結合アクション配置時に名称を変更しています)
結合する配列には直前に整形した「選択」アクションの出力結果を、次を使用して結合には 半角英数字で セミコロンを入力します。
最後に「メールの送信(V2)」アクションの宛先を、結合アクションの出力結果に置換して作業完了です。一度、フローを実行してテストして結果を確認しておくと良いでしょう。
7. メール再送防止の設定
最後に、作業完了(あるいは内容確認)の報告メールが送信されたことをリストに登録します。従来はメールボックスにしかなかった情報が SharePoint リストで一元管理できるようになります。
7.1. 「項目の更新」 アクションの配置と設定
設定はいたって単純です。トリガーで得た行に対して ✓ を入れるだけなので、ID を設定後に「メール送信済」を「いいえ」から「はい」に切り替えるのみです。
7.2. 再送防止の設計
しかし、ここで注意しなければならないのは、この「項目の更新」と「アイテムが作成または変更されたとき」の関係性についてです。
現在は、SharePoint リストのデータの内「添付ファイル」列にファイルが存在するデータ行に対して「登録」か「変更」かが発生した時にフローが実行される仕組みになっています。つまり、この設定のままだと同一内容のメールが立て続けに送信され続けることを意味します。
7.3. トリガーの実行条件の再設定
それを防止するため、トリガーの実行条件を追加します。今回は「メール送信済」列に ✓ が入っていない時だけフローを実行したい、言い換えると、✓ が入ったデータ行に変更が加えられた場合はフローを実行しないように設定を行います。
記事の冒頭で作成したトリガーの実行条件に追加する形で次の数式を入力します。
@equals(triggerOutputs()?['body/Flag'], false)
この数式の文法は暗記する必要はありません。しかし、SharePoint リストの列の設定内容(データ型)に応じて書き方が変わる点は抑えておいた方が良さそうです。詳細は、こちらの記事をご一読いただくと良いでしょう。
今回は「はい / いいえ」型であるため、上に示した数式を入力することで無限ループを回避できるようになります。仮に、当記事とは無関係の SharePoint リストでフローを構築する場合は、入力内容を読み替えてご活用ください。
@equals(triggerOutputs()?['body/リストの内部列名'], false)
特に、ここではリストの表示名ではなく内部列名を設定する必要があります。SharePoint リストの列を半角英数字ではなく、全角文字で作成していた場合は、こちらの記事を参考にしながら内部列名を設定するとよいでしょう。
その内部列名に、OData_ を追加して設定することでトリガーの実行条件を設定できます。
@equals(triggerOutputs()?['body/OData_リストの内部列名'], false)
以上で作業完了です。お疲れさまでした。
結
今回のフローは、SharePoint リストを起点に、添付ファイルを取得し、必要な形に整えた上でメールを送り、最後にメール送信済みとして処理をするというものでした。
Power Automate の宣伝文句は「マウス操作と簡単なキー入力」というものですが、個人的には「Power Platform で最も難しいツールではないだろうか」とさえ考えています。
- どの条件でフローを実行するのか
- どのタイミングで配列を作るのか
- 繰り返しの中で何を取得するのか
- メール添付として渡すためにどのような JSON データが必要なのか
- そして、最後にどの値を更新すれば再実行を防げるのか
- プロコード(JSON や HTML)の知識を要する
といった場面が少なくないと考えているためです。本記事のサンプルは単なる実装例ではなく「クラウドフローの基本思想をひととおり練習できる教材」として、社内コミュニティなどで活用いただけるものになっていれば幸いです。
Power Automate を初めて触る人には提供しないようご注意ください
トリガー、条件、変数、ループ、データ整形、通知、更新という一連の流れや実行後に取得できるデータの構造を理解できれば、今回の題材に限らず、申請通知、添付ファイル転送、帳票管理など、さまざまな業務フローへ応用できるようになるはずです。
Power Automate のスキル習得において大事なのは「今どのデータを持っているのか」と「次のアクションはどんな形のデータを求めているのか」を意識しながら組み立てることです(欲を言えば、ライセンスに応じた制限にも目を届かせておくと尚良いです)
改めて、インターネットで見つけた記事のコピペで済ませる実装ではなく、自力で考えてフローを組めるようになるための足場に本稿が役立てば幸いです。





















































