はじめに
Word for Microsoft 365に宛名の差し込みを使用して一括メール メッセージを送信するという機能は存在しますが、所属する組織の中では、それぞれの書式に基づき、メールを配信したいというニーズがあります。
一括メール配信
となるとOutlook VBAやRPAを使った処理が選択肢として浮かびます。
しかしながら引継ぎがなんだといった課題やRPAは共有するための処理など手間が発生しがちです。
Power Automate芸人として今回は共有メールボックス
にメールのひな型を設け、
共有メールボックス
から対象者に決められた雛形
の内容を置き換え、メールを配信する機能を考えてみました。
要件
今回のテーマとして共有メールボックス
から雛形を取得し、Excelの記載内容に基づきメール配信をします。
-
共有メールボックス
にPower Automateのフロー所有者がアクセス可能 - 雛形に付帯する
メールフォルダ
、メールの件名
は統一されている前提で記載します
- 共有メールボックスは
Microsoft 365管理センター
で設定します - 今回例で作成した共有メールボックスはPublicTeamという名前で設けています
下準備
配信するメールは下記の内容です。
タイトル
- 【重要】{Date}_株式会社GATSUO_FY20241Q総決算会議
{name} さん
お疲れ様です。
総務伝達係のDe'modori Gatsuoです。
この度、FY20241Q総決算会議の連絡です。
最後まで目を通してください。
日付
{Date}
時間
{DateTime}
場所
{Place}
会議の出席確認と円滑な進行のため、以下のアンケートフォームにご回答いただきたくお願い申し上げます。
アンケートの回答締め切りは {Deadline} です。
アンケートフォーム:
DEmodoriGatsuO - Qiita
お忙しいところ恐縮ですが、皆様のご協力をお願いいたします。
何かご不明点やご質問がございましたら、お気軽にご連絡ください。
皆様のご参加を心よりお待ちしております。
FY20241Q総決算会議
De'modori Gatsuo
htmlは長いのでおりたたみ
<body dir="ltr">
<div class="elementToProof"
style="font-family:Aptos,Aptos_EmbeddedFont,Aptos_MSFontService,Calibri,Helvetica,sans-serif; font-size:12pt;
color:rgb(0,0,0)">{} さん</div>
<div style="font-family:Aptos,Aptos_EmbeddedFont,Aptos_MSFontService,Calibri,Helvetica,sans-serif; font-size:12pt;
color:rgb(0,0,0)"><br></div>
<div class="elementToProof"
style="font-family:Aptos,Aptos_EmbeddedFont,Aptos_MSFontService,Calibri,Helvetica,sans-serif; font-size:12pt;
color:rgb(0,0,0)">お疲れ様です。</div>
<div class="elementToProof"
style="font-family:Aptos,Aptos_EmbeddedFont,Aptos_MSFontService,Calibri,Helvetica,sans-serif; font-size:12pt;
color:rgb(0,0,0)">総務伝達係のDe'modori Gatsuoです。</div>
<div class="elementToProof"
style="font-family:Aptos,Aptos_EmbeddedFont,Aptos_MSFontService,Calibri,Helvetica,sans-serif; font-size:12pt;
color:rgb(0,0,0)"><br></div>
<div class="elementToProof"
style="font-family:Aptos,Aptos_EmbeddedFont,Aptos_MSFontService,Calibri,Helvetica,sans-serif; font-size:12pt;
color:rgb(0,0,0)">この度、FY20241Q総決算会議の連絡です。</div>
<div class="elementToProof"
style="font-family:Aptos,Aptos_EmbeddedFont,Aptos_MSFontService,Calibri,Helvetica,sans-serif; font-size:12pt;
color:rgb(237,92,87)"><b><u>最後まで目を通してください。</u></b></div>
<div style="font-family:Aptos,Aptos_EmbeddedFont,Aptos_MSFontService,Calibri,Helvetica,sans-serif; font-size:12pt;
color:rgb(0,0,0)"><br></div>
<table id="table_0"
data-editing-info="{"topBorderColor":"#ABABAB","bottomBorderColor":"#ABABAB","verticalBorderColor":"#ABABAB","hasHeaderRow":false,"hasFirstColumn":false,"hasBandedRows":false,"hasBandedColumns":false,"bgColorEven":null,"bgColorOdd":"#ABABAB20","headerRowColor":"#ABABAB","tableBorderFormat":0,"verticalAlign":"top"}"
style="box-sizing:border-box; border-collapse:collapse; border-spacing:0px">
<tbody>
<tr>
<td class="elementToProof" style="width:120px; height:27px; border-width:1px; border-style:solid;
border-color:rgb(171,171,171); vertical-align:top; box-sizing:border-box">
<div style="text-align:center;
font-family:Aptos,Aptos_EmbeddedFont,Aptos_MSFontService,Calibri,Helvetica,sans-serif;
font-size:12pt; color:rgb(0,0,0)">日付</div>
</td>
<td class="elementToProof" style="width:120px; height:27px; border-width:1px; border-style:solid;
border-color:rgb(171,171,171); vertical-align:top; box-sizing:border-box">
<div style="text-align:center;
font-family:Aptos,Aptos_EmbeddedFont,Aptos_MSFontService,Calibri,Helvetica,sans-serif;
font-size:12pt; color:rgb(0,0,0)">Date</div>
</td>
</tr>
<tr>
<td style="width:120px; height:27px; border-width:1px; border-style:solid;
border-color:rgb(171,171,171); vertical-align:top; box-sizing:border-box">
<div class="elementToProof" style="text-align:center;
font-family:Aptos,Aptos_EmbeddedFont,Aptos_MSFontService,Calibri,Helvetica,sans-serif;
font-size:12pt; color:rgb(0,0,0)">時間</div>
</td>
<td style="width:120px; height:27px; border-width:1px; border-style:solid;
border-color:rgb(171,171,171); vertical-align:top; box-sizing:border-box">
<div class="elementToProof" style="text-align:center;
font-family:Aptos,Aptos_EmbeddedFont,Aptos_MSFontService,Calibri,Helvetica,sans-serif;
font-size:12pt; color:rgb(0,0,0)">DateTime</div>
</td>
</tr>
<tr>
<td style="width:120px; height:27px; border-width:1px; border-style:solid;
border-color:rgb(171,171,171); vertical-align:top; box-sizing:border-box">
<div class="elementToProof" style="text-align:center;
font-family:Aptos,Aptos_EmbeddedFont,Aptos_MSFontService,Calibri,Helvetica,sans-serif;
font-size:12pt; color:rgb(0,0,0)">場所</div>
</td>
<td style="width:120px; height:27px; border-width:1px; border-style:solid;
border-color:rgb(171,171,171); vertical-align:top; box-sizing:border-box">
<div class="elementToProof" style="text-align:center;
font-family:Aptos,Aptos_EmbeddedFont,Aptos_MSFontService,Calibri,Helvetica,sans-serif;
font-size:12pt; color:rgb(0,0,0)">Place</div>
</td>
</tr>
</tbody>
</table>
<div style="font-family:Aptos,Aptos_EmbeddedFont,Aptos_MSFontService,Calibri,Helvetica,sans-serif; font-size:12pt;
color:rgb(0,0,0)"><br></div>
<div style="font-family:Aptos,Aptos_EmbeddedFont,Aptos_MSFontService,Calibri,Helvetica,sans-serif; font-size:12pt;
color:rgb(0,0,0)"><br></div>
<div style="font-family:Aptos,Aptos_EmbeddedFont,Aptos_MSFontService,Calibri,Helvetica,sans-serif; font-size:12pt;
color:rgb(0,0,0)">会議の出席確認と円滑な進行のため、以下のアンケートフォームにご回答いただきたくお願い申し上げます。</div>
<div class="elementToProof"
style="font-family:Aptos,Aptos_EmbeddedFont,Aptos_MSFontService,Calibri,Helvetica,sans-serif; font-size:12pt;
color:rgb(237,92,87)"><span style="background-color:rgb(255,255,0)">アンケートの回答締め切りは {Deadline} です。</span>
</div>
<div style="font-family:Aptos,Aptos_EmbeddedFont,Aptos_MSFontService,Calibri,Helvetica,sans-serif; font-size:12pt;
color:rgb(0,0,0)"><br></div>
<div class="elementToProof"
style="font-family:Aptos,Aptos_EmbeddedFont,Aptos_MSFontService,Calibri,Helvetica,sans-serif; font-size:12pt;
color:rgb(0,0,0)">アンケートフォーム: </div>
<div class="elementToProof"
style="font-family:Aptos,Aptos_EmbeddedFont,Aptos_MSFontService,Calibri,Helvetica,sans-serif; font-size:12pt;
color:rgb(0,0,0)"><a href="https://qiita.com/DEmodoriGatsuO" id="OWAc6f24db6-bf66-043e-ddf9-b8818fb66265"
class="OWAAutoLink">DEmodoriGatsuO - Qiita</a></div>
<div style="font-family:Aptos,Aptos_EmbeddedFont,Aptos_MSFontService,Calibri,Helvetica,sans-serif; font-size:12pt;
color:rgb(0,0,0)"><br></div>
<div class="elementToProof"
style="font-family:Aptos,Aptos_EmbeddedFont,Aptos_MSFontService,Calibri,Helvetica,sans-serif; font-size:12pt;
color:rgb(0,0,0)">お忙しいところ恐縮ですが、皆様のご協力をお願いいたします。</div>
<div style="font-family:Aptos,Aptos_EmbeddedFont,Aptos_MSFontService,Calibri,Helvetica,sans-serif; font-size:12pt;
color:rgb(0,0,0)"><br></div>
<div style="font-family:Aptos,Aptos_EmbeddedFont,Aptos_MSFontService,Calibri,Helvetica,sans-serif; font-size:12pt;
color:rgb(0,0,0)">何かご不明点やご質問がございましたら、お気軽にご連絡ください。</div>
<div style="font-family:Aptos,Aptos_EmbeddedFont,Aptos_MSFontService,Calibri,Helvetica,sans-serif; font-size:12pt;
color:rgb(0,0,0)"><br></div>
<div style="font-family:Aptos,Aptos_EmbeddedFont,Aptos_MSFontService,Calibri,Helvetica,sans-serif; font-size:12pt;
color:rgb(0,0,0)">皆様のご参加を心よりお待ちしております。</div>
<div style="font-family:Aptos,Aptos_EmbeddedFont,Aptos_MSFontService,Calibri,Helvetica,sans-serif; font-size:12pt;
color:rgb(0,0,0)"><br></div>
<div style="font-family:Aptos,Aptos_EmbeddedFont,Aptos_MSFontService,Calibri,Helvetica,sans-serif; font-size:12pt;
color:rgb(0,0,0)">FY20241Q総決算会議</div>
<div style="font-family:Aptos,Aptos_EmbeddedFont,Aptos_MSFontService,Calibri,Helvetica,sans-serif; font-size:12pt;
color:rgb(0,0,0)">De'modori Gatsuo</div>
</body>
タイトルと本文のうち下記の名前の文字列
を置き換えます。
置き換える文字列
と対応するExcel
は下記の表に基づきます。
置き換え文字列 | 対応するExcelの列 |
---|---|
{Date} | Date列(A列) yyyy/mm/dd
|
{name} | メール配信先の名前(B列) |
{DateTime} | DateTime列(C列) |
{Place} | Place列(D列) |
{Deadline} | Deadline列(E列) |
メール配信先
はF列
です。
- まったくメール文面と関係がない置き換えですが、差し込み方の手法ということでご認識ください
- Excelの置き場所
-
ExcelはSharePoint上にMailExcelという名前で、テーブル名はMailTableとしています
- SharePointやOneDriveにExcelがある想定で記載しています
- いわゆるローカルファイルには適用していません
メールのひながたの準備
メールのひながたを作成します。
進め方は簡単です。下書きを用意して、共有メールボックスのフォルダにドラッグアンドドロップします。
今回の場合、共有メールボックスは共有アイテム
> PublicTeam
に位置します。
こちらにひながた
という名前のフォルダを作り、メールを格納しています。
これで下準備は整いました。
Power Automate
トリガー
は、インスタント クラウドフロー
のフローを手動でトリガーする
を選択します。
コチラはボタンをクリックしたとき
に走るフローです。
Power Automate
上では赤枠の実行
をクリックするとフローが走ります。
さて、肝心な内容を解説します。
フローの内容
- フローを手動でトリガーする - 指定するパラメーターはありません
- メールを取得する (V3) Office 365 Outlook
- JSON の解析 Data Operation - 画像では
該当するメールを取得する
と記載 - 表内に存在する行を一覧表示 Excel Online (Business)
-
For each - 繰り返す処理、使用する環境によってApply to eachや
それぞれに適用する
など表示名が変わります- メールの送信 (V2) Office 365 Outlook
幅広い方に向けて発信させていただくため、可能な限り私なりに咀嚼して細かく内容をスクリーンショットとともに記載します。
1. フローを手動でトリガーする
特に記載事項はありません。
2. メールを取得する (V3) Office 365 Outlook
-
アクションの追加
もとい+
をクリックし、ランタイム
を標準
にします - 赤枠
rgba(255,0,0,1)
のOffice 365 Outlookを選択してください
クリックした後メールを取得する (V3)
を選択してください。
下記がメールを取得するうえでの設定画面です。
複数抑えなければならない点があります。
ステップバイステップで見ていきましょう。
まず初めに、元のメールボックスのアドレス
に共有メールボックスのアドレス
を設定することからスタートしてください。
上記の設定に応じて、後述するフォルダー
の設定が変わります
-
件名フィルター
-
共有メールボックス
の特定のフォルダ
のなかで合致するメールの下書きのタイトルを書きます - 同名のタイトルのメールファイルは避けておきましょう
-
- フォルダー
-
未読メッセージのみを取得する
- いいえ に設定します
- 既定では、はいになってしまい、既読のメールが取得できない状態になっているので、必ずいいえに指定してください
- 元のメールボックスのアドレス
- 共有メールボックスのアドレスを指定します
- 前述の工程で完了しているものです
- 添付ファイルを含める(オプション)
- こちらを
はい
に指定しておくことで、ひながたのメールに付帯した添付ファイル
もまとめて配信できます
- こちらを
3. JSON の解析 Data Operation - 画像では該当するメールを取得する
と記載
-
アクションの追加
もとい+
をクリックし、ランタイム
を組み込み
にします - 赤枠
rgba(255,0,0,1)
のData Operationまたはデータ操作
を選択してください
- この中から
JSON の解析
を選択します
慣れている方にとっては不要な動作です。
また慣れていない方にとっては、もっとも首をかしげてしまう部分かもしれませんが、がんばってみていきましょう。
「2. メールを取得する (V3) Office 365 Outlook」で取得されるメールですが配列(Array)
というデータ型で取得されます。
メールの件数が、0件でも1件でも100件でも同様のデータの形で返されるイメージです。
配列は複数のデータを、まとめて格納したデータの形の一種になります。
イメージ図
今回はメールファイルを複数取得しないようメールのタイトル
を重複させない対策をとっていますが、この工程で取得される値は必ずvalue
という複数形
になるため、明示的に配列のなかの何番目のデータということを表現する必要があります。
JSON の解析
のContent
でfx
のマークをクリックし、
first(outputs('メールを取得する_(V3)')?['body/value'])
と設定します。
ここでSchema
という部分があります。
これは、後ほどの工程で今回取得したデータの内容を参照するために設定しておくと便利な項目です。
サンプルのペイロード
から基本的には取得しますが、このアクションでは不変の内容であるため、今回私が取得した下記の値をそのままコピペしてください。
{
"type": "object",
"properties": {
"id": {
"type": "string"
},
"receivedDateTime": {
"type": "string"
},
"hasAttachments": {
"type": "boolean"
},
"internetMessageId": {
"type": "string"
},
"subject": {
"type": "string"
},
"bodyPreview": {
"type": "string"
},
"importance": {
"type": "string"
},
"conversationId": {
"type": "string"
},
"isRead": {
"type": "boolean"
},
"isHtml": {
"type": "boolean"
},
"body": {
"type": "string"
},
"attachments": {
"type": "array"
}
}
}
3. 表内に存在する行を一覧表示 Excel Online (Business)
-
アクションの追加
もとい+
をクリックし、ランタイム
を標準
にします - 赤枠
rgba(255,0,0,1)
の*Excel Online(Business)*を選択してください
この中で表内に存在する行を一覧表示
を選択します。
こちらはシェブロン
や項目をそれぞれクリックすると、選択式で対象が選べるためわかりやすいと思います。
Excelの注意点ですが、表内に日付のデータがある場合、詳細パラメーター
の設定が必要です。
DateTime 形式
をISO 8601に設定してください。
4および5. 繰り返し処理 メールの送信 (V2) Office 365 Outlook
いよいよメールの送信
です。
-
アクションの追加
もとい+
をクリックし、ランタイム
を標準
にします - 赤枠
rgba(255,0,0,1)
のOffice 365 Outlookを選択してください
メールの送信 (V2)
を選択します。
-
宛先
はExcelで読み込んだ値を選択します。宛先をクリックし、カスタム値の入力
を選択します
選択したあと、自動的にFor eachで囲まれます
データ型が複数であると、自動的に繰り返し処理の対象と判断し、フローが構成されます。
このまま設定を進めていきましょう。
件名は、計算式で文字を置き換える必要があります。
そのためreplace 関数を使います。
-
件名
を選択、fx
のマークをクリックします - 置き換え式を設定します
replace(body('該当するメールを取得する')?['subject'], '{Date}', formatDateTime(item()?['Date'],'yyyy/MM/dd'))
ざっくり表現すると
replace(置き換える文字が含まれる文字列全体
,置き換えたい文字
,置き換えた後の文字
)
といった具合です。Excelとほとんど一緒ですが、字面がきついですね。
また日付型のデータは、うまい具合に2024/06/24
といったyyyy/MM/dd
の形では出てきてくれません。
UNIXタイムスタンプという、う""っとなるような文字で表現されるため、ここで加工をする必要があります。
さて、次は本文
です。
置き換えのため、ここも計算式
が必要になります。
-
本文
を選択、fx
のマークをクリックします - 置き換え式を設
replace(replace(replace(replace(replace(body('該当するメールを取得する')?['body'],'{Date}', formatDateTime(item()?['Date'],'yyyy/MM/dd')),'{name}',item()?['Name']),'{DateTime}',item()?['DateTime']),'{Place}',item()?['Place']),'{Deadline}',formatDateTime(item()?['Deadline'],'yyyy/MM/dd'))
見た目が非常に悪い関数ですね。ExcelでいうIf文
が多く入った状態に近しいです。
置き換える文字の数だけreplaceをかけています。
階段式に表現してみましょう
replace(
// 4. (3)で置き換えた結果をもとに{Deadline}という文字をExcelのDeadline列の値に置き換え
replace(
// 3. (2)で置き換えた結果をもとに{Place}という文字をExcelのPlace列の値に置き換え
replace(
// 2. (1)で置き換えた結果をもとに{DateTime}という文字をExcelのDateTime列の値に置き換え
replace(
// 1. {Date}という文字をExcelのDate列の値に置き換え
replace(body('該当するメールを取得する')?['body'],'{Date}', formatDateTime(item()?['Date'],'yyyy/MM/dd')),
'{name}',item()?['Name']
),
'{DateTime}',item()?['DateTime']
),'{Place}',item()?['Place']),
'{Deadline}',formatDateTime(item()?['Deadline'],'yyyy/MM/dd')
)
()
の場所で対になっていますね。
それでも難読。変数を用いることで、より簡素になりますが、実質やっていることは置き換え
を繰り返している、といったイメージです。
ひながたの置き換えではなく、メールの送信
指定した文字の箇所に値を置く形式のほうが、慣れないうちは楽です。
しかし今回は雛形を置き換える形式なので、計算式を用いています。
詳細パラメーターは下記を設定します。
こちらで完成🙌お疲れ様でした!
実行すると差し込みで一括配信が実現できます!
共有メールボックス
に雛形があるため、関係者にフローを複製し、接続を変えていただくだけで使いまわせることもポイントですね。
コピーの送信
で選択した方にフローを複製できます。
また管理者が実行のみユーザー
に使う人を指定することでも使っていただくことができるため、オプションは複数存在します。
上記から実行専用ユーザー
を設定することでも使用可能
おわりに
今回はチームメンバーにもフローを共有する前提のシナリオを書いてみました!
クラウドフローでも値の差し込み
は可能です。
豊富なコネクタから値を取得できることも魅力!
計算式
や配列
など出てきましたが、慣れればどうってことないです!
是非トライしてみてください!