《Power Automate Desktop》顧客先ExcelファイルのメールアドレスにGmail自動送信しそのログを残す（エラー対応）

### 要件

数百件の顧客先Excelリストから「メールアドレス」列の値を抜き取り、そのメールアドレス宛にGmailですべての顧客に案内メールを自動送信させたい、というリクエストがあった。これだけなら難易度は高くない。

### 懸念点

しかし、仮に自動送信ループ中に何らかのエラーで中断してしまった場合（PCの電源喪失、フリーズ、ネットワーク遮断、等々）、どの顧客まで送信できていて、どの顧客からできていないのか、それが確認できないとビジネスインパクトが大きい。従って、**後ほど送信確認できるようなログを残す**、というタスクを追加した。この部分は若干トリッキーであったため、備忘録として残す。

:::note info
準備
- 顧客先Excelファイル
- Windows上の作業フォルダ（ここでは`C:\メール送信自動化`としておく。
- 作業フォルダの中にログファイル保存用フォルダ（ここでは`C:\メール送信自動化\ログ`としておく）。

顧客先Excelファイルは次のようなものであった（下図は例です）。顧客先Excelファイルは作業フォルダ`C:\メール送信自動化`にコピーしておく。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/307441/df95a3c7-1f43-f5cc-a74a-a0ec70d8200f.png)




:::

### フロー作成手順
#### １．顧客先Excelを読み取る

##### １．１ Excelを起動
アクションメニューから「Excelの起動」をフローペインにドラッグ＆ドロップ。開いた「Excelの起動」画面で「次のドキュメントを開く」を選択し、ドキュメントパスに、作業フォルダに保存した顧客先Excelファイルを選ぶ。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/307441/e6133796-c0c2-a7e8-5f5b-53fd8f13cdc4.png)

##### １．２ ワークシートを選択
アクションメニューから「アクティブなExcelワークシートの設定」をフローペインにドラッグ＆ドロップ。開いた「アクティブなExcelワークシートの設定」画面で、ワークシート名として、顧客連絡先が入力されているワークシートの名前を入力する。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/307441/4b06d235-6590-97b0-c3e1-56f97ac67721.png)

##### １．３ ワークシートのデータの末端セルを取得
これは、ワークシート内のデータが存在する範囲を捉えるために行う。
アクションメニューから「Excelワークシートから最初の空の列や行を取得」をフローペインにドラッグ＆ドロップし、そのまま保存。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/307441/ff88d64f-ce44-0b7e-e076-555857714983.png)

これにより、最初の空の列が`%FirstFreeColumn%`となり、最初の空の行が`%FirstFreeRow%`となる。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/307441/9ff7bde0-d77f-92e3-2390-5667ce8b72f0.png)



##### １．４ Excelのデータを読み取る
アクションメニューから「Excelワークシートから読み取り」をフローペインにドラッグ＆ドロップし、取得「セル範囲の値」、先頭列「A」、先頭行「１」、最終列は「最初の空の列」である%FirstFreeColumn%から1列マイナスにした値「%FirstFreeColumn - 1%」、最終行も同様に%FirstFreeRow%から1行マイナスにした値「%FirstFreeRow - 1%」を入力。

この時、顧客先Excelは「メールアドレス、社名、担当者名」と最初の行に列名（ヘッダー）があるので、「範囲の最初の行に列名が含まれています」をオンにしておく（デフォルトでオン）。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/307441/df90753e-fca0-2f1f-01d7-c09269f588a0.png)

##### １．５ Excelを閉じる
取得したデータは変数`%ExcelData%`に格納されたのでExcelファイルは閉じてしまう。
アクションメニューから「Excelを閉じる」をフローペインにドラッグ＆ドロップ。「ドキュメントを保存しない」のまま保存。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/307441/04cf3a28-10c2-771b-61d6-8c8537cc79ed.png)

#### ２．ログを残すためのログファイル名を準備

##### ２．１ 
現在日時をログファイル名とする。例えば「2022年05月29日14時16分.txt」という具合に。
アクションメニューから「現在の日時を取得します」をフローペインにドラッグ＆ドロップ。そのまま保存。これで現在日時が変数`%CurrentDateTime%`に格納されることになる。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/307441/05461d9a-3fe9-4381-ee43-ef0068eba8c9.png)

