見出し画像

Tableauでタグ付きダッシュボードをPDFに自動変換し、Slackにアップロードする方法



こんにちは、Tableauユーザーの皆さん。ダッシュボードのエクスポートと共有は、多くのチームにとって重要なタスクです。特に、データに基づいた意思決定を行うためには、最新のダッシュボードを常に確認できることが求められます。今回は、指定のタグが付いたTableauダッシュボードをPDFとしてエクスポートし、Slackに自動でアップロードするPythonスクリプトをご紹介します。このスクリプトを使うことで、Tableauユーザーだけでなく、チームメンバーや関係者も簡単にダッシュボードを確認できるようになります。

問題背景

データに基づいた意思決定は、現代のビジネスにおいて極めて重要です。しかし、最新のダッシュボードを常に確認し、チーム全体で共有することは容易ではありません。特に、以下のような課題が存在します:

  • 手動のダッシュボードエクスポート:毎回手動でダッシュボードをエクスポートし、関係者に配布するのは手間がかかります。

  • 情報の遅延:手動での共有では、最新のデータがチームに届くまでにタイムラグが発生します。

  • 一貫性の欠如:異なる形式や方法で共有される情報は、一貫性に欠け、混乱を招くことがあります。

ユースケース

このスクリプトは、さまざまなユースケースで活用できます。以下にいくつかの具体的な例を挙げます。

ユースケース1: 定期的なレポート共有

週次や月次の定期レポートとして、指定されたタグが付いた最新のダッシュボードをPDF形式でチーム全体に自動的に共有できます。これにより、関係者は最新のデータに基づいて迅速に意思決定を行うことができます。

ユースケース 2: プロジェクトの進捗確認

プロジェクトごとにタグを設定し、進捗状況を示すダッシュボードを自動的にSlackにアップロードすることで、プロジェクトチームが最新の状況を簡単に把握できます。

ユースケース3: パフォーマンス監視

業績やKPIを監視するためのダッシュボードを定期的に共有することで、マネージャーやエグゼクティブがパフォーマンスを確認できるようになります。

ユースケース 4: 部署間の情報共有

異なる部署間で必要なダッシュボードを共有することで、情報の透明性を高め、全体的な効率を向上させることができます。

必要な環境

  1. Tableau Server または Tableau Online アカウント

  2. API トークンの生成

  3. Python 環境

  4. Tableau Server Client ライブラリのインストール

  5. SlackワークスペースとBotトークン

事前準備

1. Slack Bot Tokenの取得

  1. Slack Appの作成:

    • Slack API: Applications にアクセスし、新しいアプリを作成します。

    • 右上の「Create New App」ボタンをクリックします。

  2. アプリケーションの設定:

    • 「From scratch」を選択します。

    • アプリケーションの名前を入力し、アプリケーションをインストールするワークスペースを選択します。

    • 「Create App」をクリックします。

  3. Botユーザーの作成:

    • アプリケーションの設定ページで、「OAuth & Permissions」タブをクリックします。

    • 「Scopes」セクションで、「Bot Token Scopes」に以下の権限を追加します:

      • `files:write`(ファイルのアップロード)

      • `chat:write`(メッセージの投稿)

  4. Bot Tokenの取得:

    • 「OAuth Tokens for Your Workspace」セクションで、「Install App to Workspace」をクリックします。

    • ワークスペースにアプリケーションをインストールするための権限を承認します。

    • インストールが完了すると、「OAuth Tokens for Your Workspace」セクションに「Bot User OAuth Token」が表示されます。このトークンを使用して、スクリプトで認証を行います。

  5. Botをチャンネルに追加:

    • Slackアプリで、対象のチャンネルを開きます。

    • チャンネルのメッセージ入力フィールドで `/invite @your-bot-name` と入力してエンターキーを押します。

2. Tableau Personal Access Tokenの取得

  1. Tableau ServerまたはTableau Cloudにログイン:

    • Tableau ServerまたはTableau Cloudの設定で、Personal Access Tokenを作成します。

    • トークンの名前と生成されたトークンをメモしておきます。

スクリプトの準備

以下のファイルを用意します。

`config.json`

{
  "tableau": {
    "server_url": "your_tableau_server_or_cloud_url",
    "personal_access_token_name": "your_personal_access_token_name",
    "personal_access_token": "your_personal_access_token",
    "site_id": "your_site_id"
  },
  "slack": {
    "slack_bot_token": "your_slack_bot_token",
    "slack_channel_id": "your_slack_channel_id"
  }
}

