Power Automateを用いてOneDriveへのリンクを含んだメールを一斉送信する方法

#0.はじめに
この記事では，クラウドに保存されたファイルへのリンクを含むメールを一斉に送りたい，という状況を想定しています．ファイルも送り先ごとに違うような場合，ファイルごとにリンクを生成してメールの本文に貼り付ける，という作業は，メール件数が増えると煩雑です．これを，Microsoft Power Automateで片付けよう，というのがこの記事の趣旨です．

#1.Excelファイルとリンクを送りたいファイルをクラウド上に保存します
##1.0 Excelファイルを用意します
まず，メールを送りたい送り先一覧を記したテーブルを含むExcelファイルをOneDriveかSharePoint上に用意します．ID,Name,Email,Statusの列を用意しています．複数名に一緒に送りたい場合は，１行にまとめておきます．（この例だと，IDが2である行は，2人一緒にまとめて送信する，ということです．）Statusの列は，既に送信済みである場合にSentと記録するために用意しました．
![excel_to_outlook_2_1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/939665/e887ece8-66a7-97f8-582c-60339d6fd29c.png)

##1.1送りたいファイルをOneDriveかSharePointに保存します
このとき，IDと紐付いた通し番号を含むファイル名をつけておきます．

![excel_to_outlook_2_5.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/939665/fbd840f2-c893-c200-a3b1-d03e339616d9.png)

#2.Power Automateでフローを実行する
##2.0フローの全体像
大まかなの流れとしては，手動でトリガーし，Excelファイルの情報を取得し，各行ごとに，行ID番号と紐付いたOneDrive上のファイルへのリンクを取得し，Outlookからメールを送る，というものです．

##2.1手動でフローをトリガーします
空白から開始(Create from blank)でインスタントクラウドフローを選択して，フローの作成を始めます．
トリガーとしては，手動でフローをトリガーします(Manually trigger a flow)を選択します．
![excel_to_outlook_2_19.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/939665/54ff3d78-705e-d1ce-2cc7-ed7ae69c001e.png)


##2.2 変数を初期化します
送り先の名前に様などの敬称をつける，という連結操作(concat)に用いる変数を最初に宣言しておきます．
コネクタは組み込み(Built-in)にある変数(Variables)を選択し，アクションとして変数の初期化(Initialize variable)を選びます．文字列の結合のために用いるので，種類(Type)は文字列(string)を選択します．
![excel_to_outlook_2_4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/939665/d248534d-c336-ac84-5a97-db3b7ee5e9e5.png)
あとで，変数を宣言しようとすると，``The operation 'Initialize variable' can only be used at top level.``とエラーが出てしまうので，初めの段階で変数の初期化を行っておきます．

##2.3 Excelで表内に存在する行一覧を表示する
コネクタのExcelを選択し，``List rows present in a table``を選択します．
![excel_to_outook_2_7.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/939665/3383bedf-8876-7d0f-e251-5690ee0f548e.png)

