インテージテクノスフィア技術ブログ

株式会社インテージテクノスフィアの社員達がシステム開発や仕事に関する技術情報を随時掲載いたします

【Tableau】Webアプリに組み込んでみた - Tabeau JS API -

こんにちは、アイダです。AI・DXビジネス本部のKさんによる【Tableau】の連載は、学習やコミュニティの形成のお話でしたが、同部署のOさんは、技術的な内容でブログに参戦!Tableauは開発者向けのツールが提供されていますが、そのひとつを使ってWebアプリへの組み込みに挑戦しました。それではOさんどうぞ。

はじめに

こんにちは。Oです。

Tableau というと、Tableau Desktop や Tableau Server で、 直接ダッシュボードを見るイメージが強いかなと思うのですが(私はそう思っていました)、 アプリケーションに組み込んで表示する方法もあるよ!ということを共有できたらなと思います。

※ライセンスについては別途検討が必要なので、あくまで技術的にできることの紹介です。

やりたいこと

JavaScript(React)で構成されたフロントエンドアプリケーションに、Tableauを埋め込みで描画します。

イメージ図はこんな感じ。 アプリケーションの中にあるよ感を出したかっただけなので、ヘッダーやメニューバーは雰囲気です。

f:id:intage-tech:20210208093446p:plain

使うもの

Tableau Javascript API

公式: Tableau Javascript API Reference

Webアプリに組み込むために、JS API を使用します。

Tableau からは、他にも開発者向けのツールが提供されているようです。 Data Connector でデータ取得したり、自前のサービスから hyper ファイルを出力する機能なんかもあるのですね。便利!
参考)Tableauが提供するAPI一覧(リンク先の "Developer Resources")

tableau-api-js(npmライブラリ)

参考:https://www.npmjs.com/package/tableau-api-js

Tableau Javascript API を node で使えるようにしたライブラリが出ていたので、こちらを使いました。 便利なものは使っていきましょう。

さっそく、ダッシュボードを描画する

tableau-api-js に記載されていたやり方でできました。思っていたよりかんたん!
(ダッシュボードは Tableau Public からお借りしました。)(メニューバーなんて幻想だった。)

f:id:intage-tech:20210204114918p:plain

「表示」ボタンを押すと、initViz 関数が動いて、Tableau を divタグ部分(id=vizContainer)に埋め込んでいます。

Sample Component:

import * as React from 'react';
const Tableau = require('tableau-api-js');
// Component
import { Paper, Button } from '@material-ui/core';
  
// Props
interface Props {
}
  
// Component
const TableauViewPage = (props: Props) => {
  
    const initViz = () => {
        // Tableauを埋め込む要素を取得
        const containerDiv:any = document.getElementById('vizContainer');
        // URL
        const vizUrl = 'https://public.tableau.com/shared/W2Y96S62M';   // TableauPublic からお借りしました
        // 描画オプション生成
        const options = {
            width: containerDiv.offsetWidth,
            height: 700,
        };
        // Tableau呼び出し
        new Tableau.Viz(containerDiv, vizUrl, options);
    };
  
    return (
        <main>
            <Paper>
                <Button onClick={initViz}>表示</Button>       // ボタンをクリックすると、initViz関数が呼ばれる
                <div id="vizContainer" />                 // 埋め込み先
            </Paper>
        </main>
    );
};
  
export default TableauViewPage;

描画オプションを見てみる

ソースコードをよく見ると、options の中で widthとheight を渡して、描画するサイズを指定しているようですね。 他にもオプションがありそうなので調べます。 f:id:intage-tech:20210204130641p:plain

やばい。あっちもこっちも英語だわ。

ワタシ、ニホンジンネ。ニホンゴ、ドコヨ。

公式ドキュメントは英語だけでした。かなしい。

Google 先生で検索しても、出てくる情報はほとんど英語か、自動翻訳された不思議な日本語ばかり。 でもたまに Classmethod で記事になっていることがあるので、希望を捨ててはいけません。

頑張って読む。

Viz Classes - VizCreateOptions Record

ちゃんと書いてありました! ツールバー・タブの表示制御もできるみたいです。

onFirstInteractive(e)
おん・ふぁーすと・いんたらくてぃぶ ってなんだろう。 調べてみると、なかなか便利そうです。

簡単に言うと、Tableau内 の操作をアプリケーション側で検知することができるとのこと。 "みんな大好きクラメソさん" にも記事になっていました。ありがたい。

Tableau内の操作というのは、フィルター条件を変更したり、項目を選択したり、です。 JS API で定義されたイベント(Viz Event Classes - TableauEventName)を検知して、自分で定義した関数を呼び出せます。

例えば、「ユーザーがどの項目を操作したのか知りたい」、なんてときに使えそうです。

試しに以下のイベントを検知してみます。

 ・フィルターを変更(FILTER_CHANGE)
 ・オブジェクトを選択(MARKS_SELECTION)

onFirstInteractive() 内で、イベントリスナーをセットして、イベントを検知したらそれぞれログを出力するようなプログラムを作ります。

f:id:intage-tech:20210204131023p:plain

実際に動かしたら、ちゃんとログが出力されました!わーい。

「フィルターが変更されました」が17回出力されているのは、 つまりフィルター1メモリごとに FILTER_CHANGE イベントが検知されているということなのですね。なるほど。

おわり

目的は達成できた、しかし

ここまで試して、そもそもTableau 用語が分からないと気が付きました。 そういえば私、Tableau触るのいつぶりだっけ。

・Viz
・Workbook
・Sheet
・Dashboard
・Worksheet
・Story

Workbook や Dashboard は分かる。 Sheet と Worksheet の違いはなんだ...?

API はクラスごとに取れる情報が違うみたいなので、 使いこなすためにちゃんと理解する必要がありそうですね!