🔖

Tableauファイル内の計算式をGoogleスプレッドシートにまとめる - Tableau Metadata API + GAS の使い方

2022/12/12に公開

はじめに

Tableau歴10年、そろそろ11年目になろうとしています。
ここにきて、ようやくアウトプットに力を入れようと、Tableauのブログを始めることにしました。
そのスタートとして、Tableauのアドベントカレンダー2022に参加します。13日目のエントリーとなります。

https://adventar.org/calendars/7648

ネタはまあ、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を持っていないよ、という方は開発環境があるのでそちらを使うこともできるかと思います。ちょうど前日のアドベントカレンダーにご紹介があったので、リンク張らせていただきます。
https://note.com/tableau_kun/n/n7dc91473d605

Tableau Serverの方は、別途サーバーの設定で有効にしておく必要があります。
https://help.tableau.com/current/server/en-us/cli_maintenance_tsm.htm#tsm-maintenance-metadataservices-enable

Tableau Metadata APIとは

Metadata APIに関する説明はこちらにあります。
https://www.tableau.com/ja-jp/developer/tools/metadata-api

GraphQLと呼ばれるAPI用のクエリ使って、指定した書き方で問い合わせをすると、結果を表示させることができます。
ブラウザで利用することができるので、まずはその使い方から。

通常、TableauCloudにアクセスすると、以下のURLになっています。

https://<TableauCloudのドメイン部分>/#/site/<site名>/home

この、ドメイン部分に対して、以下のように記載してアクセスします。

https://<TableauCloudのドメイン部分>/metadata/graphiql/

たとえば、左側に以下のクエリを書くと、右側に結果が表示されます。

query{ 
  workbooks { 
    name 
    site { 
      name 
    }
    projectName
    
    owner { 
      name 
    } 
  }
}

どのようなデータが取得できるかは、APIのリファレンスに記載があります。かなり難解で、読み解くのに苦労しました。まだ全容はつかめていません。
https://help.tableau.com/current/api/metadata_api/en-us/reference/index.html

GASからTableauにサインインする

GASからmetadataAPIを呼び出すためには、その実行前にGASからTableauCloudにサイインインしておく必要があります。

サインインする時にはREST APIを利用するのですが、その時の認証として、Tableauの個人アカウントから「個人用アクセストークン」を作成しておく必要があります。(作成方法は後述します)

個人用アクセストークンについてはこちら
https://help.tableau.com/current/online/ja-jp/security_personal_access_tokens.htm#トークンの作成

GASからのTableauへのサインインとサインアウトは以下の通りです。APIのバージョンはTableau Cloudのバージョンに応じて変更することになるかと思います。

サインイン
https://github.com/oqbn/tableau-metadata-api/blob/main/sample/main.gs#L132-L168

サインアウト
https://github.com/oqbn/tableau-metadata-api/blob/main/sample/main.gs#L171-L197

GraphQLの内容

今回、呼び出したGraphQLの全文は以下に置いています。
https://github.com/oqbn/tableau-metadata-api/blob/main/sample/graphql.html#L1

そのまま、GraphQLのURLで実行しても大丈夫ですが、Tableauファイル名を変数で指定できるようにしているので、左下のエリアに変数を書いておく必要があります。

{ "workbookName": "スーパーストア" }

ダッシュボードとシートの一覧

GraphQLからは、Tableauのシートで表現されているものはviewとして一覧を取得できます。
https://github.com/oqbn/tableau-metadata-api/blob/main/sample/graphql.html#L7-L11

そこからsheetの場合の情報
https://github.com/oqbn/tableau-metadata-api/blob/main/sample/graphql.html#L13-L17

dashboardの場合の情報、それぞれを取得しています。
https://github.com/oqbn/tableau-metadata-api/blob/main/sample/graphql.html#L19-L23

データソースと計算式の一覧

データソースは、Publish済データソースとデータベースとで持っている情報が異なるようです。おそらくこちらで両方とも取得できているはずです。
https://github.com/oqbn/tableau-metadata-api/blob/main/sample/graphql.html#L26-L27

フィールドも普通のカラムの場合、
https://github.com/oqbn/tableau-metadata-api/blob/main/sample/graphql.html#L33-L36

計算式の場合、で指定が異なります。
https://github.com/oqbn/tableau-metadata-api/blob/main/sample/graphql.html#L37-L41

さらに、どこの計算式で使われているか
https://github.com/oqbn/tableau-metadata-api/blob/main/sample/graphql.html#L42-L44

どのシートで使われているか、も取得しています。
https://github.com/oqbn/tableau-metadata-api/blob/main/sample/graphql.html#L45-L47

GASからMetadata APIを呼び出す

今回、このGraphQLはGASプロジェクト上の別ファイル(HTML)にしておいて、GASからテキストとして読み込んで実行しています。GraphQLの保管場所はGoogleドライブを使ってもよかったかもしれません。

GASから呼び出す場合のURLはブラウザからアクセスするURLと異なるので注意が必要です。
https://github.com/oqbn/tableau-metadata-api/blob/main/sample/main.gs#L26-L47

結果を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の内容を貼り付けます。ここのファイル名は何にしていても大丈夫です。

https://github.com/oqbn/tableau-metadata-api/blob/main/sample/main.gs

次に、ファイルの「+」記号から「HTML」ファイルを追加します。

名前を「graphql」とし、同じく右側の中身をすべて消してgithubのgraphql.htmlの内容を貼り付けます。こちらはGASからファイル名をそのまま指定しているので別の名前にする場合はソースコードも書き直す必要があります。

https://github.com/oqbn/tableau-metadata-api/blob/main/sample/graphql.html

実行する

Apps Scriptの実行ボタンを押してください。

初回は「承認が必要です」とでます。

ログインしているGoogleアカウントを選択後、以下の画面が出た場合は、「詳細」をクリックして

安全ではないページに移動、をクリックすると、いつものアクセスのリクエスト画面が表示されるので、「許可」を押してください。

2回目からは大丈夫です。

実行後、シートが2枚作成されます。
必要に応じてフォーマットなどを整えると見やすいかと思います。

エラーが出る!とか、特定の条件で情報が全部とれない!とかいろいろあるかもしれません。
動作保証や利用によって生じた不具合等の責任は一切負いかねますので、ご了承ください。

まとめ

認証のところさえ通してしまえば、あとはMetadataAPIに渡すGraphQLのクエリ文字列を変更して、データを自由自在に取り出すことが可能です。

GraphQLのクエリ文字列はまだまだ研究の余地があると思いますので、新たな発見があればまた共有したいと思います。

長い文章にお付き合いいただきありがとうございました。

Discussion