LoginSignup
3
3

はじめに

Word for Microsoft 365宛名の差し込みを使用して一括メール メッセージを送信するという機能は存在しますが、所属する組織の中では、それぞれの書式に基づき、メールを配信したいというニーズがあります。

一括メール配信となるとOutlook VBARPAを使った処理が選択肢として浮かびます。
しかしながら引継ぎがなんだといった課題や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="{&quot;topBorderColor&quot;:&quot;#ABABAB&quot;,&quot;bottomBorderColor&quot;:&quot;#ABABAB&quot;,&quot;verticalBorderColor&quot;:&quot;#ABABAB&quot;,&quot;hasHeaderRow&quot;:false,&quot;hasFirstColumn&quot;:false,&quot;hasBandedRows&quot;:false,&quot;hasBandedColumns&quot;:false,&quot;bgColorEven&quot;:null,&quot;bgColorOdd&quot;:&quot;#ABABAB20&quot;,&quot;headerRowColor&quot;:&quot;#ABABAB&quot;,&quot;tableBorderFormat&quot;:0,&quot;verticalAlign&quot;:&quot;top&quot;}"
        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}&nbsp;です。</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)">アンケートフォーム:&nbsp;</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>

image.png

タイトルと本文のうち下記の名前の文字列を置き換えます。
置き換える文字列対応するExcelは下記の表に基づきます。

置き換え文字列 対応するExcelの列
{Date} Date列(A列) yyyy/mm/dd
{name} メール配信先の名前(B列)
{DateTime} DateTime列(C列)
{Place} Place列(D列)
{Deadline} Deadline列(E列)

メール配信先F列です。

  • まったくメール文面と関係がない置き換えですが、差し込み方の手法ということでご認識ください
  • Excelの置き場所
  • ExcelSharePoint上にMailExcelという名前で、テーブル名はMailTableとしています
    • SharePointOneDriveExcelがある想定で記載しています
    • いわゆるローカルファイルには適用していません

メールのひながたの準備

メールのひながたを作成します。
進め方は簡単です。下書きを用意して、共有メールボックスのフォルダにドラッグアンドドロップします。

今回の場合、共有メールボックスは共有アイテム > PublicTeamに位置します。
こちらにひながたという名前のフォルダを作り、メールを格納しています。

これで下準備は整いました。

Power Automate

トリガーは、インスタント クラウドフローフローを手動でトリガーするを選択します。
コチラはボタンをクリックしたときに走るフローです。

Power Automate上では赤枠の実行をクリックするとフローが走ります。

image.png

さて、肝心な内容を解説します。

image.png

フローの内容

  1. フローを手動でトリガーする - 指定するパラメーターはありません
  2. メールを取得する (V3) Office 365 Outlook
  3. JSON の解析 Data Operation - 画像では該当するメールを取得すると記載
  4. 表内に存在する行を一覧表示 Excel Online (Business)
  5. For each - 繰り返す処理、使用する環境によってApply to eachそれぞれに適用するなど表示名が変わります
    1. メールの送信 (V2) Office 365 Outlook

幅広い方に向けて発信させていただくため、可能な限り私なりに咀嚼して細かく内容をスクリーンショットとともに記載します。

1. フローを手動でトリガーする

特に記載事項はありません。

image.png

2. メールを取得する (V3) Office 365 Outlook

  • アクションの追加もとい+をクリックし、ランタイム標準にします
  • 赤枠rgba(255,0,0,1)Office 365 Outlookを選択してください

image.png

クリックした後メールを取得する (V3)を選択してください。

image.png

下記がメールを取得するうえでの設定画面です。

image.png

複数抑えなければならない点があります。
ステップバイステップで見ていきましょう。

まず初めに、元のメールボックスのアドレス共有メールボックスのアドレスを設定することからスタートしてください。

image.png

上記の設定に応じて、後述するフォルダーの設定が変わります

  1. 件名フィルター
    • 共有メールボックスの特定のフォルダのなかで合致するメールの下書きのタイトルを書きます
    • 同名のタイトルのメールファイルは避けておきましょう
  2. フォルダー
    • 共有メールボックスの中のフォルダーを指定します
    • 赤枠のフォルダー📂マークをクリックすると、共有メールボックスのフォルダーが表示されます
      image.png
      • こちらでひながたが格納されたフォルダーを設定します
        image.png
      • この時点で共有メールボックスのフォルダーが表示されない場合は前述の設定を見直してください
  3. 未読メッセージのみを取得する
    • いいえ に設定します
    • 既定では、はいになってしまい、既読のメールが取得できない状態になっているので、必ずいいえに指定してください
  4. 元のメールボックスのアドレス
    • 共有メールボックスのアドレスを指定します
    • 前述の工程で完了しているものです
  5. 添付ファイルを含める(オプション)
    • こちらをはいに指定しておくことで、ひながたのメールに付帯した添付ファイルもまとめて配信できます

3. JSON の解析 Data Operation - 画像では該当するメールを取得すると記載

  • アクションの追加もとい+をクリックし、ランタイム組み込みにします
  • 赤枠rgba(255,0,0,1)Data Operationまたはデータ操作を選択してください
    image.png
  • この中からJSON の解析を選択します
    image.png

