LoginSignup
1
1

はじめに

Power Automateを使っていると、何気にOutlookのメール本文をPDFにできないという壁に当たります。
本文HTMLからOneDrive for Businessのファイルの変換アクションで変換を試みるも日本という狭い島国のコトバが混じるとNGが・・・。

スクリプトによる解決になりそうですが、今回は趣向を変えて、
Power Appsで無理やり何とかできないか チャレンジしてみました。

movie.gif

Power Appsでメールを抽出する

Power Appsでメールの情報を取得するには、
Office 365 Outlookコネクタを活用します。

image.png

使用方法は、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関数です。

プレビュー機能ですが、アーリーアダプターが沢山いらっしゃいますので、検索すると多くの記事がヒットします。

image.png

設定から近日公開の機能でPDF関数を有効にしてください。

今回もこちらの方の記事を参考にさせていただきました。

PDF関数を使うことにより、HTML > PDFの変換が非常に楽になることがメリットです。

しかし使い方にもクセがあり、引数をコントロールコンテナー
スクリーンを対象にする機能であるため、活用するには研究がまだまだ必要です。

1. アプリの画面のサイズを変更する

コンテナーで見切れている部分は、PDF関数を使っても見切れてしまいます。
邪道ですが、アプリ自体の縦幅を長くし、対応できるメールの幅を広げます。

image.png

設定 > 表示からアプリケーションのサイズを設定します。
16:10でも十分な領域がもてますが、少し足りない。

邪道 OF 邪道です。
調べれば、マシな解決策が出ると思いますので、調査してみてください
※私もします

2. Power Automate フローを構築する

Power Automateは至って簡単です。
ファイルとしてPower Automateに値を渡し、
目的の場所にファイルの作成で対処するだけでPDFが生成されます。

image.png

メールで参照できていた画像は、PDF化する中で参照できなくなります。
実際にOutlookで見ていたものと乖離がでるのは仕方がないと思うところです。

Advance - 一括処理をする

ここまででは、単なるPDF関数の説明に過ぎないので、
Outlook 365 コネクタ で取得したメールを全てPDF化するという、
ゴリゴリの力業を残しておきます。

課題有りの方法ですので、こういう方法で一応何とか繰り返しができるのね
くらいで考えてください。

流れ

  1. ギャラリーコントロールのデータソースを、変数を使って動的にする
    • PDF化するメールだけ表示する
  2. 繰り返し処理のために下記を設ける
    • 変数を初期化するためのボタン or アイコン
    • 繰り返しを制御するためのスライダーコントロール
    • 遅延処理を用いるためのタイマーコントロール
  3. 繰り返し処理を実装する
    1. ボタンを押して変数を初期化する
    2. ギャラリーコントロールでN番目のメールを表示する
      1. 付随してコンテナー内のHTMLテキストも変更される
    3. スライダーコントロールのOnChange
      1. Power Automateを起動
      2. タイマーを初期化
    4. タイマーコントロールで遅延処理
      • HTMLテキストの表示とPower Automateの起動が同期的ではないため
      • インクリメントをしてスライダーコントロールのOnChangeを再発火

確実にビジネス向けではないですね。

  • 同期・非同期の問題も解決していません。
  • カイゼンの余地が大ありです。

変数

必要なのはタイマーコントロールをリセットする変数と、
インクリメント用の数値だけです。

タイマーコントロールリセット用 スライダーのOnChangeに設定する
UpdateContext({_start:false});
UpdateContext({_start:true});
インクリメント用 繰り返し処理実行ボタンに設定する
UpdateContext({num:1});

コントロール

**動的にメールの表示を変更させるためのギャラリー

image.png

Items
First(LastN(Office365Outlook.GetEmailsV3({fetchOnlyUnread:false}).value, num))

ボタンであるPDFアイコン

image.png

OnStart
UpdateContext({num:1});

繰り返し処理を無理やり実行するためのスライダー

image.png

Default
num
OnChange
'Power Automateのフロー'.Run({file:{name:galMails.Selected.subject & "_" & num & "_.pdf", contentBytes: PDF(印刷するコンテナ)}});
Reset(タイマーコントロール);
UpdateContext({_start:false});
UpdateContext({_start:true});

タイマー コントロール
非表示にしています。

image.png

Duration
3000

※3秒遅延処理

Duration
3000
OnTimerEnd
If(num < 11,UpdateContext({num:num + 1}));

10回繰り返す用

AutoStart
_start
Start
_start

リセットしてタイマーを起動する用

最後に

ネタとして載せていますが、こんな業務・・・ない方がいいよね!
それでは良いPower Lifeを!

1
1
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
1
1