2023年2月22日

Tableau Public APIを使ってTableau Portfolio Vizをつくる

最終更新: 2023/02/22
 
将来的なTableau Public APIの仕様変更により、本記事で実装されている内容が動作しない場合があります。ご注意ください。
 

 
参考資料
 
https://github.com/wjsutton/tableau_public_api
 
https://www.dataplusscience.com/TableauPublicAPI.html
 
https://www.flerlagetwins.com/2021/04/tableau-public-api.html
 
https://www2.kobe-u.ac.jp/~tnishida/programming/GAS-01.html
 

 
本記事で作成するViz
 
Tableau Public Portfolio by Category

Tableau Publicを皆さんお使いでしょうか。

Tableau Publicは、端的に言えばTableau作品を公開し共有するための無料プラットフォームです。

Tableau Publicの説明: https://www.tableau.com/ja-jp/community/public

Tableau Publicホーム: https://public.tableau.com/app/discover

もちろん世界中のTableauユーザーの作品から学ぶこと、着想を得ることもできますし、自分の作品を公開して、自分のTableauポートフォリオを作成することもできます。

例:自分のTableau Public

https://public.tableau.com/app/profile/yoshitaka6076

https://public.tableau.com/app/profile/yoshiwow

Tableau Publicの個人ページでは、更新日順で自分の作品が並びます。

例えば以下は自分のWorkout Wednesdayアカウントですが、新しく更新(Publish)された順に上から並んでいます。

少ないうちは良いのですが、公開作品が増えてくると、特に自分の代表作のような「評価された作品」が埋もれていきます。

また作品投稿を続けていくと「よく見られた作品は何だろうか」と気になるかもしれません。

Tableau Publicのページ上では作品数やフォロワー数は出ますが、閲覧数や自分の作品に付けられた「お気に入り」の総数は分かりません。

上記の問題を解決するために、本記事では以下について解説します。

  • Tableau Public APIについて

  • Google Apps Script(GAS)を使用し、Google SheetにTableau Public APIデータを格納する方法

  • 上記のGASをスケジュール実行する方法

  • Tableau Public APIデータを使用したViz作成


Tableau Public APIについて

詳細は参考資料にありますので、概要だけ。

以下のようなAPIコールから、Tableau Publicの情報を抜き出すことができます。

https://public.tableau.com/public/apis/workbooks?profileName=yoshitaka6076&start=0&count=1&visibility=NON_HIDDEN

URL中の「?」以降で、取得する情報を制御します。

  • profileName: 情報取得するTableau Public ID

  • start: 何個目のWorkbookから情報を取得するか(0から開始)

  • count: Startから数えて何個のWorkbookから情報を取得するか

  • visibility: 隠されたWorkbookを情報取得の対象に含めるか(後述)

このAPIコールにより、yoshitaka6076アカウントの、一番最初に掲載されているWorkbookの情報が、以下のような文字列の形で取得できます。

{"current":0,"next":1,"contents":[{"workbookRepoUrl":"TableauPublicPortfolio","title":"Tableau Public Portfolio by Category","defaultViewName":"Portfolio","viewCount":1390,"numberOfFavorites":9,"authorProfileName":"yoshitaka6076","defaultViewRepoUrl":"TableauPublicPortfolio/sheets/Portfolio"}]}

この文字列の中身を見てみると、例えば以下の情報が分かります。

  • タイトル:"title":"Tableau Public Portfolio by Category"

  • 閲覧数:"viewCount":1390

  • お気に入り数:"numberOfFavorites":9

要は上記のようなAPIコールから返ってくる文字列情報を処理することにより、Tableau Publicに関するデータを得ることが出来ます。

ちなみに自分のTableau Public IDは、例えばマイプロフィールを開いた際のURLから確認できます。
 
以下は筆者のプロフィールID確認方法です。

https://public.tableau.com/app/profile/yoshitaka6076

Tableau Public APIは他にも指定されたアカウントのプロフィールやフォロワー情報などを取得できますが、本記事ではWorkbookについて扱います。

どのような情報が取得できるかは参考資料をご覧ください。


Google Apps Scriptについて

Tableau Public APIを使用してTableau Publicのデータを取得できることが分かりました。

次にこのデータを何らかの形で格納したいとします。

PythonやRなどを使用しつつ、何らかのデータベースを用意して、そちらに格納する方法も良いのですが、本記事では個人レベルで可能な方法を紹介します。