##### ２．２ 現在日時をテキストに変換
アクションメニューから「datetimeをテキストに変換」をフローペインにドラッグ＆ドロップ。
変換するdatetimeが`%CurrentDateTime%`になっていることを確認し、カスタム形式を「yyyy年MM月dd日HH時mm分」と入力し、保存。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/307441/0a1d4b76-7d49-609d-5fd5-e479e00beeaf.png)

<br />
ここまでの完成フロー。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/307441/f68db348-1787-5e90-82b1-6fbc805c020a.png)


#### ３．For eachループを作成

アクションメニューから「For each」をフローペインにドラッグ＆ドロップ。「反復処理を行う値」として顧客先Excelから読み込んだデータが格納されている変数`%ExcelData%`を入力。保存。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/307441/a469b58d-a49c-b009-119f-88b0d52fe16f.png)

このFor eachループの中に、Gmailでの自動送信処理と、ログを残す処理を入れ込む。

#### ４．Gmailでのメール自動送信を設定

##### ４．１ Gmailのアプリパスワードを取得する。

###### ４.１.１ まず二段階認証を有効にする。

- Chrome画面の上右端にあるアイコンをクリックし、「Googleアカウントを管理」をクリック。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/307441/e40bc618-3bd7-b094-bc72-c5ab665163c0.png)

- 左ペインのメニューで「セキュリティ」をクリック。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/307441/12d3ed6d-a941-240c-de0e-485b38e460b0.png)

- 「Google へのログイン」欄にある、2段階認証プロセスをクリック。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/307441/6e3ae8bd-5b72-6df0-3e9e-a613ed42ec1f.png)

- 「使ってみる」ボタンをクリック。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/307441/4d9027ae-664d-bc56-2202-eb57dff04147.png)

- パスワードを要求されるので、入力して「次へ」ボタンをクリック。
- 「ログインの 2 つ目の手順としてスマートフォンを使用」という画面になったら、そのまま「続行」ボタンをクリック。
- 「最後にバックアップ方法を登録」画面になったら、自分のスマフォ電話番号が表示されていることを確認して（表示されていなかったら入力して）、「送信」ボタンをクリック。
- 自分のスマフォにテキストメッセージで確認コードが送られてくるので、それを入力し、「次へ」ボタンをクリック。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/307441/8e26d6d5-56e2-db7b-67e9-e38b0e45f3ae.png)

- 「有効にする」ボタンをクリック。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/307441/cd11113d-ae91-5cc6-7d24-190f27b5f2aa.png)


これで二段階認証が有効化された。


###### ４.１.２ アプリパスワードを取得する。

- 「Googleアカウントを管理」＞ 「セキュリティ」の画面に戻る。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/307441/e40bc618-3bd7-b094-bc72-c5ab665163c0.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/307441/12d3ed6d-a941-240c-de0e-485b38e460b0.png)

- 「Google へのログイン」の欄で、「アプリパスワード」をクリック。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/307441/fae4a830-45a2-e0ed-1996-81d1e61ae82c.png)

- アプリのドロップダウンリストで「メール」を選択。デバイスのドロップダウンリストで「Windowsパソコン」を選択する。「生成」ボタンをクリック。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/307441/0abba6dc-ae0d-020c-5390-17889db92349.png)

- 「Windows パソコンのアプリ パスワード」が表示されるのでコピーし保存しておく。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/307441/1778757d-fa2b-9300-3a4a-9f3be210bdf4.png)


##### ４．２ メール送信アクション設定。

- アクションメニューから「メールの送信」を選び、For eachループの中にドラッグ＆ドロップする。

- 開いた「メールの送信」設定画面で以下のように設定する。パスワードは取得したアプリパスワードである。「全般」をクリック。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/307441/532cb963-94b2-1d9f-3e14-aeca0fc3f61a.png)

