はじめに
Power Automateを使っていると、何気にOutlookのメール本文をPDFにできないという壁に当たります。
本文HTML
からOneDrive for Businessのファイルの変換
アクションで変換を試みるも日本という狭い島国のコトバが混じるとNGが・・・。
スクリプトによる解決になりそうですが、今回は趣向を変えて、
Power Appsで無理やり何とかできないか チャレンジしてみました。
Power Appsでメールを抽出する
Power Appsでメールの情報を取得するには、
Office 365 Outlook
コネクタを活用します。
使用方法は、Power Automateと同様です。
メソッドの使い方で戸惑いますが、ざっとこのような内容になります。
Office365Outlook.GetEmailsV3({fetchOnlyUnread:false}).value
基本的な式の部分にfetchOnlyUnread
を追加した理由は、
このパラメーターがデフォルトではtrue
であり、
未読のメッセージしか取得できない状態になっているからです。
また取得できるメールも最大25件と大量のメールを
データソースにした処理には向かない印象を受けます。
{
"cc": "セミコロンで区切られた CC の受信者の電子メール アドレス",
"toOrCc": "セミコロンで区切られた送信先または CC の受信者の電子メール アドレス",
"importance": "重要度",
"fetchOnlyWithAttachment": "添付ファイルがある場合のみ",
"subjectFilter": "件名フィルター",
"folderPath": "電子メールを取得するメール フォルダー",
"fetchOnlyUnread": "未読のメッセージのみ取り込む",
"includeAttachments": "添付ファイルを含む",
"searchQuery": "検索クエリ",
"top": "取得するメールの件数 (既定: 10, 最大: 25)。"
}
GetEmailsV3では以下の値を取得できます。
{
"id": "メッセージID",
"receivedDateTime": "受信日時",
"hasAttachments": "添付ファイルの有無",
"internetMessageId": "インターネットID",
"subject": "メールタイトル",
"bodyPreview": "本文のプレビュー",
"importance": "重要度",
"conversationId": "会話ID",
"isRead": "未読/既読",
"isHtml": "HTMLかどうか",
"body": "HTMLのボディ",
"from": "FROM",
"toRecipients": "受信者",
"attachments": ["添付ファイル"]
}
Outlook 365 コネクタで取得できるメールの値の例
今回注目するのはbody
です。
メール本文、 HTMLテキスト になります。
Power Appsを使って、HTMLテキストをコンテナー
に格納し、
コンテナー
を引数にして、PDF化を試みます。
ここで活躍するものがPDF関数
です。
プレビュー機能ですが、アーリーアダプターが沢山いらっしゃいますので、検索すると多くの記事がヒットします。
設定から近日公開の機能でPDF関数を有効にしてください。
今回もこちらの方の記事を参考にさせていただきました。
PDF関数を使うことにより、HTML > PDFの変換が非常に楽になることがメリットです。
しかし使い方にもクセがあり、引数をコントロール
やコンテナー
、
スクリーン
を対象にする機能であるため、活用するには研究がまだまだ必要です。
1. アプリの画面のサイズを変更する
コンテナー
で見切れている部分は、PDF関数を使っても見切れてしまいます。
邪道ですが、アプリ自体の縦幅を長くし、対応できるメールの幅を広げます。
設定 > 表示からアプリケーションのサイズを設定します。
16:10でも十分な領域がもてますが、少し足りない。
邪道 OF 邪道です。
調べれば、マシな解決策が出ると思いますので、調査してみてください
※私もします
2. Power Automate フローを構築する
Power Automateは至って簡単です。
ファイルとしてPower Automateに値を渡し、
目的の場所にファイルの作成
で対処するだけでPDFが生成されます。
メールで参照できていた画像は、PDF化する中で参照できなくなります。
実際にOutlookで見ていたものと乖離がでるのは仕方がないと思うところです。
Advance - 一括処理をする
ここまででは、単なるPDF関数の説明に過ぎないので、
Outlook 365 コネクタ で取得したメールを全てPDF化するという、
ゴリゴリの力業を残しておきます。
課題有りの方法ですので、こういう方法で一応何とか繰り返しができるのね
くらいで考えてください。
流れ
-
ギャラリーコントロールのデータソースを、変数を使って動的にする
- PDF化するメールだけ表示する
-
繰り返し処理のために下記を設ける
- 変数を初期化するためのボタン or アイコン
- 繰り返しを制御するための
スライダー
コントロール - 遅延処理を用いるための
タイマー
コントロール
-
繰り返し処理を実装する
- ボタンを押して変数を初期化する
- ギャラリーコントロールでN番目のメールを表示する
- 付随してコンテナー内のHTMLテキストも変更される
-
スライダー
コントロールのOnChange
で- Power Automateを起動
- タイマーを初期化
-
タイマー
コントロールで遅延処理- HTMLテキストの表示とPower Automateの起動が同期的ではないため
- インクリメントをして
スライダー
コントロールのOnChange
を再発火
確実にビジネス向けではないですね。
- 同期・非同期の問題も解決していません。
- カイゼンの余地が大ありです。
変数
必要なのはタイマー
コントロールをリセットする変数と、
インクリメント用の数値だけです。
UpdateContext({_start:false});
UpdateContext({_start:true});
UpdateContext({num:1});
コントロール
**動的にメールの表示を変更させるためのギャラリー
First(LastN(Office365Outlook.GetEmailsV3({fetchOnlyUnread:false}).value, num))
ボタンであるPDFアイコン
UpdateContext({num:1});
繰り返し処理を無理やり実行するためのスライダー
num
'Power Automateのフロー'.Run({file:{name:galMails.Selected.subject & "_" & num & "_.pdf", contentBytes: PDF(印刷するコンテナ)}});
Reset(タイマーコントロール);
UpdateContext({_start:false});
UpdateContext({_start:true});
タイマー コントロール
非表示にしています。
3000
※3秒遅延処理
3000
If(num < 11,UpdateContext({num:num + 1}));
10回繰り返す用
_start
_start
リセットしてタイマーを起動する用
最後に
ネタとして載せていますが、こんな業務・・・ない方がいいよね!
それでは良いPower Lifeを!