使用するものはGoogle Sheetです。

ちなみにGoogle Sheetを今回採用した意図として、Tableau PublicにはGoogle Driveコネクタがありますので、Google Sheetでデータ作成しておけば、Tableau Publicでもデータが自動更新されるVizを作成することができます。

サンプルシート: Tableau Public API Data

お手元で新規Google Sheetを作成し、1行目にヘッダーを作成します。

サンプルシートを参照ください。

その後、拡張機能からApps Scriptを選択します。

上記のような画面が出てきます。

出てきた画面の中に、以下をコピペしてください。

ただし以下2点のみ情報の記入をお願いします。

  • 冒頭の「username_array」には自分のTableau Public IDを記入する

  • 末尾の「sheet」には、データを格納したいGoogle Sheetのシート名を入れる

function GetTableauPublicData() {
 
// Initial Settings
 
// ================
 

 
var options = {
 
method: "GET"
 
};
 
var username_array = ["(Tableau Publicアカウント)"];
 
var today = Utilities.formatDate(new Date(), 'Asia/Tokyo', 'yyyy/MM/dd');
 
var count = 50;
 

 
// Get Workbook Counts and start position array
 
// ============================================
 

 
var url_profile_base = "https://public.tableau.com/profile/api/"
 
var url_profile_array = [];
 

 
for(i=0; i<username_array.length; i++){
 
url_profile_array.push(url_profile_base + username_array[i]);
 
}
 

 
var start_array = [];
 
for(i=0; i<url_profile_array.length; i++){
 
var responseApi_profile = UrlFetchApp.fetch(url_profile_array[i],options);
 
var workbook_count = JSON.parse(responseApi_profile)['visibleWorkbookCount'];
 
var loop_count = Math.ceil(workbook_count/count);
 
start_array[i] = [...Array(loop_count).keys()];
 

 
for(j=0; j<start_array[i].length; j++){
 
start_array[i][j] = start_array[i][j] * count;
 
}
 
}
 

 
// Get Workbook API Call URLs
 
// ==========================
 

 
var url_workbook_array = [];
 
var url_workbook_base = "https://public.tableau.com/public/apis/workbooks?profileName="
 

 
for(i=0; i<username_array.length; i++){
 
for(j=0; j<start_array[i].length; j++){
 

 
url_workbook_array.push(
 
url_workbook_base + username_array[i]
 
+ "&start=" + String(start_array[i][j])
 
+ "&count=" + String(count)
 
+ "&visibility=NON_HIDDEN"
 
);
 
}
 
}
 

 
// Get Workbook Detail Data
 
// ==========================
 

 
var stats = [];
 
for(i=0;i<url_workbook_array.length;i++){
 
var responseApi_workbook = UrlFetchApp.fetch(url_workbook_array[i],options);
 
var workbook_array = JSON.parse(responseApi_workbook)['contents'];
 

 
for(j=0;j<workbook_array.length;j++){
 
stats.push([
 
today
 
, workbook_array[j].authorProfileName
 
, workbook_array[j].workbookRepoUrl
 
, workbook_array[j].defaultViewName
 
, workbook_array[j].title
 
, workbook_array[j].viewCount
 
, workbook_array[j].numberOfFavorites
 
]);
 
}
 
}
 

 
// Populate Data to GSheet
 
// ==========================
 

 
// set output sheet
 
// ================
 
var sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("(情報を格納するシート名)");
 

 
// clean current data
 
// ===================
 
var LastRow = sheet.getDataRange().getValues().length;
 
sheet.getRange(2, 1, LastRow, stats[0].length).clearContent();
 

 
// Place the new data
 
// ==================
 
sheet.getRange(2, 1, stats.length, stats[0].length).setValues(stats);
 

 
}
 

上記のスクリプトでは、指定されたTablaeu Public IDユーザーのWorkbook情報を取得しています。

項目としては以下を取得しています。

  • authorProfileName:Tableau Public ID

  • workbookRepoUrl:Workbook URLの一部

  • defaultViewName:Workbook表示時に開くシートURL

  • title:Workbookのタイトル

  • showInProfile:Workbookの非表示設定(後述)
     
    (2023年2月以降、項目として取得できなくなりました)

  • viewCount:閲覧数

  • numberOfFavorites:お気に入り数