- 「全般」で以下のように送信メール内容を設定する。変数`%CurrentItem%`には、Excelデータが格納されている変数`%ExcelData%`から抜いてきた1行目のデータがある。1行目のデータは「メールアドレス」「社名」「担当者名」のデータが配列として構成されている。したがって、そこからメールアドレスを抜きたかったら`%CurrentItem['メールアドレス']%`となる。担当者名を抜きたかったら`%CurrentItem['担当者名']%`となる。
- For eachループで、こうして`%ExcelData%`にある数百件のデータを1行ずつ処理していくことになる。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/307441/ef7fe96d-a70f-c638-44c5-0095958deed6.png)

- 「保存」ボタンをクリックして「メールの送信」アクションを保存する。


#### ５．ログ記録の設定

##### ５．１ ログファイルにログを追記する。

- ここがトリッキーなのだが、まだログファイルが生成されていないながらも、アクション「テキストに行を追加」を「メール送信アクション」の下にドラッグ＆ドロップ。以下のように設定。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/307441/4ba717fe-219c-4397-9c4a-32b7bcbbcea5.png)

- 追加するテキストは、“[社名]の[担当者名]様（[メールアドレス]）に送信完了”というテキストログを残したいので、`%CurrentItem['社名']%の%CurrentItem['担当者名']% 様（%CurrentItem['メールアドレス']%）に送信完了`となる。

- ここで「生成された変数」を見てほしい。「新しいテキスト」として`%Result%`変数が生成されている。つまり、`%Result%`が新規作成されるログのテキストデータとなる。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/307441/46efd386-2d00-6a68-6d05-c76c63549483.png)

- したがって、元のテキストには`%Result%`を入力する。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/307441/a197b073-3fd8-3edd-2ae6-606bec60f48b.png)

保存ボタンをクリック。

##### ５．２ テキストをファイルに書き込む。

アクション「テキストをファイルに書き込みます」をドラッグ＆ドロップで「テキストに行を追加」の下に挿入。開いた画面に下記のように設定。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/307441/98830ccc-03fa-5e93-df8f-3b0c1271768a.png)


最初に準備したログ用フォルダ`C:\メール送信自動化\ログ`に%FormattedDateTime%.txtのファイル名でログファイルを作成するため、ファイルパスは`C:\メール送信自動化\ログ\%FormattedDateTime%.txt`と入力する。

`%FormattedDateTime%`は実行したときのDateTime（現在日時）。したがって、たとえば「2022年08月08日17時58分.txt」というファイル名になる。ここもトリッキーなのだが、同名テキストファイルが無い場合は勝手に新規作成される。

「書き込むテキスト」は%Result%とする。

「新しい行を追加する」はオン。

「ファイルが存在する場合」は、存在するはずはないのでデフォルトのままで良い。


<br />

完成したFor eachループ内のフロー
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/307441/e716eff3-a195-5898-f05c-2b6d433405ef.png)



以上で完成である。

<br />

### 課題

今回のログを残す処理は、PCの電源喪失、フリーズ、ネットワーク遮断、等々物理層・ネットワーク層の問題に対する対処であった。

しかし、よりありふれた、例えば送信先顧客メールアドレスが存在しない、あるいは顧客先Excelデータのメールアドレスに全角が混じっている、などで配信不能であった場合のエラー処理はできないだろうか？

実は「メール送信」アクションにはすでに「エラー発生時」のルールを設定できる項目がある。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/307441/316dcfdb-956c-7ba0-7f13-04c0951816b6.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/307441/f37028a7-af35-8809-6833-5f51e78e4879.png)

「新しいルール」をクリックすると、「サブフローの実行」を選ぶことができる。
そこで「無効なメールアドレス」であったり「メールメッセージを送信できませんでした」の場合、メッセージを表示するサブフローを作成してみる。


#### ６．サブフローで配信不能エラー対応

##### ６．１ サブフローを作成。
- 「サブフロー」をクリックし、「新しいサブフロー」をクリック。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/307441/956bb40e-3dee-5f7c-d386-1637d95f9a55.png)

- サブフロー名を入力。サブフロー名は英数字しか受け付けない。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/307441/2e182b4d-5382-07a3-330c-702a86f3dc1a.png)