`main.py`

import tableauserverclient as TSC
from datetime import datetime
from slack_sdk import WebClient
from slack_sdk.errors import SlackApiError
import json
import os

# JSONファイルから設定情報を読み込む関数
def load_config(config_file='config.json'):
    with open(config_file, 'r') as f:
        config = json.load(f)
    return config

# Tableauからタグ付きダッシュボードをPDFとしてエクスポートする関数
def export_dashboards_to_pdf(server, tag):
    with server.auth.sign_in(server_auth):
        req_option = TSC.RequestOptions()
        req_option.filter.add(TSC.Filter(TSC.RequestOptions.Field.Tags, TSC.RequestOptions.Operator.Equals, tag))
        all_views, pagination_item = server.views.get(req_option)

        pdf_files = []
        for view in all_views:
            try:
                server.views.populate_pdf(view)
                pdf = view.pdf
                file_name = f"{view.name}_{datetime.now().strftime('%Y%m%d%H%M%S')}.pdf"
                with open(file_name, 'wb') as f:
                    f.write(pdf)
                pdf_files.append(file_name)
            except TSC.ServerResponseError as e:
                print(f"Failed to export view {view.name}: {e}")
        return pdf_files

# Slackにファイルをアップロードする関数
def upload_files_to_slack(slack_client, channel_id, files):
    for file in files:
        try:
            response = slack_client.files_upload_v2(
                channel=channel_id,
                file=file,
                filename=os.path.basename(file),
                title=os.path.basename(file)
            )
        except SlackApiError as e:
            print(f"Error uploading {file} to Slack: {e.response['error']}")

if __name__ == "__main__":
    config = load_config()

    tableau_config = config['tableau']
    slack_config = config['slack']

    server = TSC.Server(tableau_config['server_url'], use_server_version=True)
    server_auth = TSC.PersonalAccessTokenAuth(
        tableau_config['personal_access_token_name'],
        tableau_config['personal_access_token'],
        tableau_config['site_id']
    )

    slack_client = WebClient(token=slack_config['slack_bot_token'])
    slack_channel_id = slack_config['slack_channel_id']
    tag = "pdf"  # 対象のタグを指定

    print(f"Starting dashboard export and upload at {datetime.now()}")
    pdf_files = export_dashboards_to_pdf(server, tag)
    upload_files_to_slack(slack_client, slack_channel_id, pdf_files)
    print("Completed dashboard export and upload.")

実行方法

以下のコマンドを実行して必要なライブラリをインストールし、スクリプトを実行します:

pip install tableauserverclient slack_sdk
python main.py

slack通知イメージ

スクリプトの説明

  1. 設定情報の読み込み:

    • `config.json` ファイルからTableauとSlackの設定情報を読み込みます。

  2. ダッシュボードのエクスポート:

    • 指定されたタグが設定されたダッシュボードをPDFとしてエクスポートします。

  3. ファイルのアップロード:

    • エクスポートしたPDFファイルを指定されたSlackチャンネルにアップロードします。

注意事項

1. SSL証明書のインストール

SlackにPDFファイルをアップロードする際、PythonのSSL証明書が必要です。特にmacOSユーザーは、Pythonの公式インストールに含まれている以下のコマンドを実行してSSL証明書をインストールしてください:

/Applications/Python\ 3.x/Install\ Certificates.command

2. チャンネルIDの確認

SlackチャンネルのIDを確認し、正しいチャンネルIDをconfig.jsonに記載してください。チャンネルIDは、SlackのチャンネルURLの末尾に表示される「C」で始まる文字列です。

3. Botのチャンネル参加

Botが対象のSlackチャンネルに参加していることを確認してください。参加していない場合、/invite @your-bot-nameコマンドを使用してBotをチャンネルに招待します。

実際のソースコード

ソースコードはGitHubリポジトリに公開されています。詳しくは以下のリンクからご確認ください:

まとめ

このスクリプトを使うことで、Tableauのダッシュボードを効率的に管理し、Slackを使ってチーム全体で簡単に共有できます。これにより、Tableauユーザーだけでなく、ダッシュボードを確認したいすべてのチームメンバーが最新のデータにアクセスできるようになります。自動化により、手動での作業を減らし、作業効率を向上させましょう。

この記事が気に入ったらサポートをしてみませんか?