🗿

Notionデータベース上にOutlookメールを記録するPower Automateフローを作る

に公開

背景

業務の中で問い合わせメールをNotionに記録しておき、将来的にNotionAIを活用しようというお達しがあり、取り組みました。
以前、社内の掃除当番の自動通知フローをPower Automateで構築したこともあり、今回も同様に利用するのがよいと考えて構築しました。

概要

Outlookの共有メールボックスを監視し、我々サポートメンバー(ほぼ私一人)がお客様に回答したメールの内容をNotionデータベース上に自動追加するようなフローを考えます。

Power Automate以外の選択肢

Power Automate以外にもMicrosoft GraphAPIを利用することで、OutlookのAPI経由での操作が可能らしいのですが、こちらの方法はservicePrincipalの取得などが必要になるそうです。
権限のあるユーザーへの依頼等が発生するので面倒だったためあきらめました。※あまり詳しくないだけでこちらの方が楽な可能性もあります。詳しい人は教えてください。
https://learn.microsoft.com/ja-jp/graph/api/serviceprincipal-get?view=graph-rest-1.0&tabs=http

構成

フローの全体像は下記の通りです。

[トリガー]新しいメールが共用メールボックスに届いたとき

送信したメール = 送信済みアイテムに届く新規メールになります。
送信済みフォルダに新規メールが届くタイミングをトリガーとして当フローが起動します。
起動頻度は要件によりますが、私の場合はそこまで頻繁な起動が不要だったため1時間に一回起動するように設定しました。

NotionデータベースID/Notion APIキーの設定

Notion側の情報を変数として保持しておきます。

  • NotionデータベースID
    Notion上で新規にデータベース作成をした際に以下のようにURL上に表示されています。
    https://notion.so/<データベースID>/?v=...
    
  • Notion APIキー
    Notion APIインテグレーションを作成し、APIキーを取得しておく必要があります。
    これは外部アプリケーションからNotionのAPIを呼び出すための接続口を定義することと考えればよいと思います。

取得したデータベースIDとAPIキーを、Power Automate上の変数として初期化しておきます。

Htmlからテキストへの変換

Outlookメールは(おそらく既定で?)HTML形式メールになっているので、
基本的には一度HTML -> テキストへの変換をしておいた方がよいです。
※Outlook側でメール形式をHTML->テキストに変更できるので、それでも良いかもしれません。試してはいませんが。

(任意)署名前までのメール本文の取り出し

将来的にNotionAIを利用するにあたり、署名などの不要な情報は極力除いておきたいと思いました。
とても不格好で力技にはなりますが、署名で必ず使われる記号だとか文言とか文字列までで本文をトリムすることで、署名前までの必要な情報を取得できると考えました。

これの良いところは、過去のお客様の問い合わせ->我々サポート(実質私一人)の回答->お客様の問い合わせ->..以下略 の一連の情報についても、直近の回答~直近の署名前までの情報でトリミングができるので、情報の重複が防げると思いました。
私は脳筋タイプなのであまり賢いやり方ができませんでしたが、もっと良い方法はあると思いますので他の方法を推奨します。
例)そもそものメール回答時のフォーマットを定めて、特定のブロックだけを抽出できるようにするとか。もしくはHTML形式の状態で正規表現を使い、きれいにメール本文だけを抽出する方法もあるかもしれません。

2000文字を超えないように切り取る

ここで注意点ですが、Notionデータベースのテキスト列の上限は2000文字となります。もし2000文字を超える内容の回答メールをそのままNotionに登録すると、NotionAPIのエラーが返されてフローが失敗します。

このため、NotionAPIをたたく前に、事前に本文内容を2000文字を超えないように調整してあげる必要があります。


直前までで処理したメール本文の長さで判定します。


2000文字を超えてしまう場合には、先頭から2000文字までで切り取ってあげます。切り取られてしまった場合にはご愛敬といことで。。(技術的な回答によっては2000文字超える可能性はありますが、もっと簡潔に回答して差し上げろ。といったところですね。。知らんけど)

Notion APIへのリクエスト

これが最後です。
これまで処理してきた情報を使ってNotionAPIへのリクエスト作成します。

NotionAPIとしてpagesリソースへのPOSTリクエストを定義します。
リクエストヘッダーのAuthorizationに取得しておいたNotionAPIキーを設定します。


Bodyのブロックで対象のデータベースIDの情報と、実際に追加するレコードの情報を定義します。追加レコードの構成はNotion側の定義にそろえる必要があります。

  "properties": {
    "件名": { 
      "title": [
        {
          "text": {
            "content": @{triggerOutputs()?['body/subject']}
          }
        }
      ]
    },
    "本文": {
      "rich_text": [
        {
          "text": {
            "content": @{variables('MailTextBody')}
          }
        }
      ]
    }
  }

補足事項

Power AutomateにはNotionが公開するコネクタがあります。

こっちを使う方がもっとスマートな方法なのかもしれませんが、私はうまく使いこなせず脳死でNotionAPIを直接叩く方法に切り替えました。
今回の方式のような直接NotionAPIをたたく方が、何をやってるかがわかりやすいので良いと思いました。
他の業務の合間のすきを見て取り組む程度だったので、私のように物事を理解するまでに数年を要する人間には、とりあえず愚直でも理解して動かせる方法を取ればよいかなと思いました🙄。

それと今更ですが、NotionコネクタやHTTPコネクタなどには
Power Automateのpremiumプランへの加入が必要となります。
https://www.microsoft.com/ja-jp/power-platform/products/power-automate/pricing

組織内でMSの契約をしている場合にも、部署単位・チーム単位などで個別の契約が可能なようで、とりあえず一人で使うという方法も取れます。

おわりに

人生はじめてのZenn投稿となりました。

Power Automateはうまく使いこなせば多くの業務改善が図れそうなのでとても良いおもちゃだと思います。
将来的には、今回私が作った💩みたいなフローも簡単にAIが作ってくれそうで怖いです(何なら今時点でもCopilotとかで作れるのでは。。?)。

もし同じようなフローを作ろうとしてもがき苦しんでる方(なんて私くらいしかいないと思いますが)、ちょうど同じようなフローを構築しようと思っている方は参考までにご一読いただけますと幸いです。

Discussion