top of page

Tableau実践問題集 #TableauChallenge を作りました。

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://public.tableau.com/app/discover


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

例:自分のTableau Public


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の情報を抜き出すことができます。


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]

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

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


詳細は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でお願いします。それでは。

bottom of page