AlteryxでGmailにアクセスする方法

今回はAlteryxでGmailのタスクを自動化する方法について考えます。

ちなみに、単にメールを送信するだけであれば、Eメールツールなどで事足りますが、Gmailで受けたメールをAlteryxから読み込んでそのデータを使ってタスクを自動化する、というのが本記事の目的です。

ちなみに、GAS(Google Apps Script)を使えば比較的Gmailへのアクセスは簡単です(アカウントの内部でGASが動くので認証系が必要ないのが非常に楽なポイントです)。なので、GASを使ってSpreadsheetに必要な情報を書き出し、そのSpreadsheetにAlteryxから接続する、という方法も取れなくはありません(手軽にやるならこれが一番でしょうか)。ただし、GASは完全にプログラミングなので、その部分のハードルは高いです。

AlteryxからどのようにGmailにアクセスするか

基本的にはGmail APIを使ってアクセスしていきます。これを行うにあたり、参考となるマクロが公開されていました。関連記事は以下のブログです。

Download Gmail Attachments with Alteryx

ただ、こちらのブログは添付ファイルを取得することが主目的なので、ちょっと私が今回やりたいこととずれています。ただ、アクセスの方法はそのまま使えるので、こちらのマクロをベースにするのが一番かと思います(ブログを書かれた方はAlteryxを退職されており、マクロのメンテはあまり見込めません)。

このマクロの中では、認証系を通すのにクライアントID、クライアントシークレット、リフレッシュトークンを必要とします。これの入手方法は、別記事で書いているのでそちらを参照してください。

なお、認証系を通すのに「Google API: Retrieve Access Token」というマクロが使われておりこちらも以下記事からダウンロードすることができます。

OAuth Macro for Google API Authentication

実際にAlteryxからGmailに接続してみる

それでは実際にAlteryxからGmailに接続してみましょう。前提としてクライアントID、クライアントシークレット、リフレッシュトークンの取得は済ませておく前提となります。

例えば、メールの本文をダウンロードしたい場合は、基本的に以下の順番で実行していきます。

  1. 認証を通す
  2. メールを検索してヒットしたメールのIDを取得する
  3. メールのIDからメールの詳細情報をダウンロードする
  4. 必要であれば、メールの詳細情報から取得した添付ファイルIDを使って添付ファイルをダウンロードする

認証を通す

クライアントID、クライアントシークレット、リフレッシュトークンはテキスト入力ツールに入力しておき、そのままGoogle API: Retrieve Access Tokenマクロで認証を通すのが最初の作業です。

※セレクトツールは不要ですが、マクロ化する際などはテキスト入力ツールの後段においておき、データ型を固定しておくのが安全です。

テキスト入力ツールには以下のようにデータを入れています。

マクロ化する際やワークフローを配布する際、このようにデータを入れっぱなしにしておくとGmailへのアクセスがやりたい放題になるので気をつけましょう。

Google API: Retrieve Access Tokenマクロにより、その後のアクセスで利用できる認証情報(Authorizationフィールド)が得られます。

このあとのGmail APIに接続する際は、このフィールドをダウンロードツールのヘッダータブにセットします(チェックを入れる)。

メールを検索してヒットしたメールのIDを取得する

アクセスするURLについて

メールを検索するには特定のAPIに接続します。メールを検索するAPIは「Method: users.messages.list」です。基本的にクエリパラメータはすべてアクセスする際のURLに含めます(よって、bodyには何も含めません)。

検索したときに取得するメールの数はデフォルトで100ですが、maxResultsで500まで指定が可能です。超える場合はnextPageTokenが返ってくるので、Alteryxの場合は反復マクロで繰り返し処理をすれば取得が可能です。ただ、最初に検索パラメータで検索かけているのでそこで絞り込むのが良いと思います(毎日決まったメールをチェックするなら500もあれば十分なのでは?と思います)。

例えば、以下のようなURLでアクセスすれば「添付ファイルあり」で「期間は2024/2/1から2024/2/3」のメール一覧が取得できます。

https://www.googleapis.com/gmail/v1/users/me/messages?fields=messages(id)&maxResults=500&q=after:2024/2/01 before:2024/2/03 has:attachment

「q」がメールの検索パラメータで、Gmailの検索ボックスに入力するパラメータと同じになります。一度Gmailで検索してほしいメールが得られたら、そのパラメータをこちらに移植するのが良いと思います。各条件は空白区切りで複数指定できます。

他にもラベル指定(IDで指定するのでまずIDを取得しないといけないので面倒ですね・・・)のパラメータ「labelIds[]」やスパムやゴミ箱のデータを含めるかの「includeSpamTrash」なども指定可能です。

ダウンロードツールの設定は以下のような感じです。

基本設定タブ:

ヘッダー:

ペイロード:

何も設定しません。デフォルト値です(HTTPアクションはGETです)

接続:

何も設定しません。デフォルト値です。

ワークフローとしては以下のようになります。

これにより、messageIDが取得できます。