その後、実行または保存ボタンをクリックください。

初回実行のみ実行承認が必要ですので、以下ハイライト部をクリックし承認をしてください。

こちらに詳細ありますので、ご興味あればご参照ください。

実行後、下図のようにGoogle Sheetにデータが格納されます。

ということで、Tableau Publicのデータ取得が出来るようになりました。


スケジュール実行について

上記でデータ取得のスクリプトが用意できました。

こちらを日次で実行されるようにスケジュール設定しましょう。

最初にプロジェクトの名前だけ変更しておきます。

画面上部の「無題のプロジェクト」をクリックします。

(必須ではないですが、分かりやすい方が良いですよね)

画面左のタイマーマークをクリックし、トリガー画面を開きます。

画面右下の「トリガーを追加」をクリックします。

ここでは毎日0時に実行されるように設定します。

これでデータ取得の自動化が完了しました。


Tableau Public APIデータを可視化する

やっと本題に来ました。

Tableau DesktopまたはTableau Publicを起動し、先ほど作成したデータに接続します。

Tableau Publicでは抽出を作成する必要がありますが、このとき抽出フィルターをひとつ設定します。

(2023年2月以降、showInProfile項目は取得不可となりましたので、こちらの抽出フィルターの設定は不要です)

showInProfileカラムについて説明します。

Tableau Publicでは自分の作品を非表示にする機能があります。

設定方法は以下いずれかです。

非表示設定についての項目がshowInProfileカラムです。

非表示にしているVizに関しては、情報を公開したくない場合が多いと思いますので、上記の抽出フィルター設定を手順に含めました。

注意
 
Tableau Publicで非表示にしたとしても、アクセス自体は可能なままです。
 
Tableau Public APIなどでURL等が第三者に伝わった場合、非表示Vizについても閲覧される可能性があることはご留意ください。
 
特に”Allow Access”をオンにしている場合、Workbook自体もダウンロード可能です。
 

 
もし第三者に見られて困る作品がTableau Publicにある場合はお気を付けください。
 

取り込まれたデータをTableauで見てみましょう。

Workbookの基礎的な情報は取得できています。

強いて言えば、WorkbookのURLがあれば、URL Actionを使用して簡単にWorkbookを表示できそうです。

そのために以下の計算フィールドを作成します。

URL
 
'https://public.tableau.com/app/profile/'
 
+ [authorProfileName]
 
+ '/viz/'
 
+ [workbookRepoUrl]
 
+ '/' + [defaultViewName]

これで可視化のための基本的な情報は揃いました。

項目も簡単なので、ここでは自分の利用例を紹介します。

Tableau Public Portfolio by Category

詳細はWorkbookの中身を見て頂くとして、以下のように「よく見られている、お気に入りを頂いているViz」が何か簡単に分かるようにし、また特定の作品を探すための検索ボックスも作成しています。

上記のようにTableau Publicのポートフォリオを作成することがTableau Public APIのデータを用いて可能です。

最後にパブリッシュ時にGoogle Driveの認証情報を埋め込み、またデータ更新を許可しておきましょう。

実行時間はTableau Public側で勝手に設定されるので、こちら側で設定できませんが、日次でデータ更新が実施されます。

データ更新の実行時間について、Tableau PublicのWorkbook個別ページの最下部に記載があります。

この時間に合わせて、先ほどのスクリプト実行スケジュールを設定する必要があるにはありますが、どこまで厳密に実施したいかによりますので、お好みでどうぞ。

またTableau Publicは1つだけVizをプロフィールトップに固定することが可能です。

自分は上記Vizを固定表示させています。

ということで、Google Apps ScriptとGoogle Driveコネクタを使用し、Tableau Publicのデータを自動取得&自動更新させたVizを作ることができました。


最後に

今回はTableau Public APIを利用し、Tableau Publicポートフォリオを作成する方法について解説しました。

Tableau Publicと相性がいいのでGoogle SheetおよびGoogle Apps Scriptを使用しましたが、特にGoogle Apps Scriptは色々と面白いことができますので、Tableauと合わせて学習してみても良いかもしれません。

今回の内容は、特にTabelau Publicで積極的に作品投稿をしている方にオススメです。

ぜひTabelau Public Portfolio作ってみてください。

質問などありましたらTwitterかLinkedinでお願いします。それでは。