今回は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、クライアントシークレット、リフレッシュトークンの取得は済ませておく前提となります。
例えば、メールの本文をダウンロードしたい場合は、基本的に以下の順番で実行していきます。
- 認証を通す
- メールを検索してヒットしたメールのIDを取得する
- メールのIDからメールの詳細情報をダウンロードする
- 必要であれば、メールの詳細情報から取得した添付ファイル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から使う場合は参考になりません。
コメント