メールのIDからメールの詳細情報をダウンロードする

メールのmessage IDが取得できれば、ようやく各メールに対してアクセスすることができます。このmessage IDを使ってメールの削除やラベルの変更、詳細の取得ができるようになります。

メールの詳細情報を取得するAPIは「Method: users.messages.get」です。

例えば、以下のようなURLで特定のメールの詳細情報を取得できます。

https://www.googleapis.com/gmail/v1/users/me/messages/18d66de44061df7a

一番最後についているのが、message IDです。各メールに対してそれぞれmessage IDが割り振られているため、取得するメールの数だけAPIにアクセスする必要があります。

APIへのアクセスは、上のアクセスURLと認証情報のみとなるため、ダウンロードツールの設定は、先程の設定と同じため割愛します。

ワークフローとしては以下のとおりです。

問題はここからです。ここまででメールの情報がダウンロードできたので、JSONをパースしていくだけです。ただし、かなり複雑な構造になっています。

ここではあまり細かい詳細については述べませんが、ポイントとしては以下の形になります。

  • ヘッダー部分が非常に多いため(ほとんど不要)、必要なヘッダーのみに絞る必要があります。私がテスト的に使ったのは、「Date」「From」「Subject」「To」「CC」でした
  • snippetはメール本文の一部が格納されていますが、全てではありません。ただし、そのまま読める形で格納されているので本文のエンコードの際に参考になると思います
  • internalDateがGoogleのサーバーがメールを受信した時刻のため、これが一番正確なようです(ヘッダー部分にもDateがありますが、表記が安定していないのでパースする際は要注意)
  • 本文もHTMLタイプのものは、プレーンテキストとHTMLと2つの本文が存在するので注意です(その分ワークフローが複雑になります)
  • 本文はBase64エンコードされているのでそのままでは読めません。Blob変換ツールで「フィールドがBase64エンコードバイナリデータ」としてBlobに変換後、再度Blob変換ツールで「BLOBはあるコードページでエンコードされたテキスト」としてUTF-8に変換する必要があります。Alteryxが関数でBase64デコードを持っていないためこのようなことを行う必要があります。また、そのままBase64デコードはできません。URL SafeなBase64エンコードがされているため、「-」を「+」、「_」を「/」にリプレイスしてからデコードしていきます。

ワークフローは以下のとおりです。

必要であれば、メールの詳細情報から取得した添付ファイルIDを使って添付ファイルをダウンロードする

最後は添付ファイルのダウンロードを行いましょう。だいたいメールの自動化といえば、添付ファイルをどこかに保存しておきたい、というタスクは日常的にあるかと思います。

メールの添付ファイルを取得するAPIは「Method: users.messages.attachments.get」です。

https://www.googleapis.com/gmail/v1/users/me/messages/18d66de44061df7a/attachments/ANGjdJ9ykGS....

赤い部分は該当のメールのmessage IDで、青い部分はメール詳細から取得できるattachments IDです。非常に長いIDです(はじめ見た時は何か特別なエンコードされている文字列かと思いました)。

取得できたファイルもメール本文同様URL safe Base64エンコードされているため、「-」を「+」、「_」を「/」にリプレイスしてからBlob変換ツールでBlobに変換を行います。

なお、添付されたときのファイル名が必要な場合は、メール詳細情報から紐づけてあげる必要があります。

ワークフローとしては以下の通りとなります。

なお、添付ファイルは複数ある可能性があるため、メール本文とは別のデータのまま持っておきましょう。

まとめ

  • AlteryxでGmailAPIを使ってメールを取得する方法を紹介しました
  • GmailAPIは、認証→メール一覧取得(message ID取得)→メール詳細取得→添付ファイル取得というステップで利用していきます
  • 認証系は既存のマクロ「Google API: Retrieve Access Token」を利用しました
  • GmailAPIは様々な機能があるため、例えば自動化に使ったメールは既読にするなど行えばさらに便利に使うことができます
  • なお、今回行った処理だけであれば権限のスコープを「https://www.googleapis.com/auth/gmail.readonly」で行うことができるため、「https://mail.google.com/」などをスコープにしていた場合、スコープの見直しを行った方が良いかもしれません

サンプルワークフローダウンロード

  • 利用する場合は、クライアントID、クライアントシークレット、リフレッシュトークンを必要とします。これの入手方法は、別記事で書いているのでそちらを参照してください。これらは「
  • 上記の「クライアントID、クライアントシークレット、リフレッシュトークン」は取り扱いに十分に注意してください
  • 検索用パラメータも入力して使ってください

参考URL

Gmail APIのドキュメントです。

「Google API: Retrieve Access Token」のダウンロードが可能です。

今回はここの記事がベースになっています(Gmail APIの使い方について非常に参考になりました)。ネットで検索できるサンプルとしてPythonなどの言語を使っている場合、生のAPIではなくライブラリを使っているケースが多いのであまりAlteryxから使う場合は参考になりません。

コメント

タイトルとURLをコピーしました