Power AutomateでHTMLをPDFに変換したい〜請求処理を自動化したいだけなんだ

いろいろなサービスを使っていると、毎月請求書がわんさか送られてきます。
送られてくる請求書を元に、お客様へ保守費用など諸々と合わせて請求をすることになるんですが、
例えばこんな感じで送られてくる中身がバラバラなんです。
1. メールにPDFが添付されているもの
2. トークン付きのURLが送られてくるもの
3. 請求確認画面へのログインを促してくるもの

色々あるわけですが、2.のパターンが中途半端。
トークン付きURLでもそのさきがPDFだったりするといいんですが、HTMLなサービスもありまして、こいつをなんとかしたい。

そんなわけで、
1. メールが届いたら記載されたURLにアクセスして
1. HTMLを取得し
1. PDFに変換して
1. Teamsに請求書が届いたことを通知

をやってみようと思います。

# メールが届いたら記載されたURLにアクセス
## トリガー設定
「Office 365 Outlook」コネクタの「新しいメールが届いたとき (V3)」トリガーを使います。
この時、「差出人」と「件名フィルター」を設定して、処理対象のメールを絞り込んでおきます。

![mail_receive.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/72763/b97216c2-6620-12df-5c51-a9bd2527e01a.png)

これで、メールが届いたときに処理が走るようになりました。

## 変数準備
続いて、ファイル名を作ったり、メールからURLを抜き出したり。

「現在日」これはそのまま、ファイル名に処理日を入れたいので現在日を取得します。
使いまわしたいので変数にしておきます。
「URL」これはメール本文から抜き出したURLを・・・なんとなく変数にしておきます。
「ファイル名」これは保存する際のファイル名やら、変換後のファイル名やらに使いまわしたいので、拡張子は除いて変数にしておきます。

![var.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/72763/60b27a5e-8f3e-8d8a-e84e-f923f302794d.png)

それぞれの中身は
* 現在日
    * formatDateTime(getFutureTime(9, 'Hour'), 'yyyy-MM-dd')
* URL
    * split(split(triggerOutputs()?['body/body'], 'お早めにダウンロードを行ってください。')[1],' ')[0]
        * メール本文からURL直前の文字列と、URL直後の文字列で区切ってURL部分を抜き出しました
* ファイル名
    * split(triggerOutputs()?['body/toRecipients'], '-')[0]
        * メールアドレスをプロジェクトごとに分けていて、先頭にプロジェクトの略称が入るようになっているのでこの先頭部分を抜き出して使っています

## URLからファイルを取得して保存
「OneDrive for Business」コネクタの「URL からのファイルのアップロード」アクションを利用します。
注）ビジネスではない「OneDrive」にも同じアクションがあるようなのでそちらを使っても変わらないとは思います。

![get.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/72763/fb4f8279-9ad9-0842-d7ec-d295d9161b6b.png)

## PDFに変換
ここで、本日の見せ場、PDFへの変換！
URLからファイル取得した時と同じOneDriveのコネクタから「パスを使用したファイルの変換（プレビュー）」アクションを利用します。
このアクション、OneDriveのコンテキストメニューから実行できる「自動化」＞「ファイルをPDFとしてコピーする」の中身でも使われていました。

![convert.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/72763/cc2bf2fc-9ec3-818e-75ad-a3153b476bfb.png)

## 変換したファイルを保存
変換が完了しただけだと、それはまだテンポラリでしかないのでファイルとして保存します。
同じくOneDriveコネクタの「ファイルの作成」アクションを利用します。
「ファイルコンテンツ」には先に変換した結果の「ファイルコンテンツ」を設定します。

![create.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/72763/e2e84a44-69cd-aa8a-e4f4-2013cbb4ce43.png)

ここで、OneDriveではなくSharepointへ配置することもできます。
ただし、URLからファイルを直接取得するのはOneDriveでしかできないようなので、いきなりSharepointに配置はできないもよう。

![sharepoint.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/72763/b9051627-129e-b410-65e4-01a6f33c3533.png)


## Teamsに通知
最後に、Teamsに請求書が届いたことを通知します。

![teams.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/72763/9fb9b1a2-1cc1-3776-3869-65b2bb1bc1c1.png)

# めでたしめでたし〜とはならず
## PDF変換に失敗する
トリガーの発信元を自分のメールアドレスに変更してテストをしてみたところ、エラーが起きました。
PDFへの変換時に失敗しているようです。