- 新しく作成したサブフローのペインに、
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/307441/8efc727e-fd9a-96d7-f915-3f4ad4baa98e.png)
「メッセージを表示」アクションをドラッグ＆ドロップ。開いた画面で次のように設定。保存。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/307441/a6477333-fa21-6646-ab20-ec25e72b1400.png)

##### ６．２ 「メールの送信」アクションにエラー処理を追加。

- Mainペインに戻り、「メールの送信」アクションを開き、「エラー発生時」ボタンをクリック。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/307441/316dcfdb-956c-7ba0-7f13-04c0951816b6.png)

- 「無効なメールアドレス」の「新しいルール」をクリックし「サブフローの実行」をクリック。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/307441/ccb80f17-cee9-c7b5-3009-2ab4d245c994.png)

- 先ほど作成したNotDeliveryErrorサブフローを選択する。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/307441/532b7279-8c3b-7d91-7662-c6cd2caa5549.png)

- 「メールメッセージを送信できませんでした」についても同様にNotDeliveryErrorサブフローを設定する。

- ここで「スローエラー」を選ぶとフローはエラー発生と同時に停止する。「フロー実行を続ける」を選ぶとエラーを吐きながらも次のアクションへ移動する。どちらにせよ、エラーメッセージは出現するはず。

- サブフローが設定されたアクションには盾アイコンが付される。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/307441/dfa30baf-c5a0-4318-b2cd-fb742a0c4360.png)


##### ６．３ スモークテスト。

- 実際に、顧客先Excelデータのメールアドレスに２バイト文字を入れてみる。
これで２回目のループで配信不能となりエラーメッセージが出るはずである。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/307441/f3277c48-0b23-9fff-1fa7-4bdef7ec8caa.png)

- これでフロー実行させたところ、エラーメッセージは出てくれず、ループは完了してしまった。:thinking::interrobang:

- 原因・解決方法・回避方法は調べたが分からない。何か情報あればご教示ください。よろしくお願いいたしますm(__)m

<br />


## 本の宣伝
### Gatsbyバージョン４>>>>改訂新版


**前編**の『Gatsby4＋Tailwind＋Gatsby Cloudでつくる～』と**後編**の『JAMStackを学ぼうGatsby4＋microCMSでつくる～』を合わせ、次のようなデモサイトを構築します。
→ **https://yah-space.work**
<hr />


静的サイトジェネレーターGatsbyの基本とnode APIの扱いについて踏み込んだ解説書。またバージョン４の新機能《**DSG（静的サイトジェネレーション**》と《**Gatsby Functions**》での問い合わせフォーム実装、**Tailwind CSS**でのレイアウト、Gatsbyと相性が良い**Gatsby Cloud**を紹介し解説しております。


<a href="https://www.amazon.co.jp/JAMStack%E3%82%92%E5%AD%A6%E3%81%BC%E3%81%86%E5%88%9D%E7%B4%9A%E7%B7%A8Gatsby-React-bootstrap-Netlify%E3%81%A7%E3%81%A4%E3%81%8F%E3%82%8B%E4%BC%81%E6%A5%AD%E3%82%B5%E3%82%A4%E3%83%88%E7%AC%AC%EF%BC%92%E7%89%88-%E3%82%82%E3%81%86%E3%83%AC%E3%83%B3%E3%82%BF%E3%83%AB%E3%82%B5%E3%83%BC%E3%83%90%E3%83%BC%E3%81%AF%E3%81%84%E3%82%89%E3%81%AA%E3%81%84-ebook/dp/B08DKQ1Q9S?__mk_ja_JP=%E3%82%AB%E3%82%BF%E3%82%AB%E3%83%8A&crid=1N4LBTLP3IIZA&keywords=Gatsby.js&qid=1659846164&s=digital-text&sprefix=gatsby.js%2Cdigital-text%2C206&sr=1-4&linkCode=li2&tag=kokkahasan-22&linkId=3bd81618c77ce73fb84ffc07fa5bfcab&language=ja_JP&ref_=as_li_ss_il" target="_blank"><img border="0" src="//ws-fe.amazon-adsystem.com/widgets/q?_encoding=UTF8&ASIN=B08DKQ1Q9S&Format=_SL160_&ID=AsinImage&MarketPlace=JP&ServiceVersion=20070822&WS=1&tag=kokkahasan-22&language=ja_JP" ></a><img src="https://ir-jp.amazon-adsystem.com/e/ir?t=kokkahasan-22&language=ja_JP&l=li2&o=9&a=B08DKQ1Q9S" width="1" height="1" border="0" alt="" style="border:none !important; margin:0px !important;" />
<a target="_blank" href="https://www.amazon.co.jp/gp/product/B08DKQ1Q9S/ref=as_li_tl?ie=UTF8&camp=247&creative=1211&creativeASIN=B08DKQ1Q9S&linkCode=as2&tag=kokkahasan-22&linkId=4cd07e4678a3580955e9569f60d7ae6f">JAMStackを学ぼう Gatsby4＋Tailwind CSS＋Gatsby Cloudでつくるコーポレートサイト ～もうレンタルサーバーはいらない～ 改訂新版 前編（書籍2,980円）</a><img src="//ir-jp.amazon-adsystem.com/e/ir?t=kokkahasan-22&l=am2&o=9&a=B08DKQ1Q9S" width="1" height="1" border="0" alt="" style="border:none !important; margin:0px !important;" />

