Tableauファイル内の計算式をGoogleスプレッドシートにまとめる - Tableau Metadata API + GAS の使い方
はじめに
Tableau歴10年、そろそろ11年目になろうとしています。
ここにきて、ようやくアウトプットに力を入れようと、Tableauのブログを始めることにしました。
そのスタートとして、Tableauのアドベントカレンダー2022に参加します。13日目のエントリーとなります。
ネタはまあ、10年もやっていると、いろいろあります。
が、アドベントカレンダーでは他の方もいらっしゃるので、かぶってもいけないと思い、マニアックなネタに全振りしてみました。
初心者向けのネタでは全くありませんが、みなさん困っていることかと思いますので、コピーして使ってもらえたらと思います。
やりたいこと
Tableauの計算式って1個1個確認するの、めんどくさくないですか?
Tableauの計算式を一覧表にまとめたい! というところから、今回のツールを作っています。
同じようなものとしては、truestarさんがエクセルのマクロでのツールを作っていらっしゃるかと思います。
今回はGoogleスプレッドシートを使い、Google Apps Script(GAS)からTableau Metadata APIを使ってTableauCloudに問い合わせをして作成してみようと思います。
Metadata APIを使うことから、その計算式がどのシートで使われているか、の依存関係も表示できるようにしてみました。「この計算式ってどこで使われているんだっけ?」とか「ここの計算式を直したら、あちらのシートの数字が!」とかの解決につながれば幸いです。
作っているうちにワークブック内のViz一覧もほしくなったので、あわせてそちらも作成しています。
細かい説明はよいので使い方だけ知りたい、という方は、途中を飛ばしていただければと思います。
使用する環境
- Tableau Cloud (記載時のバージョンは 2022.3.0)
- Tableau REST API (3.17)
- Google Apps Script
- Googleスプレッドシート
Tableau Cloudを持っていないよ、という方は開発環境があるのでそちらを使うこともできるかと思います。ちょうど前日のアドベントカレンダーにご紹介があったので、リンク張らせていただきます。
Tableau Serverの方は、別途サーバーの設定で有効にしておく必要があります。
Tableau Metadata APIとは
Metadata APIに関する説明はこちらにあります。
GraphQLと呼ばれるAPI用のクエリ使って、指定した書き方で問い合わせをすると、結果を表示させることができます。
ブラウザで利用することができるので、まずはその使い方から。
通常、TableauCloudにアクセスすると、以下のURLになっています。
https://<TableauCloudのドメイン部分>/#/site/<site名>/home
この、ドメイン部分に対して、以下のように記載してアクセスします。
https://<TableauCloudのドメイン部分>/metadata/graphiql/
たとえば、左側に以下のクエリを書くと、右側に結果が表示されます。
query{
workbooks {
name
site {
name
}
projectName
owner {
name
}
}
}
どのようなデータが取得できるかは、APIのリファレンスに記載があります。かなり難解で、読み解くのに苦労しました。まだ全容はつかめていません。
GASからTableauにサインインする
GASからmetadataAPIを呼び出すためには、その実行前にGASからTableauCloudにサイインインしておく必要があります。
サインインする時にはREST APIを利用するのですが、その時の認証として、Tableauの個人アカウントから「個人用アクセストークン」を作成しておく必要があります。(作成方法は後述します)
個人用アクセストークンについてはこちら
GASからのTableauへのサインインとサインアウトは以下の通りです。APIのバージョンはTableau Cloudのバージョンに応じて変更することになるかと思います。
サインイン
サインアウト
GraphQLの内容
今回、呼び出したGraphQLの全文は以下に置いています。
そのまま、GraphQLのURLで実行しても大丈夫ですが、Tableauファイル名を変数で指定できるようにしているので、左下のエリアに変数を書いておく必要があります。
{ "workbookName": "スーパーストア" }
ダッシュボードとシートの一覧
GraphQLからは、Tableauのシートで表現されているものはviewとして一覧を取得できます。
そこからsheetの場合の情報
dashboardの場合の情報、それぞれを取得しています。
データソースと計算式の一覧
データソースは、Publish済データソースとデータベースとで持っている情報が異なるようです。おそらくこちらで両方とも取得できているはずです。
フィールドも普通のカラムの場合、
計算式の場合、で指定が異なります。
さらに、どこの計算式で使われているか
どのシートで使われているか、も取得しています。
GASからMetadata APIを呼び出す
今回、このGraphQLはGASプロジェクト上の別ファイル(HTML)にしておいて、GASからテキストとして読み込んで実行しています。GraphQLの保管場所はGoogleドライブを使ってもよかったかもしれません。
GASから呼び出す場合のURLはブラウザからアクセスするURLと異なるので注意が必要です。
結果をGoogleスプレッドシートに書き出す
GraphQLのクエリ結果はJSON形式で返ってきますので、あとはそこをうまく読み取って、Googleスプレッドシートへ転記していきます。
細かい書き方はGitHubの方を見ていただくとして、実際に実行した結果はこんな感じです。(設定と使い方は次章参照)
おなじみ「サンプルスーパーストア」をPublishして、情報を取得してみました。
なお、表の書式(枠線、タイトルの色、幅の調整)はあとから手動設定です。
ビュー一覧(ダッシュボードとシートの依存関係の把握)
Indexがゼロになっているのはシートを非表示にしているもので、Indexの順番はシートの並び順を示していると思われます。
パスも取れたので、そのまま表示できるリンクも作ってみました。たぶん便利なのではないかと思います。
シートの場合は、利用されているダッシュボードを、ダッシュボードの場合は中で使用しているシートを表示するようにしてみました。
「このシート、どこで使っているの?」問題の解決になるかと思います。
フィールド一覧(計算式と利用されているシートの把握)
フィールドに関する一覧表です。デフォルトの書式設定も取得してみましたが、若干書式がハテナ?です。
どの計算式でどのカラム値が使用されているかや、利用されているシートを一覧で表示しています。
「この項目変えて大丈夫?」問題の防止になるかと思います。
設定方法と使い方
ソースコードはGitHubに置かせていただきましたので、コピーすれば使えるかと思います。設定方法と使い方は以下のとおりです。
Googleスプレッドシートに「設定」シートを作成
Googleスプレッドシートに「設定」という名前のシートを作成してください。GASからシート名をそのまま指定しているので別の名前にする場合はソースコードも書き直す必要があります。
シートに次の5つの項目の値を記載してください。B列しか見ていないので、A列は適当な名称でもかまいません。ワークブック名はPublishしているものでお願いします。エラー処理をちゃんといれていないので、ないものを指定すると実行エラーになります。
- Tableauドメイン
- サイト名
- 個人トークン名
- 個人トークンシークレット
- ワークブック名
個人用アクセストークンの取得
TableauCloudの右上のユーザーアイコンから「マイアカウントの設定」をクリックします。
「設定」タブの真ん中あたりに「個人用アクセストークン」の場所があるので、トークン名を入力してから「新しいトークンの作成」をクリックします。
トークン名とトークンシークレットの両方が必要です。コピーしてシートへ転記します。
なお、トークンシークレットは一度しか表示されないので、もしコピーを忘れた場合は再作成となります。
必要なファイルをコピー
Googleスプレッドシートのメニューの「拡張機能」から「Apps Script」を起動します。
必要なファイルは2つです。
- main.gs
- graphql.html
ファイルの「コード.gs」の右側のコードを削除して、githubのmain.gsの内容を貼り付けます。ここのファイル名は何にしていても大丈夫です。
次に、ファイルの「+」記号から「HTML」ファイルを追加します。
名前を「graphql」とし、同じく右側の中身をすべて消してgithubのgraphql.htmlの内容を貼り付けます。こちらはGASからファイル名をそのまま指定しているので別の名前にする場合はソースコードも書き直す必要があります。
実行する
Apps Scriptの実行ボタンを押してください。
初回は「承認が必要です」とでます。
ログインしているGoogleアカウントを選択後、以下の画面が出た場合は、「詳細」をクリックして
安全ではないページに移動、をクリックすると、いつものアクセスのリクエスト画面が表示されるので、「許可」を押してください。
2回目からは大丈夫です。
実行後、シートが2枚作成されます。
必要に応じてフォーマットなどを整えると見やすいかと思います。
エラーが出る!とか、特定の条件で情報が全部とれない!とかいろいろあるかもしれません。
動作保証や利用によって生じた不具合等の責任は一切負いかねますので、ご了承ください。
まとめ
認証のところさえ通してしまえば、あとはMetadataAPIに渡すGraphQLのクエリ文字列を変更して、データを自由自在に取り出すことが可能です。
GraphQLのクエリ文字列はまだまだ研究の余地があると思いますので、新たな発見があればまた共有したいと思います。
長い文章にお付き合いいただきありがとうございました。
Discussion