```
{
  "status": 406,
  "message": "このファイルを PDF に変換することはできません。 (Sandbox_HtmlTransform_LanguageNotSupported / An exception occurred while executing within the Sandbox)",
  "source": "api.connectorp.svc.ms"
}
```

なんでや、なんで失敗するんやーーー
レスポンスにちゃんと「LanguageNotSupported」ってありますね。
実はちゃんとエラーメッセージを確認せずに、なんか他に方法あるんかなとか思って調べたら、参考記事に記載した記事に出会いまして。。。
はい、日本語入ってます。むしろHTMLの中身ほとんど日本語です！

この時、OneDriveのコンテキストメニューからPDFへの変換ができるのを見つけて試したんですが、あれクリックするとPowerAutomateのフローが自動で作られて、同じアクションが動く。。。その結果、やっぱり失敗したよっていう通知がでてきました。
くそーーー

詰んだ。
完全に詰みました。

### 解決
幸いなことに、PREMIUMコネクタが使える環境なのでとりあえず「PDF」って検索してみたところ、なんか良さげなのが！
「Adobe PDFサービス」もしかしてこれでいけるんじゃない？

![pdf_filter.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/72763/3fbd20d0-ce2a-70f7-c562-2ff7be4d9a35.png)

ズバリ！な感じのアクションがありました「ドキュメントをPDFに変換」。これでいけます！
やったーーー
![pdf.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/72763/d6dc1536-1130-4d0d-4201-3a51c85afff5.png)

と、思ったんですが。。。出ました、認証。
そりゃそうですよね。無条件/無料なわけ無いよね。

![pdf_connection.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/72763/0356ac72-d05d-e086-d163-788d5c7748ec.png)

とりあえず、記載されてるURLにアクセスしておいくらほどなのか見てみようと思います。

https://www.adobe.com/go/getstarted_powerautomate
![not_supported.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/72763/3638d857-20ca-01ae-023e-34bba085b732.png)

あれ？「Free Tier」ってことは、無料お試しができそう！
ただし、このライセンスだとダメなんで別の個人アカウント作ってねってありますね。
今ログインしているアカウント、会社から貸与されているXd使えるやつ。なるほど、専用アカウントを作ってみよう。
ってことで「Personal Account」ってところにジャンプ！
https://helpx.adobe.com/in/enterprise/using/identity.html
してもよくわからんかった（笑）
なので、Adobe Developerのサイトから「PDF Services API」のページへ。
https://developer.adobe.com/document-services/apis/pdf-services/
あちこち「Start for free」って書いてある！！
これ押す前に、ヘッダにある「Pricing」をポチッとしてお値段など確認。

![price.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/72763/570b38f3-1f81-8b3c-5479-cb296793ab4d.png)

！！！！！
まじか、1月500ドキュメントまで無料で使わせてくれるのかよ、最高かよ。
```
Free Tier
500 free Document Transactions per month
```

ということで、サクッとアカウント作成して再び
https://www.adobe.com/go/getstarted_powerautomate
へアクセス。
すると、Credential作成の画面になりました。

![create_credential.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/72763/3166107e-0b06-216d-bb82-ca85b3fc615f.png)
ポチポチと必要事項を入力してClient IDとClient Secretを発行したら、Power Automateに戻って、この取得した値を入力して、接続の作成を完了させます。

接続が作成できると、アクションが使えるようになるのでファイル名やらを設定しますが、「ファイルコンテンツ」を設定しないといけない。
なので、まずはOneDriveのコネクタにある「パスによるファイルコンテンツの取得」アクションを使ってファイルの中身を取得します。
取得したファイルの中身を「ドキュメントをPDFに変換」アクションの「ファイルコンテンツ」に設定して変換処理は無事完了。

![doc_to_pdf.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/72763/10e88da2-67c6-cb06-d3de-8f82aba04c89.png)

ここでもファイルはまだテンポラリ扱いなので、OneDriveなりSharepointなりのコネクタで「ファイルの作成」アクションを利用して保存してあげます。

無事完成しました。
Microsoftももちろんですけど、Adobeさんも太っ腹なfree tier用意してくれてて大変助かりました。
これでまたひとつ手作業が減りました。

追伸：金額抜き出ししないと、請求金額わからねー
という罠が待っていました（笑）

# 参考にした記事
https://qiita.com/ks4050kt/items/c9a1798c945ae025ae5c