PowerAutomateでマクドナルドモバイルオーダーの注文をExcelに記録する

マクドナルドでの注文はいつもモバイルオーダーを使っています。購入するとメールに通知が飛んできますが、決まったフォーマットなので、これまでどこのマクドナルドで何を注文してきたか、記録を取れたら面白いなぁとふと思いつきました。

届くメールはこんな感じ。今回は「自動化したクラウドフロー」から、以下のように「新しいメールが届いたとき」を使います。

トリガーには、実際にマクドナルドから届いているメールから、件名をコピーして貼り付けました。届いたメールの本文を「HTMLからテキスト(プレビュー)」入れるようにして保存します。最終的には「差出人」にマクドナルドのメールアドレスを入力しますが、テスト段階ではとりあえず空けておきます。

テストを手動実行すると以下のような表示が出てメールの到着を待機するようになります。都合よく注文もできないので、過去にマクドナルドから届いたメールを自分宛に転送します。(差出人にマクドナルドのメールアドレスを入れなかったのはこのためです)件名は変わってしまうと反応しなくなるので、注意です。

自分宛に転送したマクドナルドモバイルオーダーのメールい反応してフローが動作しました。メールの本文Htmlがテキストに変換されて取得できたのがわかります。

文字列から必要箇所を抜き出す

あとは、このテキストから必要な個所を抜き出します。取得したいのは以下色のついた部分です。

ご注文日時 :2022/11/17 07:43:42
受け取り番号 :T226
店舗名 :1号線守口店
住所:大阪府守口市竜田通1-33-1
[MAPのURL]

数量品目価格1ソーセージマフィンコンビ¥200
ソーセージマフィンプレミアムローストコーヒー(S)合計¥200
10%対象¥200(内消費税¥18)
8%対象¥0(内消費税¥0)

お支払い方法 :楽天ペイ
ご請求金額 :¥200

文字列から必要な個所を抜き出す方法については、こちらのブログを参考にさせていただきました。

PPログ https://powerplatformnikki.com/powerautomatesubtext/

まず、「テキストの位置の検索」をつかって、Htmlからテキストで取得した文字列から、抜き出したい箇所のキーワードを検索します。試しに「ご注文日時 :」を検索して再度テストしてみます。

先ほど一度手動でテストしているので、今回は自動を使って前回のメール受信トリガーを再利用することができます。

テストを実行すると、出力にはテキストの位置として「436」が取得できました。どうやら、長い文字列の中で「ご注文日時:」は436文字目から始まるということのようです。

では、このテキストの位置を使って、今度は「部分文字列」を使って、Htmlから取得したテキストをもとに、テキストの位置(今回は436文字目)から、適当に長さ「10」を入力して試してみました。

結果は以下の通り。「ご注文日時:」全角6文字から始まって、半角スペースを1文字として数え、続きの日付の数字3文字。ちょうど合計10文字が取得できました。サンプルの日付「2022/11/17 07:43:42」は数えると19文字ですから、少し調整すれば日時部分だけ取得できそうです。

日時部分の長さは19文字にして・・・

開始位置はadd関数をつかって7を加えます。

add(body('テキストの位置の検索'),7)

お見事!サンプルの日付「2022/11/17 07:43:42」を抜き出すことができました。

テキストの位置をまとめて集める

最初の項目については取得に成功しました。キーワードが連続でつながっていて、その間の文字列を抜き出したい場合、それぞれの項目の位置が分かっていれば、引き算をすればその間にある抜き出したい文字列の長さがわかります。

そこで、最初に各キーワードの場所を特定してしまいます。

実際に実行してみるとイメージがわきます。下の図では「受け取り番号 :」の開始位置が479で、次の「店舗名 :」の開始位置が492です。

それぞれ開始位置ですから、「受け取り番号 :」の半角を含めた8文字も引き去ると、T226 の部分の長さを出す式は、「492 – 479 – 8 = 5」になりました。実際の4文字より1文字多いのは、おそらく先頭に入っているスペースのせいかしら?これはあとでtrim関数を使って取り除けばよいでしょう。大体の長さを動的にとれることが肝心なので、細かいことは気にしなくてよいでしょう。

  • 「2022/11/17 07:43:42」の長さ = 19文字固定
  • T226の長さ = 店舗名の位置 ー 受け取り番号の位置 ー 8
  • 1号線守口店の長さ = 住所の位置 ー 店舗名の位置 ー 5
  • 大阪府守口市竜田通1-33-1の長さ = [https://maps.google.comの位置 ー 住所: ー 4
  • 1ソーセージマフィンコンビ¥200ソーセージマフィンプレミアムローストコーヒー(S)合計¥20010%対象¥200(内消費税¥18)8%対象¥0(内消費税¥0)の長さ = お支払い方法の位置 ー 数量品目価格の位置 ー 6

疲れそう・・・

そんなわけで、各文字列の抜き取りを開始位置と長さを設定したのがこちらになります。

##開始位置 
add(body('受け取り番号の位置'),8)
#長さ
sub(sub(body('店舗名の位置'),body('受け取り番号の位置')), 8)

最後に、「ご請求金額」のところですが、ここだけは次に来るキーワードがないので、ちょっと違う手法を取ります。取得する文字列の長さを少し長めにとって、最初の改行までの文字を取ろうと思います。今回は¥マーク以降の10文字を取得します。

10文字も取得したので、2行改行をして、さらにメールに記載されているメッセージの一部まで含まれています。

あらかじめ、改行を文字列として変数に入れておきます。値の中でエンターを打っておきます。見えないですが、これで改行文字が変数に入りました。

「作成」を置いて、split関数でご請求金額の文字列を「改行」文字列区切りで配列に分けます。

split(body('ご請求金額の文字列'),variables('改行'))

結果はこのように配列になります。配列の1番目(配列番号0)に金額だけが抜き出せたことがわかります。

配列の0番目なので式の最後に[0]を付けました。この状態では文字列として取得できますが、あとでExcelに書き出す際に整数に型変換すればよいでしょう。

split(body('ご請求金額の文字列'),variables('改行'))[0]

Excelへの書き出し

いよいよ書き出しです。SharePoint上にExcelファイルでテーブルを作成しました。

「表に行を追加」をつかって、指定したExcelファイルのテーブルに対して、あらかじめ用意した各文字列を当てはめるだけです。ご請求金額は文字列から整数に変換するためにint関数で加工しています。

int(outputs('ご請求金額'))

ばっちり取り込めました! これでもよいですが、各文字列はtrim関数で囲っておくと、前後の余分な空白を取り除くことができます。

trim(body('受け取り番号の文字列'))

マクドナルドモバイルオーダーから届いた別のメールも転送してチェックしましょう。

最後に、Outlookにメールが届いた時のトリガーとして、マクドナルドモバイルオーダー以外からのメールには反応しないように、「noreply@nsp.mdj.jp」のメールアドレスを差出人に加えれば完成です。