慣れている方にとっては不要な動作です。
また慣れていない方にとっては、もっとも首をかしげてしまう部分かもしれませんが、がんばってみていきましょう。

「2. メールを取得する (V3) Office 365 Outlook」で取得されるメールですが配列(Array)というデータ型で取得されます。
メールの件数が、0件でも1件でも100件でも同様のデータの形で返されるイメージです。

配列は複数のデータを、まとめて格納したデータの形の一種になります。

image.png

イメージ図

今回はメールファイルを複数取得しないようメールのタイトルを重複させない対策をとっていますが、この工程で取得される値は必ずvalueという複数形になるため、明示的に配列のなかの何番目のデータということを表現する必要があります。

JSON の解析Contentfxのマークをクリックし、

image.png

first(outputs('メールを取得する_(V3)')?['body/value'])

と設定します。

firstとタイプすると、候補が出てきます。
image.png

()で囲み、動的なコンテンツからbody/valueを選ぶことが手っ取り早いです。

image.png

ここでSchemaという部分があります。
これは、後ほどの工程で今回取得したデータの内容を参照するために設定しておくと便利な項目です。

image.png

サンプルのペイロードから基本的には取得しますが、このアクションでは不変の内容であるため、今回私が取得した下記の値をそのままコピペしてください。

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)*を選択してください

image.png

この中で表内に存在する行を一覧表示を選択します。

image.png

こちらはシェブロンや項目をそれぞれクリックすると、選択式で対象が選べるためわかりやすいと思います。

image.png

Excelの注意点ですが、表内に日付のデータがある場合、詳細パラメーターの設定が必要です。
DateTime 形式ISO 8601に設定してください。

image.png

4および5. 繰り返し処理 メールの送信 (V2) Office 365 Outlook

いよいよメールの送信です。

  • アクションの追加もとい+をクリックし、ランタイム標準にします
  • 赤枠rgba(255,0,0,1)Office 365 Outlookを選択してください

image.png

メールの送信 (V2)を選択します。

image.png

  • 宛先Excelで読み込んだ値を選択します。宛先をクリックし、カスタム値の入力を選択します
    • ⚡のマークをクリック
      image.png
    • 表内に存在する行を一覧表示から、該当するExcelの列名を選択します
      • 今回はMailAddressが該当します
        image.png

選択したあと、自動的にFor eachで囲まれます

image.png

データ型が複数であると、自動的に繰り返し処理の対象と判断し、フローが構成されます。
このまま設定を進めていきましょう。

件名は、計算式で文字を置き換える必要があります。
そのためreplace 関数を使います。

  1. 件名を選択、fxのマークをクリックします
  2. 置き換え式を設定します
件名
replace(body('該当するメールを取得する')?['subject'], '{Date}', formatDateTime(item()?['Date'],'yyyy/MM/dd'))

ざっくり表現すると

replace(置き換える文字が含まれる文字列全体,置き換えたい文字,置き換えた後の文字)

といった具合です。Excelとほとんど一緒ですが、字面がきついですね。
また日付型のデータは、うまい具合に2024/06/24といったyyyy/MM/ddの形では出てきてくれません。

UNIXタイムスタンプという、う""っとなるような文字で表現されるため、ここで加工をする必要があります。

さて、次は本文です。
置き換えのため、ここも計算式が必要になります。

  1. 本文を選択、fxのマークをクリックします
  2. 置き換え式を設
計算式
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')
)

()の場所で対になっていますね。
それでも難読。変数を用いることで、より簡素になりますが、実質やっていることは置き換えを繰り返している、といったイメージです。

ひながたの置き換えではなく、メールの送信指定した文字の箇所に値を置く形式のほうが、慣れないうちは楽です。

image.png

しかし今回は雛形を置き換える形式なので、計算式を用いています。

詳細パラメーターは下記を設定します。

  • 差出人
    image.png
    • 共有メールボックスを送信元に指定できます
  • 添付ファイル
    1. アレイ全体の入力に切り替えるをクリックします
      image.png
    2. こちらに計算式の指定が必要になりますfirst(outputs('メールを取得する_(V3)')?['body/value'])?['attachments']
      image.png
      • メールを取得する (V3)から添付ファイルを参照するためです
      • これにより添付ファイルの数がいくつでもまとめて添付することができます
  • 返信先
    • お好みで返信先を共有メールボックスに指定してください

こちらで完成🙌お疲れ様でした!

実行すると差し込みで一括配信が実現できます!

image.png

共有メールボックスに雛形があるため、関係者にフローを複製し、接続を変えていただくだけで使いまわせることもポイントですね。

コピーの送信で選択した方にフローを複製できます。

image.png

また管理者が実行のみユーザーに使う人を指定することでも使っていただくことができるため、オプションは複数存在します。

image.png

上記から実行専用ユーザーを設定することでも使用可能

image.png

おわりに

今回はチームメンバーにもフローを共有する前提のシナリオを書いてみました!
クラウドフローでも値の差し込みは可能です。

豊富なコネクタから値を取得できることも魅力!
計算式配列など出てきましたが、慣れればどうってことないです!

是非トライしてみてください!

3
3
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
3