詳細オプションにFilter Queryという項目があるので，`Status ne 'Sent'`と記載します．neは'not equal'の略ですね．こうすることで，Status列がSentでない行だけ一覧として取得されます．
記事[「Power Automateを使ってMicrosoft Teamsにメンバーを一括登録する方法」](https://qiita.com/anak/items/8c851226cd6564fe6366)において，既に追加済みのメンバーをaddedと記録していたのと，同じやり方です．
Google Apps Script(GAS)の[Tutorial: Sending emails from a Spreadsheet](https://developers.google.com/apps-script/articles/sending_emails)のチュートリアル記事の中で，emailSentという列を設けて，重複送信を避ける，という説明があります．本記事のこのステップは，GAS×Spreadsheetの代わりにPower Automate×Excelでも同様なことを行ってみた，ということになります．

##2.4 取得した各業に対して一連の操作を行う
次に，アクションを追加し，組み込みのコネクタの``Control``を選択し，``Apply to each``を選びます．``以前の手順から出力を選択``という項目は，動的コンテンツ一覧に表示されるExcelの``value``を選択します．つまり，ステップ2.3で取得されたStatusがSentでない各行に対して，以下のアクションを行う，ということです．
![excel_to_outlook_2_9.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/939665/a36dbe1d-7fb2-9f92-f734-6f75ec9de52f.png)


###2.4.0 OneDriveで共有用のリンクを生成する
コネクタとしてOneDrive(またはSharePoint)を選択し，共有用のリンクを生成します．リンクを生成するには，「共有リンクの作成」と「パスによる共有リンクの作成」の２種類がありますが，ここでは，``パスによる共有リンクの作成``を用います．
![excel_to_outlook_2_16.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/939665/ddaa238c-a80d-d157-8b34-777e271c5930.png)
リンクの種類は，View(閲覧専用),Edit(編集可能),Direct(ダウンロード用)から選択できます．リンクスコープはAnonymous(リンクを知っているすべてのユーザー， Anyone with the link)かOrganization（リンクを知っている組織内のユーザー, People in the organization with the link）を選択することができます．

###2.4.1本文中の宛名用に名前に「様」と読点(コンマ)を連結する
このステップは，Excelテーブル内の名前に，様とコンマを追加して，「〜様，〜様」とメール本文に記入するためのステップです．今回は，Power Automateの機能を活用してみたくて，このように書きましたが，Excel関数のCONCAT()を使って，Excelテーブル内に，様付きの名前の列を用意しておいて，メールに読み込む方が，楽なのでは，と思います．
![excel_to_outlook_2_10.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/939665/a67aeebf-bddb-0429-3c03-e2517ad8349f.png)

####2.4.1.0変数の設定
まず，Set variableで変数を設定します．Nameという変数にダイナミックコンテンツのExcelテーブル当該行のName_1という値を設定します．
![excel_to_outlook_2_11.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/939665/a289efb9-578a-6f1c-fe67-25ff322d3056.png)

####2.4.1.1文字列の連結
次に，今設定した変数と，文字列の"様"を式concatを用いて連結(concatenate)します．コネクタは組み込み(Built-in)のデータ操作(Data Opereation)を選択し，アクションは作成（compose）を用います．
![excel_to_outlook_2_12.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/939665/bc2e14c5-98d2-933d-ff78-e5455f391559.png)
コードのプレビューを見ると，以下のようになっています．コードのプレビューは３点リーダーをタップすると，選択肢に表示される，そこから確認できます．
![excel_to_outlook_2_14.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/939665/827c363c-3aaf-6d84-e559-43aa8152fd7b.png)

![excel_to_outlook_2_13.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/939665/e1a2c0a7-53c5-963f-f620-92a694552df0.png)

####2.4.1.2複数送り先がある場合
１行に送り先が２人いる場合は，２人目の名前にも様をつけます．`Condition`の`はい`，`いいえ`で分岐させ，ダイナミックコンテンツの`Name_2`が`null`(空白)に等しくないときは，Name_2と様を連結させ，`null`に等しい場合は，何もしません．

###2.4.3Outlookでメールを送信する
OutlookのSend an email(V2)を用いて，メールを送信します．宛先は，ダイナミックコンテンツのEmail_1およびEmail_2を，セミコロンで区切って並べておきます．本文`Body`ですが，名前と様を連結して得られた`Outputs`を利用します．OneDriveのファイルへのリンクも挿入しておきます．
![excel_to_outlook_2_15.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/939665/7952eec8-4f9d-9d88-2eca-43a646b0179b.png)

#3.フローを実行する
フローを保存したら，手動でトリガーしてテストしてみます．問題なくフローが実行されました．
![excel_to_outlook_2_17.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/939665/f051e46f-0c0c-879f-8cee-631040c608a8.png)

受信ボックスを見ると，OneDrive内のファイルへのリンクが挿入されたメールが届いていました．
![excel_to_outlook_2_18.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/939665/8c1f1168-22c2-52ae-db98-4f99a7c7e378.png)

#4.最後に
複数の方に，異なるファイルへのリンクをメールで送りたかったので，このフローを作成しました．Power Automateに慣れたいということで，「様」を付けるのもPower Automate内でやってみましたが，実用上はその部分はExcel内でやった方が早いと思います．