<br />
<br />

GatsbyとmicroCMSを組み合わせてのコーポレートサイト作成手順を解説・ハンズオンした続編。待望の《**サイト内検索機能**》を《**Gatsby Functions**》と《**microCMSのqパラメータ**》で実装。
<a href="https://www.amazon.co.jp/JAMStack%E3%82%92%E5%AD%A6%E3%81%BC%E3%81%86%E4%B8%AD%E7%B4%9A%E7%B7%A8-Gatsby%E3%81%A8%E3%83%98%E3%83%83%E3%83%89%E3%83%AC%E3%82%B9CMS%E3%81%A7%E3%81%A4%E3%81%8F%E3%82%8B%E3%82%B3%E3%83%BC%E3%83%9D%E3%83%AC%E3%83%BC%E3%83%88%E3%82%B5%E3%82%A4%E3%83%88-%EF%BD%9EWordPress%E3%81%AF%E3%82%82%E3%81%86%E5%8F%A4%E3%81%84%EF%BD%9E-Atom-Yah-ebook/dp/B08KRPTW2R?__mk_ja_JP=%E3%82%AB%E3%82%BF%E3%82%AB%E3%83%8A&crid=1N4LBTLP3IIZA&keywords=Gatsby.js&qid=1659846164&s=digital-text&sprefix=gatsby.js%2Cdigital-text%2C206&sr=1-3&linkCode=li2&tag=kokkahasan-22&linkId=27cc96bef513e3619bfbe81b68ec58a6&language=ja_JP&ref_=as_li_ss_il" target="_blank"><img border="0" src="//ws-fe.amazon-adsystem.com/widgets/q?_encoding=UTF8&ASIN=B08KRPTW2R&Format=_SL160_&ID=AsinImage&MarketPlace=JP&ServiceVersion=20070822&WS=1&tag=kokkahasan-22&language=ja_JP" ></a><img src="https://ir-jp.amazon-adsystem.com/e/ir?t=kokkahasan-22&language=ja_JP&l=li2&o=9&a=B08KRPTW2R" width="1" height="1" border="0" alt="" style="border:none !important; margin:0px !important;" />
<a target="_blank" href="https://www.amazon.co.jp/gp/product/B08KRPTW2R/ref=as_li_tl?ie=UTF8&camp=247&creative=1211&creativeASIN=B08KRPTW2R&linkCode=as2&tag=kokkahasan-22&linkId=5ad235bbd59c9c43c5492687fb840791">JAMStackを学ぼう Gatsby4＋microCMSでつくるコーポレートサイト ～WordPressはもう古い～ 改訂新版 後編（書籍 2,580円）</a><img src="//ir-jp.amazon-adsystem.com/e/ir?t=kokkahasan-22&l=am2&o=9&a=B08KRPTW2R" width="1" height="1" border="0" alt="" style="border:none !important; margin:0px !important;" />




<br /><br />